use of net.drewke.tdme.engine.Entity in project tdme by andreasdr.
the class EntityBoundingVolumeView method updateModelBoundingVolume.
/**
* Update model bounding volume
* @param entity
* @param idx
*/
private void updateModelBoundingVolume(LevelEditorEntity entity, int idx) {
LevelEditorEntityBoundingVolume entityBoundingVolume = entity.getBoundingVolumeAt(idx);
// remove old bv
String id = EntityBoundingVolumeSubScreenController.MODEL_BOUNDINGVOLUME_IDS[idx];
Entity modelBoundingVolumeObject = engine.getEntity(id);
if (modelBoundingVolumeObject != null) {
engine.removeEntity(id);
}
// add new bv
if (entityBoundingVolume.getModel() == null)
return;
modelBoundingVolumeObject = new Object3D(id, entityBoundingVolume.getModel());
modelBoundingVolumeObject.setEnabled(false);
engine.addEntity(modelBoundingVolumeObject);
}
use of net.drewke.tdme.engine.Entity in project tdme by andreasdr.
the class PointsParticleSystemEntityInternal method updateParticles.
/*
* (non-Javadoc)
* @see net.drewke.tdme.engine.subsystems.particlesystem.ParticleSystemEntity#update(net.drewke.tdme.engine.Engine)
*/
public void updateParticles() {
if (enabled == false || active == false)
return;
// bounding box transformed min, max xyz
float[] bbMinXYZ = boundingBoxTransformed.getMin().getArray();
float[] bbMaxXYZ = boundingBoxTransformed.getMax().getArray();
//
boolean haveBoundingBox = false;
//
float distanceFromCamera;
Matrix4x4 modelViewMatrix = renderer.getModelViewMatrix();
// compute distance from camera
distanceFromCamera = -point.getZ();
// process particles
pointsRenderPool.reset();
int activeParticles = 0;
long timeDelta = engine.getTiming().getDeltaTime();
for (int i = 0; i < particles.length; i++) {
Particle particle = particles[i];
if (particle.active == false)
continue;
// life time
particle.lifeTimeCurrent += timeDelta;
// crop to max life time
if (particle.lifeTimeCurrent >= particle.lifeTimeMax) {
particle.active = false;
continue;
}
// add gravity if our particle have a noticeable mass
if (particle.mass > MathTools.EPSILON)
particle.velocity.subY(0.5f * MathTools.g * (float) timeDelta / 1000f);
// TODO:
// maybe take air resistance into account like a huge paper needs more time to fall than a sphere of paper
// or heat for smoke or fire, whereas having no mass for those particles works around this problem for now
// translation
particle.position.add(velocityForTime.set(particle.velocity).scale((float) timeDelta / 1000f));
// color
float[] color = particle.color.getArray();
float[] colorAdd = particle.colorAdd.getArray();
color[0] += colorAdd[0] * (float) timeDelta;
color[1] += colorAdd[1] * (float) timeDelta;
color[2] += colorAdd[2] * (float) timeDelta;
color[3] += colorAdd[3] * (float) timeDelta;
// transform particle position to camera space
modelViewMatrix.multiply(particle.position, point);
// check for collision
if (doCollisionTests == true) {
for (Entity entity : engine.getPartition().getObjectsNearTo(particle.position)) {
// skip on our self
if (entity == this)
continue;
// skip on other particle systems
if (entity instanceof ParticleSystemEntity)
continue;
// do we have a collision?
if (entity.getBoundingBoxTransformed().containsPoint(particle.position)) {
particle.active = false;
continue;
}
}
}
//
activeParticles++;
// compute distance from camera
distanceFromCamera = -point.getZ();
// set up bounding box
float[] positionXYZ = particle.position.getArray();
if (haveBoundingBox == false) {
System.arraycopy(positionXYZ, 0, bbMinXYZ, 0, 3);
System.arraycopy(positionXYZ, 0, bbMaxXYZ, 0, 3);
haveBoundingBox = true;
} else {
if (positionXYZ[0] < bbMinXYZ[0])
bbMinXYZ[0] = positionXYZ[0];
if (positionXYZ[1] < bbMinXYZ[1])
bbMinXYZ[1] = positionXYZ[1];
if (positionXYZ[2] < bbMinXYZ[2])
bbMinXYZ[2] = positionXYZ[2];
if (positionXYZ[0] > bbMaxXYZ[0])
bbMaxXYZ[0] = positionXYZ[0];
if (positionXYZ[1] > bbMaxXYZ[1])
bbMaxXYZ[1] = positionXYZ[1];
if (positionXYZ[2] > bbMaxXYZ[2])
bbMaxXYZ[2] = positionXYZ[2];
}
//
pointsRenderPool.addPoint(point, particle.color, distanceFromCamera);
}
// auto disable particle system if no more active particles
if (activeParticles == 0) {
active = false;
return;
}
// scale a bit up to make picking work better
boundingBoxTransformed.getMin().sub(0.1f);
boundingBoxTransformed.getMax().add(0.1f);
// compute bounding boxes
boundingBoxTransformed.update();
boundingBox.fromBoundingVolumeWithTransformations(boundingBoxTransformed, inverseTransformation);
}
use of net.drewke.tdme.engine.Entity in project tdme by andreasdr.
the class EmptyView method initModel.
/**
* Init entity
*/
protected void initModel(GLAutoDrawable drawable) {
if (entity == null)
return;
// set up entity in engine
Tools.setupEntity(entity, engine, cameraRotationInputHandler.getLookFromRotations(), cameraRotationInputHandler.getScale());
// Make entity screenshot
Tools.oseThumbnail(drawable, entity);
// max axis dimension
cameraRotationInputHandler.setMaxAxisDimension(Tools.computeMaxAxisDimension(entity.getModel().getBoundingBox()));
// set up engine object settings
Entity model = engine.getEntity("model");
Entity ground = engine.getEntity("ground");
model.setDynamicShadowingEnabled(false);
ground.setEnabled(false);
Entity modelBoundingVolume = engine.getEntity("model_bv");
if (modelBoundingVolume != null) {
modelBoundingVolume.setEnabled(false);
}
//
updateGUIElements();
}
use of net.drewke.tdme.engine.Entity in project tdme by andreasdr.
the class LevelEditorView method objectPropertiesPreset.
/**
* Apply object property preset
* @param preset id
*/
public void objectPropertiesPreset(String presetId) {
if (selectedObjects.size() != 1)
return;
// handle single object
Entity selectedObject = selectedObjects.get(0);
LevelEditorObject levelEditorObject = level.getObjectById(selectedObject.getId());
if (levelEditorObject == null)
return;
// clear object properties
levelEditorObject.clearProperties();
// add object properties by preset if missing
ArrayList<PropertyModelClass> objectPropertyPresetVector = LevelPropertyPresets.getInstance().getObjectPropertiesPresets().get(presetId);
if (objectPropertyPresetVector != null) {
for (PropertyModelClass objectPropertyPreset : objectPropertyPresetVector) {
levelEditorObject.addProperty(objectPropertyPreset.getName(), objectPropertyPreset.getValue());
}
}
// update object properties to gui
levelEditorScreenController.setObjectProperties(presetId, levelEditorObject.getProperties(), null);
}
use of net.drewke.tdme.engine.Entity in project tdme by andreasdr.
the class LevelEditorView method updateGrid.
/**
* Update dynamic grid
*/
private void updateGrid() {
// check if to display grid
if (gridEnabled == false)
return;
// TODO: use pool
// check if to move grid
int centerX = (int) gridCenter.getX();
int centerZ = (int) gridCenter.getZ();
int centerLastX = gridCenterLast == null ? centerX : (int) gridCenterLast.getX();
int centerLastZ = gridCenterLast == null ? centerZ : (int) gridCenterLast.getZ();
if (gridCenterLast != null && (centerLastX != centerX || centerLastZ != centerZ) == false) {
return;
}
int gridDimensionLeft = GRID_DIMENSION_X + (centerLastX < centerX ? centerX - centerLastX : 0);
int gridDimensionRight = GRID_DIMENSION_X + (centerLastX > centerX ? centerLastX - centerX : 0);
int gridDimensionNear = GRID_DIMENSION_Y + (centerLastZ < centerZ ? centerZ - centerLastZ : 0);
int gridDimensionFar = GRID_DIMENSION_Y + (centerLastZ > centerZ ? centerLastZ - centerZ : 0);
// create ground plates
int addedCells = 0;
int removedCells = 0;
int reAddedCells = 0;
for (int gridZ = -gridDimensionNear; gridZ < gridDimensionFar; gridZ++) for (int gridX = -gridDimensionLeft; gridX < gridDimensionRight; gridX++) {
String objectId = "leveleditor.ground@" + (centerX + gridX) + "," + (centerZ + gridZ);
Entity _object = engine.getEntity(objectId);
if (gridX < -GRID_DIMENSION_X || gridX >= GRID_DIMENSION_X || gridZ < -GRID_DIMENSION_Y || gridZ >= GRID_DIMENSION_Y) {
if (_object != null) {
engine.removeEntity(objectId);
removedCells++;
}
} else if (_object == null) {
_object = selectedObjectsById.get(objectId);
if (_object != null) {
engine.addEntity(_object);
reAddedCells++;
} else {
_object = new Object3D(objectId, levelEditorGround);
_object.getRotations().add(new Rotation(0f, level.getRotationOrder().getAxis0()));
_object.getRotations().add(new Rotation(0f, level.getRotationOrder().getAxis1()));
_object.getRotations().add(new Rotation(0f, level.getRotationOrder().getAxis2()));
_object.getTranslation().set(centerX + (float) gridX * groundPlateWidth, gridY - 0.05f, centerZ + (float) gridZ * groundPlateDepth);
//_object.setDynamicShadowingEnabled(false); // TODO
_object.setEnabled(true);
_object.setPickable(true);
_object.update();
setStandardObjectColorEffect(_object);
engine.addEntity(_object);
addedCells++;
}
}
}
// System.out.println("readded: " + reAddedCells + ", added: " + addedCells + ", removed: " + removedCells + ", total:" + engine.getEntityCount());
if (gridCenterLast == null)
gridCenterLast = new Vector3();
gridCenterLast.set(gridCenter);
}
Aggregations