Move cube mesh creation to Mesh static method - #183

This commit is contained in:
Vadim Lopatin 2016-03-10 14:20:53 +03:00
parent 5107982579
commit 9661eb12dd
2 changed files with 36 additions and 50 deletions

View File

@ -99,56 +99,7 @@ class UiWidget : VerticalLayout {
_scene.activeCamera = _cam;
VertexFormat vfmt = VertexFormat(VertexElementType.POSITION, VertexElementType.COLOR, VertexElementType.TEXCOORD0);
_mesh = new Mesh(vfmt);
// square
float x0 = 0;
float y0 = 0;
float z0 = -0.9;
addCube(x0, y0, z0, 1);
//_mesh.addVertex([x0-1,y0-1,z0+0, 1,0,1,1, 0,0]);
//_mesh.addVertex([x0-1,y0+1,z0+0, 1,1,1,1, 1,0]);
//_mesh.addVertex([x0+1,y0+1,z0+0, 0,1,1,1, 1,1]);
//_mesh.addVertex([x0+1,y0-1,z0+0, 1,1,0,1, 0,1]);
//_mesh.addPart(PrimitiveType.triangles, [0, 1, 2, 2, 3, 0]);
}
void addCube(float x0, float y0, float z0, float d) {
auto p000 = [x0-d, y0-d, z0-d];
auto p100 = [x0+d, y0-d, z0-d];
auto p010 = [x0-d, y0+d, z0-d];
auto p110 = [x0+d, y0+d, z0-d];
auto p001 = [x0-d, y0-d, z0+d];
auto p101 = [x0+d, y0-d, z0+d];
auto p011 = [x0-d, y0+d, z0+d];
auto p111 = [x0+d, y0+d, z0+d];
addQuad(p000 ~ p010 ~ p110 ~ p100); // front face
addQuad(p101 ~ p111 ~ p011 ~ p001); // back face
addQuad(p100 ~ p110 ~ p111 ~ p101); // right face
addQuad(p001 ~ p011 ~ p010 ~ p000); // left face
addQuad(p010 ~ p011 ~ p111 ~ p110); // top face
addQuad(p001 ~ p000 ~ p100 ~ p101); // bottom face
}
void addQuad(float[] vertexes) {
static float[] txcoords = [0, 0, 1, 0, 1, 1, 0, 1];
ushort startVertex = cast(ushort)_mesh.vertexCount;
for (int i = 0; i < 4; i++) {
_mesh.addVertex([
vertexes[i*3 + 0], vertexes[i*3 + 1], vertexes[i*3 + 2],
1,1,1,1,
txcoords[i*2 + 0], txcoords[i*2 + 1]]);
}
_mesh.addPart(PrimitiveType.triangles, [
cast(ushort)(startVertex + 0),
cast(ushort)(startVertex + 1),
cast(ushort)(startVertex + 2),
cast(ushort)(startVertex + 2),
cast(ushort)(startVertex + 3),
cast(ushort)(startVertex + 0)]);
_mesh = Mesh.createCubeMesh(vec3(0, 0, -0.9));
}
/// returns true is widget is being animated - need to call animate() and redraw

View File

@ -287,6 +287,41 @@ class Mesh {
_vertexBuffer = null;
}
}
private void addQuad(ref vec3 v0, ref vec3 v1, ref vec3 v2, ref vec3 v3, ref vec4 color) {
ushort startVertex = cast(ushort)vertexCount;
addVertex([v0.x, v0.y, v0.z, color.r, color.g, color.b, color.a, 0, 0]);
addVertex([v1.x, v1.y, v1.z, color.r, color.g, color.b, color.a, 1, 0]);
addVertex([v2.x, v2.y, v2.z, color.r, color.g, color.b, color.a, 1, 1]);
addVertex([v3.x, v3.y, v3.z, color.r, color.g, color.b, color.a, 0, 1]);
addPart(PrimitiveType.triangles, [
cast(ushort)(startVertex + 0),
cast(ushort)(startVertex + 1),
cast(ushort)(startVertex + 2),
cast(ushort)(startVertex + 2),
cast(ushort)(startVertex + 3),
cast(ushort)(startVertex + 0)]);
}
static Mesh createCubeMesh(vec3 pos, float d=1, vec4 color = vec4(1,1,1,1)) {
Mesh mesh = new Mesh(VertexFormat(VertexElementType.POSITION, VertexElementType.COLOR, VertexElementType.TEXCOORD0));
auto p000 = vec3(pos.x-d, pos.y-d, pos.z-d);
auto p100 = vec3(pos.x+d, pos.y-d, pos.z-d);
auto p010 = vec3(pos.x-d, pos.y+d, pos.z-d);
auto p110 = vec3(pos.x+d, pos.y+d, pos.z-d);
auto p001 = vec3(pos.x-d, pos.y-d, pos.z+d);
auto p101 = vec3(pos.x+d, pos.y-d, pos.z+d);
auto p011 = vec3(pos.x-d, pos.y+d, pos.z+d);
auto p111 = vec3(pos.x+d, pos.y+d, pos.z+d);
mesh.addQuad(p000, p010, p110, p100, color); // front face
mesh.addQuad(p101, p111, p011, p001, color); // back face
mesh.addQuad(p100, p110, p111, p101, color); // right face
mesh.addQuad(p001, p011, p010, p000, color); // left face
mesh.addQuad(p010, p011, p111, p110, color); // top face
mesh.addQuad(p001, p000, p100, p101, color); // bottom face
return mesh;
}
}
/// Mesh part - set of vertex indexes with graphics primitive type