mirror of
https://github.com/processing/processing4.git
synced 2026-02-11 17:40:48 +01:00
continuing the graphics madness
This commit is contained in:
@@ -44,7 +44,7 @@ public class PGraphics2 extends PGraphics {
|
||||
new AffineTransform[MATRIX_STACK_DEPTH];
|
||||
double transform[] = new double[6];
|
||||
|
||||
Elipse2D.Float ellipse = new Ellipse2D.Float();
|
||||
Ellipse2D.Float ellipse = new Ellipse2D.Float();
|
||||
Rectangle2D.Float rect = new Rectangle2D.Float();
|
||||
Arc2D.Float arc = new Arc2D.Float();
|
||||
|
||||
@@ -125,255 +125,6 @@ public class PGraphics2 extends PGraphics {
|
||||
// SHAPES
|
||||
|
||||
|
||||
public void endShape() {
|
||||
// don't try to draw if there are no vertices
|
||||
// (fixes a bug in LINE_LOOP that re-adds a nonexistent vertex)
|
||||
if (vertexCount == 0) {
|
||||
shape = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// CREATE LINES
|
||||
|
||||
int increment = 1;
|
||||
int stop = 0;
|
||||
int counter = 0;
|
||||
|
||||
if (stroke) {
|
||||
switch (shape) {
|
||||
|
||||
case POINTS:
|
||||
{
|
||||
for (int i = 0; i < vertexCount; i++) {
|
||||
|
||||
point(vertices[i][VX], vertices[i][VY]);
|
||||
}
|
||||
stop = vertex_end;
|
||||
for (int i = vertex_start; i < stop; i++) {
|
||||
add_path(); // total overkill for points
|
||||
add_line(i, i);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case LINES:
|
||||
case LINE_STRIP:
|
||||
case LINE_LOOP:
|
||||
{
|
||||
// store index of first vertex
|
||||
int first = lineCount;
|
||||
stop = vertex_end - 1;
|
||||
increment = (shape == LINES) ? 2 : 1;
|
||||
|
||||
// for LINE_STRIP and LINE_LOOP, make this all one path
|
||||
if (shape != LINES) add_path();
|
||||
|
||||
for (int i = vertex_start; i < stop; i+=increment) {
|
||||
// for LINES, make a new path for each segment
|
||||
if (shape == LINES) add_path();
|
||||
add_line(i, i+1);
|
||||
}
|
||||
|
||||
// for LINE_LOOP, close the loop with a final segment
|
||||
if (shape == LINE_LOOP) {
|
||||
add_line(stop, lines[first][VERTEX1]);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case TRIANGLES:
|
||||
{
|
||||
for (int i = vertex_start; i < vertex_end; i += 3) {
|
||||
add_path();
|
||||
counter = i - vertex_start;
|
||||
add_line(i+0, i+1);
|
||||
add_line(i+1, i+2);
|
||||
add_line(i+2, i+0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case TRIANGLE_STRIP:
|
||||
{
|
||||
// first draw all vertices as a line strip
|
||||
stop = vertex_end-1;
|
||||
|
||||
add_path();
|
||||
for (int i = vertex_start; i < stop; i++) {
|
||||
counter = i - vertex_start;
|
||||
add_line(i,i+1);
|
||||
}
|
||||
|
||||
// then draw from vertex (n) to (n+2)
|
||||
stop = vertex_end-2;
|
||||
for (int i = vertex_start; i < stop; i++) {
|
||||
add_path();
|
||||
add_line(i,i+2);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case TRIANGLE_FAN:
|
||||
{
|
||||
// this just draws a series of line segments
|
||||
// from the center to each exterior point
|
||||
for (int i = vertex_start + 1; i < vertex_end; i++) {
|
||||
add_path();
|
||||
add_line(vertex_start, i);
|
||||
}
|
||||
|
||||
// then a single line loop around the outside.
|
||||
add_path();
|
||||
for (int i = vertex_start + 1; i < vertex_end-1; i++) {
|
||||
add_line(i, i+1);
|
||||
}
|
||||
// closing the loop
|
||||
add_line(vertex_end-1, vertex_start + 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case QUADS:
|
||||
{
|
||||
for (int i = vertex_start; i < vertex_end; i += 4) {
|
||||
add_path();
|
||||
counter = i - vertex_start;
|
||||
add_line(i+0, i+1);
|
||||
add_line(i+1, i+2);
|
||||
add_line(i+2, i+3);
|
||||
add_line(i+3, i+0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case QUAD_STRIP:
|
||||
{
|
||||
// first draw all vertices as a line strip
|
||||
stop = vertex_end - 1;
|
||||
|
||||
add_path();
|
||||
for (int i = vertex_start; i < stop; i++) {
|
||||
counter = i - vertex_start;
|
||||
add_line(i, i+1);
|
||||
}
|
||||
|
||||
// then draw from vertex (n) to (n+3)
|
||||
stop = vertex_end-2;
|
||||
increment = 2;
|
||||
|
||||
add_path();
|
||||
for (int i = vertex_start; i < stop; i += increment) {
|
||||
add_line(i, i+3);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case POLYGON:
|
||||
case CONCAVE_POLYGON:
|
||||
case CONVEX_POLYGON:
|
||||
{
|
||||
// store index of first vertex
|
||||
int first = lineCount;
|
||||
stop = vertex_end - 1;
|
||||
|
||||
add_path();
|
||||
for (int i = vertex_start; i < stop; i++) {
|
||||
add_line(i, i+1);
|
||||
}
|
||||
// draw the last line connecting back to the first point in poly
|
||||
add_line(stop, lines[first][VERTEX1]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// CREATE TRIANGLES
|
||||
|
||||
if (fill) {
|
||||
switch (shape) {
|
||||
case TRIANGLES:
|
||||
case TRIANGLE_STRIP:
|
||||
{
|
||||
stop = vertex_end - 2;
|
||||
increment = (shape == TRIANGLES) ? 3 : 1;
|
||||
for (int i = vertex_start; i < stop; i += increment) {
|
||||
add_triangle(i, i+1, i+2);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case QUADS:
|
||||
case QUAD_STRIP:
|
||||
{
|
||||
stop = vertex_count-3;
|
||||
increment = (shape == QUADS) ? 4 : 2;
|
||||
|
||||
for (int i = vertex_start; i < stop; i += increment) {
|
||||
// first triangle
|
||||
add_triangle(i, i+1, i+2);
|
||||
// second triangle
|
||||
add_triangle(i, i+2, i+3);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case POLYGON:
|
||||
case CONCAVE_POLYGON:
|
||||
case CONVEX_POLYGON:
|
||||
{
|
||||
triangulate_polygon();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// 2D or 3D POINTS FROM MODEL (MX, MY, MZ) TO VIEW SPACE (X, Y, Z)
|
||||
|
||||
if (depth) {
|
||||
for (int i = vertex_start; i < vertex_end; i++) {
|
||||
float vertex[] = vertices[i];
|
||||
|
||||
vertex[VX] = m00*vertex[MX] + m01*vertex[MY] + m02*vertex[MZ] + m03;
|
||||
vertex[VY] = m10*vertex[MX] + m11*vertex[MY] + m12*vertex[MZ] + m13;
|
||||
vertex[VZ] = m20*vertex[MX] + m21*vertex[MY] + m22*vertex[MZ] + m23;
|
||||
vertex[VW] = m30*vertex[MX] + m31*vertex[MY] + m32*vertex[MZ] + m33;
|
||||
}
|
||||
} else {
|
||||
// if no depth in use, then the points can be transformed simpler
|
||||
for (int i = vertex_start; i < vertex_end; i++) {
|
||||
vertices[i][X] = m00*vertices[i][MX] + m01*vertices[i][MY] + m03;
|
||||
vertices[i][Y] = m10*vertices[i][MX] + m11*vertices[i][MY] + m13;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// TRANSFORM / LIGHT / CLIP
|
||||
|
||||
light_and_transform();
|
||||
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// RENDER SHAPES FILLS HERE WHEN NOT DEPTH SORTING
|
||||
|
||||
// if true, the shapes will be rendered on endFrame
|
||||
if (hints[DEPTH_SORT]) {
|
||||
shape = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (fill) render_triangles();
|
||||
if (stroke) render_lines();
|
||||
|
||||
shape = 0;
|
||||
}
|
||||
|
||||
|
||||
public void vertex(float x, float y) {
|
||||
splineVertexCount = 0;
|
||||
float vertex[];
|
||||
@@ -557,8 +308,9 @@ public class PGraphics2 extends PGraphics {
|
||||
|
||||
|
||||
public void endShape() {
|
||||
switch (shape) {
|
||||
shape = 0;
|
||||
|
||||
switch (shape) {
|
||||
case LINE_STRIP:
|
||||
stroke_shape(path);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user