Revision 7691a39f
Added by Leszek Koltunski almost 8 years ago
src/main/java/org/distorted/library/Distorted.java | ||
---|---|---|
30 | 30 |
*/ |
31 | 31 |
public class Distorted |
32 | 32 |
{ |
33 |
/** |
|
34 |
* When creating an instance of a DistortedTexture (or Tree) from another instance, do not clone anything. |
|
35 |
* Used in the copy constructor. |
|
36 |
*/ |
|
37 |
public static final int CLONE_NOTHING = 0x0; |
|
38 | 33 |
/** |
39 | 34 |
* When creating an instance of a DistortedTexture from another instance, clone the Bitmap that's |
40 | 35 |
* backing up our DistortedTexture. |
... | ... | |
121 | 116 |
DistortedEffects.createProgram(resources); |
122 | 117 |
EffectQueuePostprocess.createProgram(resources); |
123 | 118 |
|
124 |
DistortedNode.reset(); |
|
125 | 119 |
EffectMessageSender.startSending(); |
126 | 120 |
|
127 | 121 |
mInitialized = true; |
src/main/java/org/distorted/library/DistortedNode.java | ||
---|---|---|
52 | 52 |
{ |
53 | 53 |
long ID; |
54 | 54 |
int numPointingNodes; |
55 |
int numRendered;
|
|
55 |
int numRender; |
|
56 | 56 |
ArrayList<Long> key; |
57 | 57 |
DistortedFramebuffer mFBO; |
58 | 58 |
|
... | ... | |
61 | 61 |
ID = id; |
62 | 62 |
key = k; |
63 | 63 |
numPointingNodes= 1; |
64 |
numRendered = 0;
|
|
64 |
numRender =-1;
|
|
65 | 65 |
mFBO = null; |
66 | 66 |
} |
67 | 67 |
} |
... | ... | |
81 | 81 |
ArrayList<Long> ret = new ArrayList<>(); |
82 | 82 |
|
83 | 83 |
ret.add( mSurface.getID() ); |
84 |
|
|
85 |
if( mNumChildren[0]==0 ) |
|
86 |
{ |
|
87 |
ret.add(-mEffects.getID()); |
|
88 |
} |
|
89 |
|
|
84 | 90 |
DistortedNode node; |
85 | 91 |
|
86 | 92 |
for(int i=0; i<mNumChildren[0]; i++) |
... | ... | |
92 | 98 |
return ret; |
93 | 99 |
} |
94 | 100 |
|
95 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
96 |
// this will be called on startup and every time OpenGL context has been lost |
|
97 |
|
|
98 |
static void reset() |
|
99 |
{ |
|
100 |
NodeData tmp; |
|
101 |
|
|
102 |
for(ArrayList<Long> key: mMapNodeID.keySet()) |
|
103 |
{ |
|
104 |
tmp = mMapNodeID.get(key); |
|
105 |
|
|
106 |
if( tmp.mFBO != null ) tmp.numRendered = 0; |
|
107 |
} |
|
108 |
} |
|
109 |
|
|
110 | 101 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
111 | 102 |
// Debug - print all the Node IDs |
112 | 103 |
|
... | ... | |
208 | 199 |
} |
209 | 200 |
|
210 | 201 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
202 |
// return the total number of render calls issued |
|
211 | 203 |
|
212 |
void drawRecursive(long currTime, DistortedOutputSurface surface)
|
|
204 |
int drawRecursive(int render, long currTime, DistortedOutputSurface surface)
|
|
213 | 205 |
{ |
206 |
int ret = 0; |
|
214 | 207 |
float halfX = mSurface.getWidth()/2.0f; |
215 | 208 |
float halfY = mSurface.getHeight()/2.0f; |
216 | 209 |
|
... | ... | |
220 | 213 |
} |
221 | 214 |
else |
222 | 215 |
{ |
223 |
if( mData.numRendered==0 )
|
|
216 |
if( mData.numRender!=render )
|
|
224 | 217 |
{ |
218 |
mData.numRender = render; |
|
225 | 219 |
mData.mFBO.setAsOutput(); |
226 | 220 |
|
227 | 221 |
GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); |
228 | 222 |
GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT); |
229 | 223 |
|
230 | 224 |
if( mSurface.setAsInput() ) |
231 |
DistortedEffects.drawNoEffectsPriv(halfX, halfY, mMesh, mData.mFBO ); |
|
225 |
{ |
|
226 |
ret++; |
|
227 |
DistortedEffects.drawNoEffectsPriv(halfX, halfY, mMesh, mData.mFBO); |
|
228 |
} |
|
232 | 229 |
|
233 | 230 |
for(int i=0; i<mNumChildren[0]; i++) |
234 | 231 |
{ |
235 |
mChildren.get(i).drawRecursive(currTime, mData.mFBO);
|
|
232 |
ret += mChildren.get(i).drawRecursive(render, currTime, mData.mFBO);
|
|
236 | 233 |
} |
237 | 234 |
} |
238 | 235 |
|
239 |
mData.numRendered++; |
|
240 |
mData.numRendered %= mData.numPointingNodes; |
|
241 | 236 |
mData.mFBO.setAsInput(); |
242 | 237 |
} |
243 | 238 |
|
244 | 239 |
mEffects.drawPriv(halfX, halfY, mMesh, surface, currTime); |
240 |
|
|
241 |
return ret+1; |
|
245 | 242 |
} |
246 | 243 |
|
247 | 244 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
265 | 262 |
|
266 | 263 |
ArrayList<Long> list = new ArrayList<>(); |
267 | 264 |
list.add(mSurface.getID()); |
265 |
list.add(-mEffects.getID()); |
|
268 | 266 |
|
269 | 267 |
mData = mMapNodeID.get(list); |
270 | 268 |
|
src/main/java/org/distorted/library/DistortedOutputSurface.java | ||
---|---|---|
27 | 27 |
|
28 | 28 |
abstract class DistortedOutputSurface extends DistortedSurface implements DistortedAttacheable |
29 | 29 |
{ |
30 |
private static int mRender = 0; |
|
31 |
|
|
30 | 32 |
private ArrayList<DistortedNode> mChildren; |
31 | 33 |
private int mNumChildren; // ==mChildren.length(), but we only create mChildren if the first one gets added |
32 | 34 |
|
... | ... | |
105 | 107 |
* Must be called from a thread holding OpenGL Context. |
106 | 108 |
* |
107 | 109 |
* @param time Current time, in milliseconds. This will be passed to all the Effects stored in the children Nodes. |
110 |
* @return Number of objects rendered. |
|
108 | 111 |
*/ |
109 |
public void render(long time)
|
|
112 |
public int render(long time)
|
|
110 | 113 |
{ |
114 |
mRender++; |
|
115 |
|
|
111 | 116 |
// change tree topology (attach and detach children) |
112 | 117 |
// create and delete all underlying OpenGL resources |
113 | 118 |
// Watch out: FIRST change topology, only then deal |
... | ... | |
125 | 130 |
mChildren.get(i).debug(0); |
126 | 131 |
} |
127 | 132 |
|
128 |
//DistortedNode.debugMap();
|
|
133 |
DistortedNode.debugMap(); |
|
129 | 134 |
} |
130 | 135 |
|
131 | 136 |
toDo(); |
... | ... | |
135 | 140 |
DistortedSurface.debugLists(); |
136 | 141 |
} |
137 | 142 |
|
143 |
int numRenders = 0; |
|
144 |
|
|
138 | 145 |
for(int i=0; i<mNumChildren; i++) |
139 | 146 |
{ |
140 |
mChildren.get(i).drawRecursive(time,this);
|
|
147 |
numRenders += mChildren.get(i).drawRecursive(mRender,time,this);
|
|
141 | 148 |
} |
149 |
|
|
150 |
return numRenders; |
|
142 | 151 |
} |
143 | 152 |
|
144 | 153 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
Also available in: Unified diff
- workaround for the issue with flashing in StarWars
- return number of objects rendered from OutputSurface.render() and use this in Olympic
- rework tree isomorphism so that it now works even if we don't render the whole tree (and also we don't have to reset() the Tree anymore!)
- current a buf with tree isomorphism: Leaf Nodes have the same NodeData only if they agree in Surface AND Effects!