added color initialization to LWJGL, as well as refactoring of

PGraphics2D and PGraphics3D
This commit is contained in:
codeanticode
2013-02-13 10:21:27 -05:00
parent a1f88f02b5
commit 6ba396ca2d
3 changed files with 57 additions and 864 deletions

View File

@@ -504,8 +504,7 @@ public class PGL extends processing.opengl.PGL {
canvas = new Canvas();
canvas.setFocusable(true);
canvas.requestFocus();
canvas.setBackground(Color.BLACK);
canvas.setForeground(Color.BLACK);
canvas.setBackground(new Color(pg.backgroundColor, true));
canvas.setBounds(0, 0, pg.parent.width, pg.parent.height);
pg.parent.setLayout(new BorderLayout());
@@ -516,9 +515,14 @@ public class PGL extends processing.opengl.PGL {
request_depth_bits,
request_stencil_bits, 1);
Display.setDisplayMode(new DisplayMode(pg.parent.width, pg.parent.height));
int argb = pg.backgroundColor;
float r = ((argb >> 16) & 0xff) / 255.0f;
float g = ((argb >> 8) & 0xff) / 255.0f;
float b = ((argb) & 0xff) / 255.0f;
Display.setInitialBackground(r, g, b);
Display.setParent(canvas);
Display.create(format);
Display.setVSyncEnabled(true);
Display.setVSyncEnabled(true);
} catch (LWJGLException e) {
e.printStackTrace();
}
@@ -587,7 +591,7 @@ public class PGL extends processing.opengl.PGL {
texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);
texImage2D(TEXTURE_2D, 0, RGBA, fboWidth, fboHeight, 0,
RGBA, UNSIGNED_BYTE, null);
initTexture(TEXTURE_2D, RGBA, fboWidth, fboHeight);
initTexture(TEXTURE_2D, RGBA, fboWidth, fboHeight, pg.backgroundColor);
}
bindTexture(TEXTURE_2D, 0);
@@ -682,8 +686,13 @@ public class PGL extends processing.opengl.PGL {
// Clear all buffers.
clearDepth(1);
clearStencil(0);
clearColor(0, 0, 0, 0);
clearStencil(0);
int argb = pg.backgroundColor;
float a = ((argb >> 24) & 0xff) / 255.0f;
float r = ((argb >> 16) & 0xff) / 255.0f;
float g = ((argb >> 8) & 0xff) / 255.0f;
float b = ((argb) & 0xff) / 255.0f;
clearColor(r, g, b, a);
clear(DEPTH_BUFFER_BIT | STENCIL_BUFFER_BIT | COLOR_BUFFER_BIT);
bindFramebuffer(FRAMEBUFFER, 0);
@@ -873,7 +882,12 @@ public class PGL extends processing.opengl.PGL {
if (firstFrame) {
// No need to draw back color buffer because we are in the first frame.
clearColor(0, 0, 0, 0);
int argb = pg.backgroundColor;
float a = ((argb >> 24) & 0xff) / 255.0f;
float r = ((argb >> 16) & 0xff) / 255.0f;
float g = ((argb >> 8) & 0xff) / 255.0f;
float b = ((argb) & 0xff) / 255.0f;
clearColor(r, g, b, a);
clear(COLOR_BUFFER_BIT);
} else if (!clear0) {
// Render previous back texture (now is the front) as background,
@@ -1791,7 +1805,17 @@ public class PGL extends processing.opengl.PGL {
protected void initTexture(int target, int format, int width, int height) {
initTexture(target, format, width, height, 0);
}
protected void initTexture(int target, int format, int width, int height,
int initColor) {
int[] glcolor = new int[16 * 16];
Arrays.fill(glcolor, javaToNativeARGB(initColor));
IntBuffer texels = PGL.allocateDirectIntBuffer(16 * 16);
texels.put(glcolor);
texels.rewind();
for (int y = 0; y < height; y += 16) {
int h = PApplet.min(16, height - y);
for (int x = 0; x < width; x += 16) {

View File

@@ -1,602 +1,22 @@
package processing.lwjgl;
import java.io.InputStream;
import java.util.zip.GZIPInputStream;
import processing.core.PApplet;
import processing.core.PConstants;
import processing.core.PGraphics;
import processing.core.PMatrix3D;
import processing.core.PShape;
import processing.core.PShapeSVG;
import processing.data.XML;
import processing.opengl.PShapeOpenGL;
public class PGraphics2D extends PGraphicsLWJGL {
public class PGraphics2D extends processing.opengl.PGraphics2D {
public PGraphics2D() {
super();
hints[ENABLE_STROKE_PERSPECTIVE] = false;
}
pgl = new PGL(this);
//////////////////////////////////////////////////////////////
// RENDERER SUPPORT QUERIES
@Override
public boolean is2D() {
return true;
}
@Override
public boolean is3D() {
return false;
}
//////////////////////////////////////////////////////////////
// HINTS
@Override
public void hint(int which) {
if (which == ENABLE_STROKE_PERSPECTIVE) {
showWarning("Strokes cannot be perspective-corrected in 2D.");
return;
}
super.hint(which);
}
//////////////////////////////////////////////////////////////
// PROJECTION
@Override
public void ortho() {
showMethodWarning("ortho");
}
@Override
public void ortho(float left, float right,
float bottom, float top) {
showMethodWarning("ortho");
}
@Override
public void ortho(float left, float right,
float bottom, float top,
float near, float far) {
showMethodWarning("ortho");
}
@Override
public void perspective() {
showMethodWarning("perspective");
}
@Override
public void perspective(float fov, float aspect, float zNear, float zFar) {
showMethodWarning("perspective");
}
@Override
public void frustum(float left, float right, float bottom, float top,
float znear, float zfar) {
showMethodWarning("frustum");
}
@Override
protected void defaultPerspective() {
super.ortho(0, width, 0, height, -1, +1);
}
//////////////////////////////////////////////////////////////
// CAMERA
@Override
public void beginCamera() {
showMethodWarning("beginCamera");
}
@Override
public void endCamera() {
showMethodWarning("endCamera");
}
@Override
public void camera() {
showMethodWarning("camera");
}
@Override
public void camera(float eyeX, float eyeY, float eyeZ,
float centerX, float centerY, float centerZ,
float upX, float upY, float upZ) {
showMethodWarning("camera");
}
@Override
protected void defaultCamera() {
super.camera(width/2, height/2);
}
//////////////////////////////////////////////////////////////
// MATRIX MORE!
@Override
protected void begin2D() {
pushProjection();
defaultPerspective();
pushMatrix();
defaultCamera();
}
@Override
protected void end2D() {
popMatrix();
popProjection();
}
//////////////////////////////////////////////////////////////
// SHAPE
@Override
public void shape(PShape shape) {
if (shape.is2D()) {
super.shape(shape);
} else {
showWarning("The shape object is not 2D, cannot be displayed with " +
"this renderer");
}
}
@Override
public void shape(PShape shape, float x, float y) {
if (shape.is2D()) {
super.shape(shape, x, y);
} else {
showWarning("The shape object is not 2D, cannot be displayed with " +
"this renderer");
}
}
@Override
public void shape(PShape shape, float a, float b, float c, float d) {
if (shape.is2D()) {
super.shape(shape, a, b, c, d);
} else {
showWarning("The shape object is not 2D, cannot be displayed with " +
"this renderer");
}
}
@Override
public void shape(PShape shape, float x, float y, float z) {
showDepthWarningXYZ("shape");
}
@Override
public void shape(PShape shape, float x, float y, float z,
float c, float d, float e) {
showDepthWarningXYZ("shape");
}
//////////////////////////////////////////////////////////////
// SHAPE I/O
static protected boolean isSupportedExtension(String extension) {
return extension.equals("svg") || extension.equals("svgz");
}
static protected PShape loadShapeImpl(PGraphics pg, String filename,
String extension) {
PShapeSVG svg = null;
if (extension.equals("svg")) {
svg = new PShapeSVG(pg.parent.loadXML(filename));
} else if (extension.equals("svgz")) {
try {
InputStream input =
new GZIPInputStream(pg.parent.createInput(filename));
XML xml = new XML(input);
svg = new PShapeSVG(xml);
} catch (Exception e) {
e.printStackTrace();
}
if (tessellator == null) {
tessellator = new Tessellator();
}
if (svg != null) {
PShapeOpenGL p2d = PShapeOpenGL.createShape2D(pg.parent, svg);
return p2d;
} else {
return null;
}
intBuffer = PGL.allocateIntBuffer(2);
floatBuffer = PGL.allocateFloatBuffer(2);
viewport = PGL.allocateIntBuffer(4);
inGeo = newInGeometry(IMMEDIATE);
tessGeo = newTessGeometry(IMMEDIATE);
texCache = newTexCache();
initialized = false;
}
//////////////////////////////////////////////////////////////
// SHAPE CREATION
@Override
public PShape createShape(PShape source) {
return PShapeOpenGL.createShape2D(parent, source);
}
@Override
public PShape createShape() {
return createShape(PShape.GEOMETRY);
}
@Override
public PShape createShape(int type) {
return createShapeImpl(parent, type);
}
@Override
public PShape createShape(int kind, float... p) {
return createShapeImpl(parent, kind, p);
}
static protected PShapeOpenGL createShapeImpl(PApplet parent, int type) {
PShapeOpenGL shape = null;
if (type == PConstants.GROUP) {
shape = new PShapeOpenGL(parent, PConstants.GROUP);
} else if (type == PShape.PATH) {
shape = new PShapeOpenGL(parent, PShape.PATH);
} else if (type == PShape.GEOMETRY) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
}
/*
if (type == POINTS) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(POINTS);
} else if (type == LINES) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(LINES);
} else if (type == TRIANGLE || type == TRIANGLES) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(TRIANGLES);
} else if (type == TRIANGLE_FAN) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(TRIANGLE_FAN);
} else if (type == TRIANGLE_STRIP) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(TRIANGLE_STRIP);
} else if (type == QUAD || type == QUADS) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(QUADS);
} else if (type == QUAD_STRIP) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(QUAD_STRIP);
} else if (type == POLYGON) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(POLYGON);
}
*/
shape.is3D(false);
return shape;
}
static protected PShapeOpenGL createShapeImpl(PApplet parent,
int kind, float... p) {
PShapeOpenGL shape = null;
int len = p.length;
if (kind == POINT) {
if (len != 2) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(POINT);
} else if (kind == LINE) {
if (len != 4) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(LINE);
} else if (kind == TRIANGLE) {
if (len != 6) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(TRIANGLE);
} else if (kind == QUAD) {
if (len != 8) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(QUAD);
} else if (kind == RECT) {
if (len != 4 && len != 5 && len != 8) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(RECT);
} else if (kind == ELLIPSE) {
if (len != 4) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(ELLIPSE);
} else if (kind == ARC) {
if (len != 6) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(ARC);
} else if (kind == BOX) {
showWarning("Primitive not supported in 2D");
} else if (kind == SPHERE) {
showWarning("Primitive not supported in 2D");
} else {
showWarning("Unrecognized primitive type");
}
if (shape != null) {
shape.setParams(p);
}
shape.is3D(false);
return shape;
}
//////////////////////////////////////////////////////////////
// BEZIER VERTICES
@Override
public void bezierVertex(float x2, float y2, float z2,
float x3, float y3, float z3,
float x4, float y4, float z4) {
showDepthWarningXYZ("bezierVertex");
}
//////////////////////////////////////////////////////////////
// QUADRATIC BEZIER VERTICES
@Override
public void quadraticVertex(float x2, float y2, float z2,
float x4, float y4, float z4) {
showDepthWarningXYZ("quadVertex");
}
//////////////////////////////////////////////////////////////
// CURVE VERTICES
@Override
public void curveVertex(float x, float y, float z) {
showDepthWarningXYZ("curveVertex");
}
//////////////////////////////////////////////////////////////
// BOX
@Override
public void box(float w, float h, float d) {
showMethodWarning("box");
}
//////////////////////////////////////////////////////////////
// SPHERE
@Override
public void sphere(float r) {
showMethodWarning("sphere");
}
//////////////////////////////////////////////////////////////
// VERTEX SHAPES
@Override
public void vertex(float x, float y, float z) {
showDepthWarningXYZ("vertex");
}
@Override
public void vertex(float x, float y, float z, float u, float v) {
showDepthWarningXYZ("vertex");
}
//////////////////////////////////////////////////////////////
// MATRIX TRANSFORMATIONS
@Override
public void translate(float tx, float ty, float tz) {
showDepthWarningXYZ("translate");
}
@Override
public void rotateX(float angle) {
showDepthWarning("rotateX");
}
@Override
public void rotateY(float angle) {
showDepthWarning("rotateY");
}
@Override
public void rotateZ(float angle) {
showDepthWarning("rotateZ");
}
@Override
public void rotate(float angle, float vx, float vy, float vz) {
showVariationWarning("rotate");
}
@Override
public void applyMatrix(PMatrix3D source) {
showVariationWarning("applyMatrix");
}
@Override
public void applyMatrix(float n00, float n01, float n02, float n03,
float n10, float n11, float n12, float n13,
float n20, float n21, float n22, float n23,
float n30, float n31, float n32, float n33) {
showVariationWarning("applyMatrix");
}
@Override
public void scale(float sx, float sy, float sz) {
showDepthWarningXYZ("scale");
}
//////////////////////////////////////////////////////////////
// SCREEN AND MODEL COORDS
@Override
public float screenX(float x, float y, float z) {
showDepthWarningXYZ("screenX");
return 0;
}
@Override
public float screenY(float x, float y, float z) {
showDepthWarningXYZ("screenY");
return 0;
}
@Override
public float screenZ(float x, float y, float z) {
showDepthWarningXYZ("screenZ");
return 0;
}
@Override
public PMatrix3D getMatrix(PMatrix3D target) {
showVariationWarning("getMatrix");
return target;
}
@Override
public void setMatrix(PMatrix3D source) {
showVariationWarning("setMatrix");
}
//////////////////////////////////////////////////////////////
// LIGHTS
@Override
public void lights() {
showMethodWarning("lights");
}
@Override
public void noLights() {
showMethodWarning("noLights");
}
@Override
public void ambientLight(float red, float green, float blue) {
showMethodWarning("ambientLight");
}
@Override
public void ambientLight(float red, float green, float blue,
float x, float y, float z) {
showMethodWarning("ambientLight");
}
@Override
public void directionalLight(float red, float green, float blue,
float nx, float ny, float nz) {
showMethodWarning("directionalLight");
}
@Override
public void pointLight(float red, float green, float blue,
float x, float y, float z) {
showMethodWarning("pointLight");
}
@Override
public void spotLight(float red, float green, float blue,
float x, float y, float z,
float nx, float ny, float nz,
float angle, float concentration) {
showMethodWarning("spotLight");
}
@Override
public void lightFalloff(float constant, float linear, float quadratic) {
showMethodWarning("lightFalloff");
}
@Override
public void lightSpecular(float v1, float v2, float v3) {
showMethodWarning("lightSpecular");
}
}

View File

@@ -1,273 +1,22 @@
package processing.lwjgl;
import java.io.InputStream;
import java.util.zip.GZIPInputStream;
import processing.core.PApplet;
import processing.core.PConstants;
import processing.core.PGraphics;
import processing.core.PShape;
import processing.core.PShapeOBJ;
import processing.opengl.PShapeOpenGL;
public class PGraphics3D extends PGraphicsLWJGL {
public class PGraphics3D extends processing.opengl.PGraphics3D {
public PGraphics3D() {
super();
hints[ENABLE_STROKE_PERSPECTIVE] = false;
}
pgl = new PGL(this);
//////////////////////////////////////////////////////////////
// RENDERER SUPPORT QUERIES
@Override
public boolean is2D() {
return false;
}
@Override
public boolean is3D() {
return true;
}
//////////////////////////////////////////////////////////////
// PROJECTION
@Override
protected void defaultPerspective() {
perspective();
}
//////////////////////////////////////////////////////////////
// CAMERA
@Override
protected void defaultCamera() {
camera();
}
//////////////////////////////////////////////////////////////
// MATRIX MORE!
@Override
protected void begin2D() {
pushProjection();
ortho(0, width, 0, height, -1, +1);
pushMatrix();
camera(width/2, height/2);
}
@Override
protected void end2D() {
popMatrix();
popProjection();
}
//////////////////////////////////////////////////////////////
// SHAPE I/O
static protected boolean isSupportedExtension(String extension) {
return extension.equals("obj");
}
static protected PShape loadShapeImpl(PGraphics pg, String filename,
String extension) {
PShapeOBJ obj = null;
if (extension.equals("obj")) {
obj = new PShapeOBJ(pg.parent, filename);
} else if (extension.equals("objz")) {
try {
InputStream input =
new GZIPInputStream(pg.parent.createInput(filename));
obj = new PShapeOBJ(pg.parent, PApplet.createReader(input));
} catch (Exception e) {
e.printStackTrace();
}
if (tessellator == null) {
tessellator = new Tessellator();
}
if (obj != null) {
int prevTextureMode = pg.textureMode;
pg.textureMode = NORMAL;
PShapeOpenGL p3d = PShapeOpenGL.createShape3D(pg.parent, obj);
pg.textureMode = prevTextureMode;
return p3d;
} else {
return null;
}
intBuffer = PGL.allocateIntBuffer(2);
floatBuffer = PGL.allocateFloatBuffer(2);
viewport = PGL.allocateIntBuffer(4);
inGeo = newInGeometry(IMMEDIATE);
tessGeo = newTessGeometry(IMMEDIATE);
texCache = newTexCache();
initialized = false;
}
//////////////////////////////////////////////////////////////
// SHAPE CREATION
@Override
public PShape createShape(PShape source) {
return PShapeOpenGL.createShape3D(parent, source);
}
@Override
public PShape createShape() {
return createShape(PShape.GEOMETRY);
}
@Override
public PShape createShape(int type) {
return createShapeImpl(parent, type);
}
@Override
public PShape createShape(int kind, float... p) {
return createShapeImpl(parent, kind, p);
}
static protected PShapeOpenGL createShapeImpl(PApplet parent, int type) {
PShapeOpenGL shape = null;
if (type == PConstants.GROUP) {
shape = new PShapeOpenGL(parent, PConstants.GROUP);
} else if (type == PShape.PATH) {
shape = new PShapeOpenGL(parent, PShape.PATH);
} else if (type == PShape.GEOMETRY) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
}
/*
(type == POINTS) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(POINTS);
} else if (type == LINES) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(LINES);
} else if (type == TRIANGLE || type == TRIANGLES) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(TRIANGLES);
} else if (type == TRIANGLE_FAN) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(TRIANGLE_FAN);
} else if (type == TRIANGLE_STRIP) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(TRIANGLE_STRIP);
} else if (type == QUAD || type == QUADS) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(QUADS);
} else if (type == QUAD_STRIP) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(QUAD_STRIP);
} else if (type == POLYGON) {
shape = new PShapeOpenGL(parent, PShape.GEOMETRY);
shape.setKind(POLYGON);
}
*/
shape.is3D(true);
return shape;
}
static protected PShapeOpenGL createShapeImpl(PApplet parent,
int kind, float... p) {
PShapeOpenGL shape = null;
int len = p.length;
if (kind == POINT) {
if (len != 2 && len != 3) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(POINT);
} else if (kind == LINE) {
if (len != 4 && len != 6) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(LINE);
} else if (kind == TRIANGLE) {
if (len != 6) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(TRIANGLE);
} else if (kind == QUAD) {
if (len != 8) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(QUAD);
} else if (kind == RECT) {
if (len != 4 && len != 5 && len != 8) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(RECT);
} else if (kind == ELLIPSE) {
if (len != 4) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(ELLIPSE);
} else if (kind == ARC) {
if (len != 6) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(ARC);
} else if (kind == BOX) {
if (len != 1 && len != 3) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(BOX);
} else if (kind == SPHERE) {
if (len != 1) {
showWarning("Wrong number of parameters");
return null;
}
shape = new PShapeOpenGL(parent, PShape.PRIMITIVE);
shape.setKind(SPHERE);
} else {
showWarning("Unrecognized primitive type");
}
if (shape != null) {
shape.setParams(p);
}
shape.is3D(true);
return shape;
}
}