use of net.drewke.tdme.engine.subsystems.particlesystem.PointsParticleSystemEntityInternal in project tdme by andreasdr.
the class Object3DVBORenderer method render.
/**
* Render batch VBO renderer points entities
* @param points batch VBO renderer points
*/
public void render(ArrayList<PointsParticleSystemEntity> visiblePses) {
if (visiblePses.size() == 0)
return;
// store model view matrix
modelViewMatrix.set(renderer.getModelViewMatrix());
//
boolean depthBuffer = false;
// set up GL state
renderer.enableBlending();
renderer.disableDepthBuffer();
renderer.disableClientState(renderer.CLIENTSTATE_NORMAL_ARRAY);
renderer.enableClientState(renderer.CLIENTSTATE_COLOR_ARRAY);
// disable texturing client state if not yet done
if (renderer.renderingTexturingClientState == false) {
renderer.enableClientState(renderer.CLIENTSTATE_TEXTURECOORD_ARRAY);
renderer.renderingTexturingClientState = true;
}
// model view matrix
renderer.getModelViewMatrix().identity();
renderer.onUpdateModelViewMatrix();
// find all keys which differentiate with effect colors and depth buffer
for (int i = 0; i < visiblePses.size(); i++) {
PointsParticleSystemEntityInternal ppse = visiblePses.get(i);
Key key = pseKeyPool.allocate();
createPseKey(key, ppse.getEffectColorAdd(), ppse.getEffectColorMul(), ppse.isPickable(), ppse.getParticleEmitter().getColorStart().equals(ppse.getParticleEmitter().getColorEnd()) == false);
if (pseKeys.contains(key) == false) {
pseKeys.add(key);
} else {
pseKeyPool.release(key);
}
}
// process each key in inner loop
Key innerPseKey = pseKeyPool.allocate();
for (int i = 0; i < pseKeys.size(); i++) {
// fetch key from available keys
Key pseKey = pseKeys.get(i);
boolean pseSort = false;
PointsParticleSystemEntityInternal currentPse = null;
// iterate all pses
for (int j = 0; j < visiblePses.size(); j++) {
PointsParticleSystemEntityInternal ppse = visiblePses.get(j);
// check if ppse belongs to current key, otherwise skip this pse
createPseKey(innerPseKey, ppse.getEffectColorAdd(), ppse.getEffectColorMul(), ppse.isPickable(), ppse.getParticleEmitter().getColorStart().equals(ppse.getParticleEmitter().getColorEnd()) == false);
if (pseKey.equals(innerPseKey) == false) {
continue;
} else {
currentPse = visiblePses.get(j);
pseSort = ppse.getParticleEmitter().getColorStart().equals(ppse.getParticleEmitter().getColorEnd()) == false;
}
// merge ppse pool
pseTransparentRenderPointsPool.merge(ppse.getRenderPointsPool());
}
// sort
if (pseSort == true)
pseTransparentRenderPointsPool.sort();
// put sorted points into batch renderer
for (TransparentRenderPoint point : pseTransparentRenderPointsPool.getTransparentRenderPointsIterator()) {
if (point.acquired == false)
break;
psePointBatchVBORenderer.addPoint(point);
}
//
renderer.setEffectColorAdd(currentPse.getEffectColorAdd().getArray());
renderer.setEffectColorMul(currentPse.getEffectColorMul().getArray());
renderer.onUpdateEffect();
depthBuffer = currentPse.isPickable();
if (depthBuffer) {
renderer.enableDepthBuffer();
} else {
renderer.disableDepthBuffer();
}
// render, clear
psePointBatchVBORenderer.render();
psePointBatchVBORenderer.clear();
// reset pool
pseTransparentRenderPointsPool.reset();
}
// release pse keys and current pse key
for (int i = 0; i < pseKeys.size(); i++) {
pseKeyPool.release(pseKeys.get(i));
}
pseKeys.clear();
pseKeyPool.release(innerPseKey);
// restore gl state
renderer.disableBlending();
if (depthBuffer == false)
renderer.enableDepthBuffer();
renderer.unbindBufferObjects();
renderer.enableClientState(renderer.CLIENTSTATE_NORMAL_ARRAY);
renderer.disableClientState(renderer.CLIENTSTATE_COLOR_ARRAY);
renderer.getModelViewMatrix().set(modelViewMatrix);
}
Aggregations