package com.gebauz.bauzoid.graphics.model;
import com.gebauz.bauzoid.graphics.Graphics;
import com.gebauz.bauzoid.math.Vector4;
/** Generate quad and other geometry. */
public class GeometryUtil
{
static public SimpleGeometry createQuad
(Graphics graphics,
float minX,
float minY,
float maxX,
float maxY,
float minS,
float minT,
float maxS,
float maxT, Vector4 color
)
{
SimpleGeometry mesh =
new SimpleGeometry
(graphics, Geometry.
PrimitiveType.
TRIANGLES);
AttributeArray vertices =
new AttributeArray
(SimpleGeometry.
POSITION_COORD_PER_ELEMENT * 6);
vertices.
fill(minX, minY, 0.0f
);
vertices.
fill(maxX, minY, 0.0f
);
vertices.
fill(minX, maxY, 0.0f
);
vertices.
fill(minX, maxY, 0.0f
);
vertices.
fill(maxX, minY, 0.0f
);
vertices.
fill(maxX, maxY, 0.0f
);
AttributeArray colors =
new AttributeArray
(SimpleGeometry.
COLOR_COORD_PER_ELEMENT * 6);
colors.
fill(color.
x, color.
y, color.
z, color.
w);
colors.
fill(color.
x, color.
y, color.
z, color.
w);
colors.
fill(color.
x, color.
y, color.
z, color.
w);
colors.
fill(color.
x, color.
y, color.
z, color.
w);
colors.
fill(color.
x, color.
y, color.
z, color.
w);
colors.
fill(color.
x, color.
y, color.
z, color.
w);
AttributeArray texCoords =
new AttributeArray
(SimpleGeometry.
TEXCOORD_COORD_PER_ELEMENT * 6);
texCoords.
fill(minS, maxT
);
texCoords.
fill(maxS, maxT
);
texCoords.
fill(minS, minT
);
texCoords.
fill(minS, minT
);
texCoords.
fill(maxS, maxT
);
texCoords.
fill(maxS, minT
);
mesh.
setPositions(vertices.
getAttributeArray());
mesh.
setColors(colors.
getAttributeArray());
mesh.
setTexCoords(texCoords.
getAttributeArray());
return mesh
;
}
public static SimpleGeometry createQuad
(Graphics graphics,
float minX,
float minY,
float maxX,
float maxY,
float minS,
float minT,
float maxS,
float maxT
)
{
return createQuad
(graphics, minX, minY, maxX, maxY, minS, minT, maxS, maxT,
new Vector4
(1.0f, 1.0f, 1.0f, 1.0f
));
}
public static SimpleGeometry createQuad
(Graphics graphics,
float minX,
float minY,
float maxX,
float maxY, Vector4 color
)
{
return createQuad
(graphics, minX, minY, maxX, maxY, 0.0f, 0.0f, 1.0f, 1.0f,
new Vector4
(1.0f, 1.0f, 1.0f, 1.0f
));
}
public static SimpleGeometry createQuad
(Graphics graphics,
float minX,
float minY,
float maxX,
float maxY
)
{
return createQuad
(graphics, minX, minY, maxX, maxY, 0.0f, 0.0f, 1.0f, 1.0f
);
}
static public SimpleGeometry createSubdividedQuad
(Graphics graphics,
float minX,
float minY,
float maxX,
float maxY,
float minS,
float minT,
float maxS,
float maxT, Vector4 color,
int subdivisionX,
int subdivisionY
)
{
SimpleGeometry mesh =
new SimpleGeometry
(graphics, Geometry.
PrimitiveType.
TRIANGLES);
final int numTiles =
(subdivisionX +
1) * (subdivisionY +
1);
AttributeArray vertices =
new AttributeArray
(SimpleGeometry.
POSITION_COORD_PER_ELEMENT * 6 * numTiles
);
AttributeArray colors =
new AttributeArray
(SimpleGeometry.
COLOR_COORD_PER_ELEMENT * 6 * numTiles
);
AttributeArray texCoords =
new AttributeArray
(SimpleGeometry.
TEXCOORD_COORD_PER_ELEMENT * 6 * numTiles
);
float stepX =
(maxX - minX
) /
(subdivisionX +
1);
float stepY =
(maxY - minY
) /
(subdivisionY +
1);
float stepS =
(maxS - minS
) /
(subdivisionX +
1);
float stepT =
(maxT - minT
) /
(subdivisionY +
1);
float segmentX = minX
;
float segmentY = minY
;
float segmentS = minS
;
float segmentT = maxT
;
for (int y =
0; y
< (subdivisionY +
1); y++
)
{
for (int x =
0; x
< (subdivisionX +
1); x++
)
{
float segmentMinX = segmentX
;
float segmentMaxX = segmentX + stepX
;
float segmentMinY = segmentY
;
float segmentMaxY = segmentY + stepY
;
float segmentMinS = segmentS
;
float segmentMaxS =
(segmentS + stepS
);
float segmentMinT =
(segmentT - stepT
);
float segmentMaxT = segmentT
;
vertices.
fill(segmentMinX, segmentMinY, 0.0f
);
vertices.
fill(segmentMaxX, segmentMinY, 0.0f
);
vertices.
fill(segmentMinX, segmentMaxY, 0.0f
);
vertices.
fill(segmentMinX, segmentMaxY, 0.0f
);
vertices.
fill(segmentMaxX, segmentMinY, 0.0f
);
vertices.
fill(segmentMaxX, segmentMaxY, 0.0f
);
colors.
fill(color.
x, color.
y, color.
z, color.
w);
colors.
fill(color.
x, color.
y, color.
z, color.
w);
colors.
fill(color.
x, color.
y, color.
z, color.
w);
colors.
fill(color.
x, color.
y, color.
z, color.
w);
colors.
fill(color.
x, color.
y, color.
z, color.
w);
colors.
fill(color.
x, color.
y, color.
z, color.
w);
texCoords.
fill(segmentMinS, segmentMaxT
);
texCoords.
fill(segmentMaxS, segmentMaxT
);
texCoords.
fill(segmentMinS, segmentMinT
);
texCoords.
fill(segmentMinS, segmentMinT
);
texCoords.
fill(segmentMaxS, segmentMaxT
);
texCoords.
fill(segmentMaxS, segmentMinT
);
segmentX += stepX
;
segmentS += stepS
;
}
segmentX = minX
;
segmentS = minS
;
segmentY += stepY
;
segmentT -= stepT
;
}
/* AttributeArray vertices = new AttributeArray(SimpleGeometry.POSITION_COORD_PER_ELEMENT * 6);
vertices.fill(minX, minY, 0.0f);
vertices.fill(maxX, minY, 0.0f);
vertices.fill(minX, maxY, 0.0f);
vertices.fill(minX, maxY, 0.0f);
vertices.fill(maxX, minY, 0.0f);
vertices.fill(maxX, maxY, 0.0f);
AttributeArray colors = new AttributeArray(SimpleGeometry.COLOR_COORD_PER_ELEMENT * 6);
colors.fill(color.x, color.y, color.z, color.w);
colors.fill(color.x, color.y, color.z, color.w);
colors.fill(color.x, color.y, color.z, color.w);
colors.fill(color.x, color.y, color.z, color.w);
colors.fill(color.x, color.y, color.z, color.w);
colors.fill(color.x, color.y, color.z, color.w);
AttributeArray texCoords = new AttributeArray(SimpleGeometry.TEXCOORD_COORD_PER_ELEMENT * 6);
texCoords.fill(minS, maxT);
texCoords.fill(maxS, maxT);
texCoords.fill(minS, minT);
texCoords.fill(minS, minT);
texCoords.fill(maxS, maxT);
texCoords.fill(maxS, minT);*/
mesh.
setPositions(vertices.
getAttributeArray());
mesh.
setColors(colors.
getAttributeArray());
mesh.
setTexCoords(texCoords.
getAttributeArray());
return mesh
;
}
public static SimpleGeometry createSubdividedQuad
(Graphics graphics,
float minX,
float minY,
float maxX,
float maxY,
float minS,
float minT,
float maxS,
float maxT,
int subdivisionX,
int subdivisionY
)
{
return createSubdividedQuad
(graphics, minX, minY, maxX, maxY, minS, minT, maxS, maxT,
new Vector4
(1.0f, 1.0f, 1.0f, 1.0f
),
subdivisionX, subdivisionY
);
}
public static SimpleGeometry createSubdividedQuad
(Graphics graphics,
float minX,
float minY,
float maxX,
float maxY,
Vector4 color,
int subdivisionX,
int subdivisionY
)
{
return createSubdividedQuad
(graphics, minX, minY, maxX, maxY, 0.0f, 0.0f, 1.0f, 1.0f,
new Vector4
(1.0f, 1.0f, 1.0f, 1.0f
),
subdivisionX, subdivisionY
);
}
public static SimpleGeometry createSubdividedQuad
(Graphics graphics,
float minX,
float minY,
float maxX,
float maxY,
int subdivisionX,
int subdivisionY
)
{
return createSubdividedQuad
(graphics, minX, minY, maxX, maxY, 0.0f, 0.0f, 1.0f, 1.0f, subdivisionX, subdivisionY
);
}
}