190 lines
6.2 KiB
Java
190 lines
6.2 KiB
Java
package org.atriasoft.ege.engines;
|
|
|
|
import java.util.Vector;
|
|
|
|
import org.atriasoft.ege.Component;
|
|
import org.atriasoft.ege.Engine;
|
|
import org.atriasoft.ege.Environement;
|
|
import org.atriasoft.ege.camera.Camera;
|
|
import org.atriasoft.ege.components.ComponentRender;
|
|
|
|
public class EngineRender extends Engine {
|
|
public static final String ENGINE_NAME = "render";
|
|
private static float TIME_STEP = 5.0f;
|
|
private float accumulator = 0;
|
|
private final Vector<ComponentRender> components = new Vector<ComponentRender>();
|
|
private final Vector<ResultNearestElement> displayElementOrdered = new Vector<ResultNearestElement>();
|
|
|
|
//private ResourceColored3DObject debugDrawProperty;
|
|
public EngineRender(final Environement env) {
|
|
super(env);
|
|
// TODO Auto-generated constructor stub
|
|
}
|
|
|
|
@Override
|
|
public void componentAdd(final Component ref) {
|
|
if (ref instanceof ComponentRender == false) {
|
|
return;
|
|
}
|
|
this.components.add((ComponentRender) ref);
|
|
}
|
|
|
|
@Override
|
|
public void componentRemove(final Component ref) {
|
|
this.components.remove(ref);
|
|
}
|
|
|
|
@Override
|
|
public String getType() {
|
|
// TODO Auto-generated method stub
|
|
return ENGINE_NAME;
|
|
}
|
|
|
|
@Override
|
|
public void render(final long deltaMili, final Camera camera) {
|
|
//Log.info("Render ...");
|
|
//Matrix4f tmpMatrix;
|
|
for (final ComponentRender it : this.components) {
|
|
//Log.info("Render " + it);
|
|
it.render();
|
|
}
|
|
/*
|
|
getOrderedElementForDisplay(this.displayElementOrdered, camera->getEye(), camera->getViewVector());
|
|
Log.verbose("DRAW : " + this.displayElementOrdered.size() + "/" + this.component.size() + " elements");
|
|
|
|
// note : the first pass is done at the reverse way to prevent multiple display od the same point in the screen
|
|
// (and we remember that the first pass is to display all the non transparent elements)
|
|
for (int32t iii=this.displayElementOrdered.size()-1; iii >= 0; iii--) {
|
|
this.displayElementOrdered[iii].element->draw(0);
|
|
}
|
|
// for the other pass the user can draw transparent elements ...
|
|
for (int32t pass=1; pass <= NUMBEROFSUBPASS+1; pass++) {
|
|
for (auto &it: this.displayElementOrdered) {
|
|
it.element->draw(pass);
|
|
}
|
|
}
|
|
*/
|
|
|
|
}
|
|
|
|
// @Override
|
|
// public void renderDebug(long deltaMili, Camera camera) {
|
|
// //Log.debug("Draw (start)");
|
|
// Matrix4f tmpMatrix;
|
|
// getOrderedElementForDisplay(this.displayElementOrdered, camera->getEye(), camera->getViewVector());
|
|
// Log.verbose("DRAW : " + this.displayElementOrdered.size() + "/" + this.component.size() + " elements");
|
|
//// if (propertyDebugPhysic.get() == true) {
|
|
//// // Draw debug ... (Object)
|
|
//// for (int32t iii=this.displayElementOrdered.size()-1; iii >= 0; iii--) {
|
|
//// this.displayElementOrdered[iii].element->drawDebug(this.debugDrawProperty, camera);
|
|
//// }
|
|
//// // Draw debug ... (Camera)
|
|
//// /*
|
|
//// etk::Map<etk::String, ege::Camera>> listCamera = this.env->getCameraList();
|
|
//// for (auto &itCam : listCamera) {
|
|
//// if (itCam.second != null) {
|
|
//// itCam.second->drawDebug(this.debugDrawProperty, camera);
|
|
//// }
|
|
//// }
|
|
//// */
|
|
//// }
|
|
// if (propertyDebugNormal.get() == true) {
|
|
// // Draw debug ... (Object)
|
|
// for (int32t iii=this.displayElementOrdered.size()-1; iii >= 0; iii--) {
|
|
// this.displayElementOrdered[iii].element.drawNormalDebug(this.debugDrawProperty);
|
|
// }
|
|
// }
|
|
//// if (propertyDebugApplication.get() == true) {
|
|
//// // Draw debug ... (User)
|
|
//// signalDisplayDebug.emit(this.debugDrawProperty);
|
|
//// }
|
|
//// /* TODO set it back ...
|
|
//// if (camera != null) {
|
|
//// this.env->getParticuleEngine().draw(*camera);
|
|
//// }
|
|
//// */
|
|
//
|
|
// }
|
|
|
|
@Override
|
|
public void renderDebug(final long deltaMili, final Camera camera) {
|
|
// TODO Auto-generated method stub
|
|
|
|
}
|
|
|
|
@Override
|
|
public void update(final long deltaMili) {
|
|
// Add the time difference in the accumulator
|
|
this.accumulator += deltaMili * 0.0001f;
|
|
// While there is enough accumulated time to take one or several physics steps
|
|
while (this.accumulator >= TIME_STEP) {
|
|
// Log.warning("RENDER: Generate for " + accumulator + " / " + TIME_STEP + " for:" + components.size());
|
|
// call every object to usdate their constant forces applyed
|
|
for (final ComponentRender it : this.components) {
|
|
it.update(TIME_STEP);
|
|
}
|
|
// Decrease the accumulated time
|
|
this.accumulator -= TIME_STEP;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
// //ResourceColored3DObject debugDrawProperty;
|
|
// void getOrderedElementForDisplay(etk::Vector<ege::render::Engine::ResultNearestElement>& resultList,
|
|
// const vec3& position,
|
|
// const vec3& direction) {
|
|
// // TODO Set it back ... corrected...
|
|
// // remove all unneeded elements (old display...)
|
|
// resultList.clear();
|
|
// // basic element result
|
|
// ege::render::Engine::ResultNearestElement result;
|
|
// result.dist = 99999999999.0f;
|
|
// result.element = null;
|
|
// // for all element in the game we chek if it is needed to display it ...
|
|
// for (ComponentRender it: this.components) {
|
|
// // check null pointer
|
|
// if (it == null) {
|
|
// // no pointer null are set in the output list ...
|
|
// continue;
|
|
// }
|
|
// result.element = it;
|
|
// // check distance ...
|
|
// vec3 destPosition = result.element->getTransform().getPosition();
|
|
// vec3 angleView = (destPosition - position);
|
|
// angleView.safeNormalize();
|
|
// float dotResult = angleView.dot(direction);
|
|
// //Log.debug("Dot position : " + destPosition + " == > dot=" + dotResult);
|
|
// /*
|
|
// if (dotResult <= 0.85f) {
|
|
// // they are not in the camera angle view ... == > no need to process display
|
|
// continue;
|
|
// }
|
|
// */
|
|
// result.dist = (position - destPosition).length();
|
|
// /*
|
|
// if (result.dist>500.0f) {
|
|
// // The element is realy too far ... == > no need to display
|
|
// continue;
|
|
// }
|
|
// */
|
|
// // try to add the element at the best positions:
|
|
// sizet jjj;
|
|
// for (jjj=0; jjj<resultList.size(); jjj++) {
|
|
// if (resultList[jjj].dist>result.dist) {
|
|
// resultList.insert(resultList.begin()+jjj, result);
|
|
// break;
|
|
// }
|
|
// }
|
|
// // add element at the end :
|
|
// if (jjj >= resultList.size()) {
|
|
// resultList.pushBack(result);
|
|
// }
|
|
// }
|
|
// };
|
|
|
|
class ResultNearestElement {
|
|
public ComponentRender element;
|
|
public float dist;
|
|
}
|