[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] struct Vertex { public Vector3 BeginPos; public Vector3 EndPos; public Vector4 Adjuster; public Color Color; public Vector3 Normal0; public Vector4 Normal1; } publicstatic VertexAttributeDescriptor[] Layout = new[]{ new VertexAttributeDescriptor(VertexAttribute.Position, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.TexCoord0, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.TexCoord1, VertexAttributeFormat.Float32, 4), new VertexAttributeDescriptor(VertexAttribute.TexCoord2, VertexAttributeFormat.Float32, 4), new VertexAttributeDescriptor(VertexAttribute.Normal, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.Tangent, VertexAttributeFormat.Float32, 4), };
Asset としての Mesh をいじる場合は、シリアライズしたりする必要もあって、従来の API を使うべきなのでは?と思ったのだ。マニュアルにそうしろとは書いてなかったが(伏線)。
飯食って、そろそろ寝るかと落ち着いた時に、「まさか」と思って試したらうまくいったのが次のコード。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] struct Vertex { public Vector3 BeginPos; public Vector3 Normal0; public Vector4 Normal1; public Vector3 EndPos; public Vector4 Adjuster; public Color Color; } publicstatic VertexAttributeDescriptor[] Layout = new[]{ new VertexAttributeDescriptor(VertexAttribute.Position, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.Normal, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.Tangent, VertexAttributeFormat.Float32, 4), new VertexAttributeDescriptor(VertexAttribute.TexCoord0, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.TexCoord1, VertexAttributeFormat.Float32, 4), new VertexAttributeDescriptor(VertexAttribute.TexCoord2, VertexAttributeFormat.Float32, 4), };
voidloop(){ if (!arduboy.nextFrame()) return; if (arduboy.pressed(UP_BUTTON)) { y -= 1; } if (arduboy.pressed(DOWN_BUTTON)) { y += 1; } if (arduboy.pressed(LEFT_BUTTON)) { x -= 1; } if (arduboy.pressed(RIGHT_BUTTON)) { x += 1; } arduboy.clear(); arduboy.fillRect(x-8, y-4, 16, 8, 1); // X座標を用意した変数に置き換える arduboy.display(); }