Search in sources :

Example 1 with PointsParticleSystemEntityInternal

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);
}
Also used : Key(net.drewke.tdme.utils.Key) PointsParticleSystemEntityInternal(net.drewke.tdme.engine.subsystems.particlesystem.PointsParticleSystemEntityInternal)

Aggregations

PointsParticleSystemEntityInternal (net.drewke.tdme.engine.subsystems.particlesystem.PointsParticleSystemEntityInternal)1 Key (net.drewke.tdme.utils.Key)1