/** Build a patch shape. Requires GL_POINTS, GL_LINES or GL_TRIANGLES primitive type. */ public static void build (MeshPartBuilder builder, VertexInfo corner00, VertexInfo corner10, VertexInfo corner11, VertexInfo corner01, int divisionsU, int divisionsV) { if (divisionsU < 1 || divisionsV < 1) { throw new GdxRuntimeException("divisionsU and divisionV must be > 0, u,v: " + divisionsU + ", " + divisionsV); } builder.ensureVertices((divisionsV + 1) * (divisionsU + 1)); builder.ensureRectangleIndices(divisionsV * divisionsU); for (int u = 0; u <= divisionsU; u++) { final float alphaU = (float)u / (float)divisionsU; vertTmp5.set(corner00).lerp(corner10, alphaU); vertTmp6.set(corner01).lerp(corner11, alphaU); for (int v = 0; v <= divisionsV; v++) { final short idx = builder.vertex(vertTmp7.set(vertTmp5).lerp(vertTmp6, (float)v / (float)divisionsV)); if (u > 0 && v > 0) builder.rect((short)(idx - divisionsV - 2), (short)(idx - 1), idx, (short)(idx - divisionsV - 1)); } } }
/** Build a patch shape. Requires GL_POINTS, GL_LINES or GL_TRIANGLES primitive type. */ public static void build (MeshPartBuilder builder, VertexInfo corner00, VertexInfo corner10, VertexInfo corner11, VertexInfo corner01, int divisionsU, int divisionsV) { if (divisionsU < 1 || divisionsV < 1) { throw new GdxRuntimeException("divisionsU and divisionV must be > 0, u,v: " + divisionsU + ", " + divisionsV); } builder.ensureVertices((divisionsV + 1) * (divisionsU + 1)); builder.ensureRectangleIndices(divisionsV * divisionsU); for (int u = 0; u <= divisionsU; u++) { final float alphaU = (float)u / (float)divisionsU; vertTmp5.set(corner00).lerp(corner10, alphaU); vertTmp6.set(corner01).lerp(corner11, alphaU); for (int v = 0; v <= divisionsV; v++) { final short idx = builder.vertex(vertTmp7.set(vertTmp5).lerp(vertTmp6, (float)v / (float)divisionsV)); if (u > 0 && v > 0) builder.rect((short)(idx - divisionsV - 2), (short)(idx - 1), idx, (short)(idx - divisionsV - 1)); } } }
builder.index(i000, i001, i010, i011, i110, i111, i100, i101); } else if (primitiveType == GL20.GL_POINTS) { builder.ensureRectangleIndices(2); builder.rect(i000, i100, i110, i010); builder.rect(i101, i001, i011, i111); } else { // GL20.GL_TRIANGLES builder.ensureRectangleIndices(6); builder.rect(i000, i100, i110, i010); builder.rect(i101, i001, i011, i111);
builder.index(i000, i001, i010, i011, i110, i111, i100, i101); } else if (primitiveType == GL20.GL_POINTS) { builder.ensureRectangleIndices(2); builder.rect(i000, i100, i110, i010); builder.rect(i101, i001, i011, i111); } else { // GL20.GL_TRIANGLES builder.ensureRectangleIndices(6); builder.rect(i000, i100, i110, i010); builder.rect(i101, i001, i011, i111);
builder.ensureRectangleIndices(divisionsU); for (int iv = 0; iv <= divisionsV; iv++) { angleV = avo + stepV * iv;
builder.ensureRectangleIndices(divisionsU); for (int iv = 0; iv <= divisionsV; iv++) { angleV = avo + stepV * iv;
builder.ensureRectangleIndices(divisions); for (int i = 0; i <= divisions; i++) { angle = ao + step * i;
builder.ensureRectangleIndices(divisions); for (int i = 0; i <= divisions; i++) { angle = ao + step * i;
new Material("concrete")); part.ensureVertices(4 * 1600); part.ensureRectangleIndices(1600); for (float x = -200f; x < 200f; x += 10f) { for (float z = -200f; z < 200f; z += 10f) {
/** Add a box. Requires GL_POINTS, GL_LINES or GL_TRIANGLES primitive type. */ public static void build (MeshPartBuilder builder, Vector3 corner000, Vector3 corner010, Vector3 corner100, Vector3 corner110, Vector3 corner001, Vector3 corner011, Vector3 corner101, Vector3 corner111) { if ((builder.getAttributes().getMask() & (Usage.Normal | Usage.BiNormal | Usage.Tangent | Usage.TextureCoordinates)) == 0) { build(builder, vertTmp1.set(corner000, null, null, null), vertTmp2.set(corner010, null, null, null), vertTmp3.set(corner100, null, null, null), vertTmp4.set(corner110, null, null, null), vertTmp5.set(corner001, null, null, null), vertTmp6.set(corner011, null, null, null), vertTmp7.set(corner101, null, null, null), vertTmp8.set(corner111, null, null, null)); } else { builder.ensureVertices(24); builder.ensureRectangleIndices(6); Vector3 nor = tmpV1.set(corner000).lerp(corner110, 0.5f).sub(tmpV2.set(corner001).lerp(corner111, 0.5f)).nor(); builder.rect(corner000, corner010, corner110, corner100, nor); builder.rect(corner011, corner001, corner101, corner111, nor.scl(-1)); nor = tmpV1.set(corner000).lerp(corner101, 0.5f).sub(tmpV2.set(corner010).lerp(corner111, 0.5f)).nor(); builder.rect(corner001, corner000, corner100, corner101, nor); builder.rect(corner010, corner011, corner111, corner110, nor.scl(-1)); nor = tmpV1.set(corner000).lerp(corner011, 0.5f).sub(tmpV2.set(corner100).lerp(corner111, 0.5f)).nor(); builder.rect(corner001, corner011, corner010, corner000, nor); builder.rect(corner100, corner110, corner111, corner101, nor.scl(-1)); } }
/** Add a box. Requires GL_POINTS, GL_LINES or GL_TRIANGLES primitive type. */ public static void build (MeshPartBuilder builder, Vector3 corner000, Vector3 corner010, Vector3 corner100, Vector3 corner110, Vector3 corner001, Vector3 corner011, Vector3 corner101, Vector3 corner111) { if ((builder.getAttributes().getMask() & (Usage.Normal | Usage.BiNormal | Usage.Tangent | Usage.TextureCoordinates)) == 0) { build(builder, vertTmp1.set(corner000, null, null, null), vertTmp2.set(corner010, null, null, null), vertTmp3.set(corner100, null, null, null), vertTmp4.set(corner110, null, null, null), vertTmp5.set(corner001, null, null, null), vertTmp6.set(corner011, null, null, null), vertTmp7.set(corner101, null, null, null), vertTmp8.set(corner111, null, null, null)); } else { builder.ensureVertices(24); builder.ensureRectangleIndices(6); Vector3 nor = tmpV1.set(corner000).lerp(corner110, 0.5f).sub(tmpV2.set(corner001).lerp(corner111, 0.5f)).nor(); builder.rect(corner000, corner010, corner110, corner100, nor); builder.rect(corner011, corner001, corner101, corner111, nor.scl(-1)); nor = tmpV1.set(corner000).lerp(corner101, 0.5f).sub(tmpV2.set(corner010).lerp(corner111, 0.5f)).nor(); builder.rect(corner001, corner000, corner100, corner101, nor); builder.rect(corner010, corner011, corner111, corner110, nor.scl(-1)); nor = tmpV1.set(corner000).lerp(corner011, 0.5f).sub(tmpV2.set(corner100).lerp(corner111, 0.5f)).nor(); builder.rect(corner001, corner011, corner010, corner000, nor); builder.rect(corner100, corner110, corner111, corner101, nor.scl(-1)); } }
} else { builder.ensureVertices((divisions + 1) * 2); builder.ensureRectangleIndices(divisions + 1);
} else { builder.ensureVertices((divisions + 1) * 2); builder.ensureRectangleIndices(divisions + 1);
/** Build a patch shape. Requires GL_POINTS, GL_LINES or GL_TRIANGLES primitive type. */ public static void build (MeshPartBuilder builder, VertexInfo corner00, VertexInfo corner10, VertexInfo corner11, VertexInfo corner01, int divisionsU, int divisionsV) { if (divisionsU < 1 || divisionsV < 1) { throw new GdxRuntimeException("divisionsU and divisionV must be > 0, u,v: " + divisionsU + ", " + divisionsV); } builder.ensureVertices((divisionsV + 1) * (divisionsU + 1)); builder.ensureRectangleIndices(divisionsV * divisionsU); for (int u = 0; u <= divisionsU; u++) { final float alphaU = (float)u / (float)divisionsU; vertTmp5.set(corner00).lerp(corner10, alphaU); vertTmp6.set(corner01).lerp(corner11, alphaU); for (int v = 0; v <= divisionsV; v++) { final short idx = builder.vertex(vertTmp7.set(vertTmp5).lerp(vertTmp6, (float)v / (float)divisionsV)); if (u > 0 && v > 0) builder.rect((short)(idx - divisionsV - 2), (short)(idx - 1), idx, (short)(idx - divisionsV - 1)); } } }
builder.index(i000, i001, i010, i011, i110, i111, i100, i101); } else if (primitiveType == GL20.GL_POINTS) { builder.ensureRectangleIndices(2); builder.rect(i000, i100, i110, i010); builder.rect(i101, i001, i011, i111); } else { // GL20.GL_TRIANGLES builder.ensureRectangleIndices(6); builder.rect(i000, i100, i110, i010); builder.rect(i101, i001, i011, i111);
builder.ensureRectangleIndices(divisionsU); for (int iv = 0; iv <= divisionsV; iv++) { angleV = avo + stepV * iv;
builder.ensureRectangleIndices(divisions); for (int i = 0; i <= divisions; i++) { angle = ao + step * i;
/** Add a box. Requires GL_POINTS, GL_LINES or GL_TRIANGLES primitive type. */ public static void build (MeshPartBuilder builder, Vector3 corner000, Vector3 corner010, Vector3 corner100, Vector3 corner110, Vector3 corner001, Vector3 corner011, Vector3 corner101, Vector3 corner111) { if ((builder.getAttributes().getMask() & (Usage.Normal | Usage.BiNormal | Usage.Tangent | Usage.TextureCoordinates)) == 0) { build(builder, vertTmp1.set(corner000, null, null, null), vertTmp2.set(corner010, null, null, null), vertTmp3.set(corner100, null, null, null), vertTmp4.set(corner110, null, null, null), vertTmp5.set(corner001, null, null, null), vertTmp6.set(corner011, null, null, null), vertTmp7.set(corner101, null, null, null), vertTmp8.set(corner111, null, null, null)); } else { builder.ensureVertices(24); builder.ensureRectangleIndices(6); Vector3 nor = tmpV1.set(corner000).lerp(corner110, 0.5f).sub(tmpV2.set(corner001).lerp(corner111, 0.5f)).nor(); builder.rect(corner000, corner010, corner110, corner100, nor); builder.rect(corner011, corner001, corner101, corner111, nor.scl(-1)); nor = tmpV1.set(corner000).lerp(corner101, 0.5f).sub(tmpV2.set(corner010).lerp(corner111, 0.5f)).nor(); builder.rect(corner001, corner000, corner100, corner101, nor); builder.rect(corner010, corner011, corner111, corner110, nor.scl(-1)); nor = tmpV1.set(corner000).lerp(corner011, 0.5f).sub(tmpV2.set(corner100).lerp(corner111, 0.5f)).nor(); builder.rect(corner001, corner011, corner010, corner000, nor); builder.rect(corner100, corner110, corner111, corner101, nor.scl(-1)); } }
} else { builder.ensureVertices((divisions + 1) * 2); builder.ensureRectangleIndices(divisions + 1);