mirror of
https://github.com/processing/processing4.git
synced 2026-05-27 10:36:28 +02:00
Merge branch 'master' of github.com:processing/processing
This commit is contained in:
@@ -1258,7 +1258,7 @@ public class PGraphicsJava2D extends PGraphics /*PGraphics2D*/ {
|
||||
}
|
||||
|
||||
if (who.modified) {
|
||||
cash.update(tint, tintColor);
|
||||
cash.update(who, tint, tintColor);
|
||||
who.modified = false;
|
||||
}
|
||||
|
||||
@@ -1291,14 +1291,13 @@ public class PGraphicsJava2D extends PGraphics /*PGraphics2D*/ {
|
||||
|
||||
|
||||
class ImageCache {
|
||||
PImage source;
|
||||
boolean tinted;
|
||||
int tintedColor;
|
||||
int tintedPixels[]; // one row of tinted pixels
|
||||
BufferedImage image;
|
||||
|
||||
public ImageCache(PImage source) {
|
||||
this.source = source;
|
||||
// this.source = source;
|
||||
// even if RGB, set the image type to ARGB, because the
|
||||
// image may have an alpha value for its tint().
|
||||
// int type = BufferedImage.TYPE_INT_ARGB;
|
||||
@@ -1311,7 +1310,7 @@ public class PGraphicsJava2D extends PGraphics /*PGraphics2D*/ {
|
||||
* has changed, or the pixels have changed, so should just go through
|
||||
* with the update without further checks.
|
||||
*/
|
||||
public void update(boolean tint, int tintColor) {
|
||||
public void update(PImage source, boolean tint, int tintColor) {
|
||||
int bufferType = BufferedImage.TYPE_INT_ARGB;
|
||||
boolean opaque = (tintColor & 0xFF000000) == 0xFF000000;
|
||||
if (source.format == RGB) {
|
||||
|
||||
@@ -1266,12 +1266,10 @@ public class PShape implements PConstants {
|
||||
for (int i = 0; i < src.vertexCount; i++) {
|
||||
float[] vert = src.vertices[i];
|
||||
|
||||
|
||||
|
||||
dest.fill((int)(vert[PGraphics.R] * 255) << 24 |
|
||||
(int)(vert[PGraphics.G] * 255) << 16 |
|
||||
(int)(vert[PGraphics.B] * 255) << 8 |
|
||||
(int)(vert[PGraphics.A] * 255));
|
||||
dest.fill((int)(vert[PGraphics.A] * 255) << 24 |
|
||||
(int)(vert[PGraphics.R] * 255) << 16 |
|
||||
(int)(vert[PGraphics.G] * 255) << 8 |
|
||||
(int)(vert[PGraphics.B] * 255));
|
||||
|
||||
// Do we need to copy these as well?
|
||||
// dest.ambient(vert[PGraphics.AR] * 255, vert[PGraphics.AG] * 255, vert[PGraphics.AB] * 255);
|
||||
|
||||
@@ -1939,8 +1939,12 @@ public class PGraphicsOpenGL extends PGraphics {
|
||||
flush();
|
||||
setFlushMode(FLUSH_WHEN_FULL);
|
||||
} else if (which == DISABLE_OPTIMIZED_STROKE) {
|
||||
flush();
|
||||
setFlushMode(FLUSH_CONTINUOUSLY);
|
||||
if (is2D()) {
|
||||
PGraphics.showWarning("Optimized strokes can only be disabled in 3D");
|
||||
} else {
|
||||
flush();
|
||||
setFlushMode(FLUSH_CONTINUOUSLY);
|
||||
}
|
||||
} else if (which == DISABLE_STROKE_PERSPECTIVE) {
|
||||
if (0 < tessGeo.lineVertexCount && 0 < tessGeo.lineIndexCount) {
|
||||
// We flush the geometry using the previous line setting.
|
||||
|
||||
@@ -8,34 +8,32 @@
|
||||
*
|
||||
* Here is what the JSON looks like (partial):
|
||||
*
|
||||
{
|
||||
"bubbles": {
|
||||
"bubble": [
|
||||
{
|
||||
"position": {
|
||||
"x": 160,
|
||||
"y": 103
|
||||
},
|
||||
"diameter": 43.19838,
|
||||
"label": "Happy"
|
||||
},
|
||||
{
|
||||
"position": {
|
||||
"x": 121,
|
||||
"y": 179
|
||||
},
|
||||
"diameter": 44.758068,
|
||||
"label": "Melancholy"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
{
|
||||
"bubbles": [
|
||||
{
|
||||
"position": {
|
||||
"x": 160,
|
||||
"y": 103
|
||||
},
|
||||
"diameter": 43.19838,
|
||||
"label": "Happy"
|
||||
},
|
||||
{
|
||||
"position": {
|
||||
"x": 372,
|
||||
"y": 137
|
||||
},
|
||||
"diameter": 52.42526,
|
||||
"label": "Sad"
|
||||
}
|
||||
]
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
// An Array of Bubble objects
|
||||
Bubble[] bubbles;
|
||||
// A Table object
|
||||
JSONArray json;
|
||||
// A JSON object
|
||||
JSONObject json;
|
||||
|
||||
void setup() {
|
||||
size(640, 360);
|
||||
@@ -45,88 +43,78 @@ void setup() {
|
||||
void draw() {
|
||||
background(255);
|
||||
// Display all bubbles
|
||||
// for (Bubble b : bubbles) {
|
||||
// b.display();
|
||||
// b.rollover(mouseX, mouseY);
|
||||
// }
|
||||
//
|
||||
// textAlign(LEFT);
|
||||
// fill(0);
|
||||
// text("Click to add bubbles.", 10, height-10);
|
||||
for (Bubble b : bubbles) {
|
||||
b.display();
|
||||
b.rollover(mouseX, mouseY);
|
||||
}
|
||||
//
|
||||
// textAlign(LEFT);
|
||||
// fill(0);
|
||||
// text("Click to add bubbles.", 10, height-10);
|
||||
}
|
||||
|
||||
|
||||
void loadData() {
|
||||
// Load JSON file
|
||||
String jsonString = join(loadStrings("data.json"),"\n");
|
||||
String jsonString = join(loadStrings("data.json"), "\n");
|
||||
//println(jsonString);
|
||||
|
||||
json = JSONArray.parse(jsonString);
|
||||
println(json);
|
||||
|
||||
// Get all the child nodes named "bubble"
|
||||
// XML[] children = xml.getChildren("bubble");
|
||||
//
|
||||
// // The size of the array of Bubble objects is determined by the total XML elements named "bubble"
|
||||
// bubbles = new Bubble[children.length];
|
||||
//
|
||||
// for (int i = 0; i < bubbles.length; i++) {
|
||||
//
|
||||
// // The position element has two attributes: x and y
|
||||
// XML positionElement = children[i].getChild("position");
|
||||
// // Note how with attributes we can get an integer or float directly
|
||||
// float x = positionElement.getInt("x");
|
||||
// float y = positionElement.getInt("y");
|
||||
//
|
||||
// // The diameter is the content of the child named "diamater"
|
||||
// XML diameterElement = children[i].getChild("diameter");
|
||||
// // Note how with the content of an XML node, we retrieve as a String and then convert
|
||||
// float diameter = float(diameterElement.getContent());
|
||||
//
|
||||
// // The label is the content of the child named "label"
|
||||
// XML labelElement = children[i].getChild("label");
|
||||
// String label = labelElement.getContent();
|
||||
//
|
||||
// // Make a Bubble object out of the data read
|
||||
// bubbles[i] = new Bubble(x, y, diameter, label);
|
||||
// }
|
||||
|
||||
json = JSONObject.parse(jsonString);
|
||||
println(json);
|
||||
|
||||
JSONArray bubbleData = json.getJSONArray("bubbles");
|
||||
|
||||
// The size of the array of Bubble objects is determined by the total XML elements named "bubble"
|
||||
bubbles = new Bubble[bubbleData.size()];
|
||||
|
||||
for (int i = 0; i < bubbleData.size(); i++) {
|
||||
/*JSONObject bubble = bubbleData.getJSONObject(i);
|
||||
JSONObject position = bubble.getJSONObject("position");
|
||||
int x = position.getInt("x");
|
||||
int y = position.getInt("y");
|
||||
|
||||
float diameter = (float)bubble.getDouble("diameter");
|
||||
String label = bubble.getString("label");
|
||||
|
||||
bubbles[i] = new Bubble(x, y, diameter, label);*/
|
||||
}
|
||||
}
|
||||
|
||||
// Still need to work on adding and deleting
|
||||
|
||||
void mousePressed() {
|
||||
|
||||
|
||||
// Create a new XML bubble element
|
||||
// XML bubble = xml.addChild("bubble");
|
||||
//
|
||||
// // Set the poisition element
|
||||
// XML position = bubble.addChild("position");
|
||||
// // Here we can set attributes as integers directly
|
||||
// position.setInt("x",mouseX);
|
||||
// position.setInt("y",mouseY);
|
||||
//
|
||||
// // Set the diameter element
|
||||
// XML diameter = bubble.addChild("diameter");
|
||||
// // Here for a node's content, we have to convert to a String
|
||||
// diameter.setContent("" + random(40,80));
|
||||
//
|
||||
// // Set a label
|
||||
// XML label = bubble.addChild("label");
|
||||
// label.setContent("New label");
|
||||
//
|
||||
//
|
||||
// // Here we are removing the oldest bubble if there are more than 10
|
||||
// XML[] children = xml.getChildren("bubble");
|
||||
// // If the XML file has more than 10 bubble elements
|
||||
// if (children.length > 10) {
|
||||
// // Delete the first one
|
||||
// xml.removeChild(children[0]);
|
||||
// }
|
||||
//
|
||||
// // Save a new XML file
|
||||
// saveXML(xml,"data/data.xml");
|
||||
//
|
||||
// // reload the new data
|
||||
// loadData();
|
||||
// XML bubble = xml.addChild("bubble");
|
||||
//
|
||||
// // Set the poisition element
|
||||
// XML position = bubble.addChild("position");
|
||||
// // Here we can set attributes as integers directly
|
||||
// position.setInt("x",mouseX);
|
||||
// position.setInt("y",mouseY);
|
||||
//
|
||||
// // Set the diameter element
|
||||
// XML diameter = bubble.addChild("diameter");
|
||||
// // Here for a node's content, we have to convert to a String
|
||||
// diameter.setContent("" + random(40,80));
|
||||
//
|
||||
// // Set a label
|
||||
// XML label = bubble.addChild("label");
|
||||
// label.setContent("New label");
|
||||
//
|
||||
//
|
||||
// // Here we are removing the oldest bubble if there are more than 10
|
||||
// XML[] children = xml.getChildren("bubble");
|
||||
// // If the XML file has more than 10 bubble elements
|
||||
// if (children.length > 10) {
|
||||
// // Delete the first one
|
||||
// xml.removeChild(children[0]);
|
||||
// }
|
||||
//
|
||||
// // Save a new XML file
|
||||
// saveXML(xml,"data/data.xml");
|
||||
//
|
||||
// // reload the new data
|
||||
// loadData();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"bubbles": {
|
||||
"bubble": [
|
||||
"bubbles": [
|
||||
{
|
||||
"position": {
|
||||
"x": 160,
|
||||
@@ -34,5 +33,4 @@
|
||||
"label": "Melancholy"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
// A Bubble class
|
||||
|
||||
class Bubble {
|
||||
float x,y;
|
||||
float diameter;
|
||||
String name;
|
||||
|
||||
boolean over = false;
|
||||
|
||||
// Create the Bubble
|
||||
Bubble(float x_, float y_, float diameter_, String s) {
|
||||
x = x_;
|
||||
y = y_;
|
||||
diameter = diameter_;
|
||||
name = s;
|
||||
}
|
||||
|
||||
// CHecking if mouse is over the Bubble
|
||||
void rollover(float px, float py) {
|
||||
float d = dist(px,py,x,y);
|
||||
if (d < diameter/2) {
|
||||
over = true;
|
||||
} else {
|
||||
over = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Display the Bubble
|
||||
void display() {
|
||||
stroke(0);
|
||||
strokeWeight(2);
|
||||
noFill();
|
||||
ellipse(x,y,diameter,diameter);
|
||||
if (over) {
|
||||
fill(0);
|
||||
textAlign(CENTER);
|
||||
text(name,x,y+diameter/2+20);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
/**
|
||||
* Loading XML Data
|
||||
* by Daniel Shiffman.
|
||||
*
|
||||
* This example demonstrates how to use loadJSON()
|
||||
* to retrieve data from a JSON file and make objects
|
||||
* from that data.
|
||||
*
|
||||
* Here is what the JSON looks like (partial):
|
||||
*
|
||||
{
|
||||
"bubbles": [
|
||||
{
|
||||
"position": {
|
||||
"x": 160,
|
||||
"y": 103
|
||||
},
|
||||
"diameter": 43.19838,
|
||||
"label": "Happy"
|
||||
},
|
||||
{
|
||||
"position": {
|
||||
"x": 372,
|
||||
"y": 137
|
||||
},
|
||||
"diameter": 52.42526,
|
||||
"label": "Sad"
|
||||
}
|
||||
]
|
||||
}
|
||||
*/
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
// An Array of Bubble objects
|
||||
Bubble[] bubbles;
|
||||
// A JSON object
|
||||
JSONObject json;
|
||||
|
||||
void setup() {
|
||||
size(640, 360);
|
||||
loadData();
|
||||
}
|
||||
|
||||
void draw() {
|
||||
background(255);
|
||||
// Display all bubbles
|
||||
for (Bubble b : bubbles) {
|
||||
b.display();
|
||||
b.rollover(mouseX, mouseY);
|
||||
}
|
||||
//
|
||||
// textAlign(LEFT);
|
||||
// fill(0);
|
||||
// text("Click to add bubbles.", 10, height-10);
|
||||
}
|
||||
|
||||
void loadData() {
|
||||
// Load JSON file
|
||||
String jsonString = join(loadStrings("data.json"), "\n");
|
||||
//println(jsonString);
|
||||
|
||||
try {
|
||||
json = new JSONObject(jsonString);
|
||||
JSONArray bubbleData = json.getJSONArray("bubbles");
|
||||
|
||||
// The size of the array of Bubble objects is determined by the total XML elements named "bubble"
|
||||
bubbles = new Bubble[bubbleData.length()];
|
||||
|
||||
for (int i = 0; i < bubbleData.length(); i++) {
|
||||
JSONObject bubble = bubbleData.getJSONObject(i);
|
||||
JSONObject position = bubble.getJSONObject("position");
|
||||
int x = position.getInt("x");
|
||||
int y = position.getInt("y");
|
||||
|
||||
float diameter = (float)bubble.getDouble("diameter");
|
||||
String label = bubble.getString("label");
|
||||
|
||||
bubbles[i] = new Bubble(x, y, diameter, label);
|
||||
}
|
||||
}
|
||||
catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// Still need to work on adding and deleting
|
||||
|
||||
void mousePressed() {
|
||||
|
||||
// Create a new XML bubble element
|
||||
// XML bubble = xml.addChild("bubble");
|
||||
//
|
||||
// // Set the poisition element
|
||||
// XML position = bubble.addChild("position");
|
||||
// // Here we can set attributes as integers directly
|
||||
// position.setInt("x",mouseX);
|
||||
// position.setInt("y",mouseY);
|
||||
//
|
||||
// // Set the diameter element
|
||||
// XML diameter = bubble.addChild("diameter");
|
||||
// // Here for a node's content, we have to convert to a String
|
||||
// diameter.setContent("" + random(40,80));
|
||||
//
|
||||
// // Set a label
|
||||
// XML label = bubble.addChild("label");
|
||||
// label.setContent("New label");
|
||||
//
|
||||
//
|
||||
// // Here we are removing the oldest bubble if there are more than 10
|
||||
// XML[] children = xml.getChildren("bubble");
|
||||
// // If the XML file has more than 10 bubble elements
|
||||
// if (children.length > 10) {
|
||||
// // Delete the first one
|
||||
// xml.removeChild(children[0]);
|
||||
// }
|
||||
//
|
||||
// // Save a new XML file
|
||||
// saveXML(xml,"data/data.xml");
|
||||
//
|
||||
// // reload the new data
|
||||
// loadData();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"bubbles": [
|
||||
{
|
||||
"position": {
|
||||
"x": 160,
|
||||
"y": 103
|
||||
},
|
||||
"diameter": 43.19838,
|
||||
"label": "Happy"
|
||||
},
|
||||
{
|
||||
"position": {
|
||||
"x": 372,
|
||||
"y": 137
|
||||
},
|
||||
"diameter": 52.42526,
|
||||
"label": "Sad"
|
||||
},
|
||||
{
|
||||
"position": {
|
||||
"x": 273,
|
||||
"y": 235
|
||||
},
|
||||
"diameter": 61.14072,
|
||||
"label": "Joyous"
|
||||
},
|
||||
{
|
||||
"position": {
|
||||
"x": 121,
|
||||
"y": 179
|
||||
},
|
||||
"diameter": 44.758068,
|
||||
"label": "Melancholy"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user