use of net.drewke.tdme.math.Matrix4x4 in project tdme by andreasdr.
the class PointParticleEmitter method fromTransformations.
/*
* (non-Javadoc)
* @see net.drewke.tdme.engine.subsystems.particlesystem.ParticleEmitter#fromTransformations(net.drewke.tdme.engine.Transformations)
*/
public void fromTransformations(Transformations transformations) {
//
Matrix4x4 transformationsMatrix = transformations.getTransformationsMatrix();
// apply translations
transformationsMatrix.multiply(position, positionTransformed);
}
use of net.drewke.tdme.math.Matrix4x4 in project tdme by andreasdr.
the class Object3DBase method createTransformationsMatrices.
/**
* Creates all groups transformation matrices
* @param groups
* @depth
*/
protected void createTransformationsMatrices(HashMap<String, Group> groups) {
// iterate through groups
for (Group group : groups.getValuesIterator()) {
// put and associate transformation matrices with group
transformationsMatrices.put(group.getId(), new Matrix4x4().identity());
// calculate sub groups
HashMap<String, Group> subGroups = group.getSubGroups();
if (subGroups.size() > 0) {
createTransformationsMatrices(subGroups);
}
}
}
use of net.drewke.tdme.math.Matrix4x4 in project tdme by andreasdr.
the class ParticleSystemScreenController method setParticleSystemEmitter.
/**
* Set particle system emitter
*/
public void setParticleSystemEmitter() {
particleSystemEmitter.getActiveConditions().removeAll();
LevelEditorEntityParticleSystem particleSystem = view.getEntity().getParticleSystem();
switch(particleSystem.getEmitter()) {
case NONE:
{
particleSystemEmitters.getController().setValue(value.set(EMITTER_NONE));
particleSystemEmitter.getActiveConditions().add(EMITTER_NONE);
break;
}
case POINT_PARTICLE_EMITTER:
{
particleSystemEmitters.getController().setValue(value.set(EMITTER_POINTPARTICLEEMITTER));
particleSystemEmitter.getActiveConditions().add(EMITTER_POINTPARTICLEEMITTER);
PointParticleEmitter emitter = particleSystem.getPointParticleEmitter();
ppeCount.getController().setValue(value.set(emitter.getCount()));
ppeLifeTime.getController().setValue(value.set((int) emitter.getLifeTime()));
ppeLifeTimeRnd.getController().setValue(value.set((int) emitter.getLifeTimeRnd()));
ppeMass.getController().setValue(value.set(emitter.getMass(), 4));
ppeMassRnd.getController().setValue(value.set(emitter.getMassRnd(), 4));
ppePosition.getController().setValue(value.set(Tools.formatVector3(emitter.getPosition())));
ppeVelocity.getController().setValue(value.set(Tools.formatVector3(emitter.getVelocity())));
ppeVelocityRnd.getController().setValue(value.set(Tools.formatVector3(emitter.getVelocityRnd())));
ppeColorStart.getController().setValue(value.set(Tools.formatColor4(emitter.getColorStart())));
ppeColorEnd.getController().setValue(value.set(Tools.formatColor4(emitter.getColorEnd())));
break;
}
case BOUNDINGBOX_PARTICLE_EMITTER:
{
particleSystemEmitters.getController().setValue(value.set(EMITTER_BOUNDINGBOXPARTICLEEMITTER));
particleSystemEmitter.getActiveConditions().add(EMITTER_BOUNDINGBOXPARTICLEEMITTER);
BoundingBoxParticleEmitter emitter = particleSystem.getBoundingBoxParticleEmitters();
bbpeCount.getController().setValue(value.set(emitter.getCount()));
bbpeLifeTime.getController().setValue(value.set((int) emitter.getLifeTime()));
bbpeLifeTimeRnd.getController().setValue(value.set((int) emitter.getLifeTimeRnd()));
bbpeMass.getController().setValue(value.set(emitter.getMass(), 4));
bbpeMassRnd.getController().setValue(value.set(emitter.getMassRnd(), 4));
bbpeVelocity.getController().setValue(value.set(Tools.formatVector3(emitter.getVelocity())));
bbpeVelocityRnd.getController().setValue(value.set(Tools.formatVector3(emitter.getVelocityRnd())));
bbpeColorStart.getController().setValue(value.set(Tools.formatColor4(emitter.getColorStart())));
bbpeColorEnd.getController().setValue(value.set(Tools.formatColor4(emitter.getColorEnd())));
bbpeObbCenter.getController().setValue(value.set(Tools.formatVector3(emitter.getObbCenter())));
bbpeObbHalfextension.getController().setValue(value.set(Tools.formatVector3(emitter.getObbHalfextension())));
// set up rotation matrix to extract euler angles
Vector3 rotation = new Vector3();
Matrix4x4 rotationMatrix = new Matrix4x4().identity();
rotationMatrix.setAxes(emitter.getObbAxis0(), emitter.getObbAxis1(), emitter.getObbAxis2());
rotationMatrix.computeEulerAngles(rotation);
// set up rotation
bbpeObbRotationX.getController().setValue(value.set(Tools.formatFloat(rotation.getX())));
bbpeObbRotationY.getController().setValue(value.set(Tools.formatFloat(rotation.getY())));
bbpeObbRotationZ.getController().setValue(value.set(Tools.formatFloat(rotation.getZ())));
break;
}
case CIRCLE_PARTICLE_EMITTER:
{
particleSystemEmitters.getController().setValue(value.set(EMITTER_CIRCLEPARTICLEEMITTER));
particleSystemEmitter.getActiveConditions().add(EMITTER_CIRCLEPARTICLEEMITTER);
CircleParticleEmitter emitter = particleSystem.getCircleParticleEmitter();
cpeCount.getController().setValue(value.set(emitter.getCount()));
cpeLifeTime.getController().setValue(value.set((int) emitter.getLifeTime()));
cpeLifeTimeRnd.getController().setValue(value.set((int) emitter.getLifeTimeRnd()));
cpeMass.getController().setValue(value.set(emitter.getMass(), 4));
cpeMassRnd.getController().setValue(value.set(emitter.getMassRnd(), 4));
cpeVelocity.getController().setValue(value.set(Tools.formatVector3(emitter.getVelocity())));
cpeVelocityRnd.getController().setValue(value.set(Tools.formatVector3(emitter.getVelocityRnd())));
cpeColorStart.getController().setValue(value.set(Tools.formatColor4(emitter.getColorStart())));
cpeColorEnd.getController().setValue(value.set(Tools.formatColor4(emitter.getColorEnd())));
cpeCenter.getController().setValue(value.set(Tools.formatVector3(emitter.getCenter())));
cpeRadius.getController().setValue(value.set(emitter.getRadius(), 4));
// set up rotation matrix to extract euler angles
Vector3 rotation = new Vector3();
Matrix4x4 rotationMatrix = new Matrix4x4().identity();
rotationMatrix.setAxes(emitter.getAxis0(), Vector3.computeCrossProduct(emitter.getAxis0(), emitter.getAxis1()), emitter.getAxis1());
rotationMatrix.computeEulerAngles(rotation);
// set up rotation
cpeRotationX.getController().setValue(value.set(Tools.formatFloat(rotation.getX())));
cpeRotationY.getController().setValue(value.set(Tools.formatFloat(rotation.getY())));
cpeRotationZ.getController().setValue(value.set(Tools.formatFloat(rotation.getZ())));
break;
}
case CIRCLE_PARTICLE_EMITTER_PLANE_VELOCITY:
{
particleSystemEmitters.getController().setValue(value.set(EMITTER_CIRCLEPARTICLEEMITTERPLANEVELOCITY));
particleSystemEmitter.getActiveConditions().add(EMITTER_CIRCLEPARTICLEEMITTERPLANEVELOCITY);
CircleParticleEmitterPlaneVelocity emitter = particleSystem.getCircleParticleEmitterPlaneVelocity();
cpepvCount.getController().setValue(value.set(emitter.getCount()));
cpepvLifeTime.getController().setValue(value.set((int) emitter.getLifeTime()));
cpepvLifeTimeRnd.getController().setValue(value.set((int) emitter.getLifeTimeRnd()));
cpepvMass.getController().setValue(value.set(emitter.getMass(), 4));
cpepvMassRnd.getController().setValue(value.set(emitter.getMassRnd(), 4));
cpepvVelocity.getController().setValue(value.set(emitter.getVelocity(), 4));
cpepvVelocityRnd.getController().setValue(value.set(emitter.getVelocityRnd(), 4));
cpepvColorStart.getController().setValue(value.set(Tools.formatColor4(emitter.getColorStart())));
cpepvColorEnd.getController().setValue(value.set(Tools.formatColor4(emitter.getColorEnd())));
cpepvCenter.getController().setValue(value.set(Tools.formatVector3(emitter.getCenter())));
cpepvRadius.getController().setValue(value.set(emitter.getRadius(), 4));
// set up rotation matrix to extract euler angles
Vector3 rotation = new Vector3();
Matrix4x4 rotationMatrix = new Matrix4x4().identity();
rotationMatrix.setAxes(emitter.getAxis0(), Vector3.computeCrossProduct(emitter.getAxis0(), emitter.getAxis1()), emitter.getAxis1());
rotationMatrix.computeEulerAngles(rotation);
// set up rotation
cpepvRotationX.getController().setValue(value.set(Tools.formatFloat(rotation.getX())));
cpepvRotationY.getController().setValue(value.set(Tools.formatFloat(rotation.getY())));
cpepvRotationZ.getController().setValue(value.set(Tools.formatFloat(rotation.getZ())));
break;
}
case SPHERE_PARTICLE_EMITTER:
{
particleSystemEmitters.getController().setValue(value.set(EMITTER_SPHEREPARTICLEEMITTER));
particleSystemEmitter.getActiveConditions().add(EMITTER_SPHEREPARTICLEEMITTER);
SphereParticleEmitter emitter = particleSystem.getSphereParticleEmitter();
speCount.getController().setValue(value.set(emitter.getCount()));
speLifeTime.getController().setValue(value.set((int) emitter.getLifeTime()));
speLifeTimeRnd.getController().setValue(value.set((int) emitter.getLifeTimeRnd()));
speMass.getController().setValue(value.set(emitter.getMass(), 4));
speMassRnd.getController().setValue(value.set(emitter.getMassRnd(), 4));
speVelocity.getController().setValue(value.set(Tools.formatVector3(emitter.getVelocity())));
speVelocityRnd.getController().setValue(value.set(Tools.formatVector3(emitter.getVelocityRnd())));
speColorStart.getController().setValue(value.set(Tools.formatColor4(emitter.getColorStart())));
speColorEnd.getController().setValue(value.set(Tools.formatColor4(emitter.getColorEnd())));
speCenter.getController().setValue(value.set(Tools.formatVector3(emitter.getCenter())));
speRadius.getController().setValue(value.set(emitter.getRadius(), 4));
break;
}
default:
System.out.println("ParticleSystemScreenController::onParticleSystemEmitterApply(): unknown particle system emitter '" + particleSystem.getEmitter() + "'");
}
// re init entity in view
view.initParticleSystem();
}
use of net.drewke.tdme.math.Matrix4x4 in project tdme by andreasdr.
the class EntityBoundingVolumeSubScreenController method setupOrientedBoundingBox.
/**
* Setup oriented bounding box
* @param idx
* @param center
* @param axis 0
* @param axis 1
* @param axis 2
* @param half extension
*/
public void setupOrientedBoundingBox(int idx, Vector3 center, Vector3 axis0, Vector3 axis1, Vector3 axis2, Vector3 halfExtension) {
// set up rotation maxtrix
Vector3 rotation = new Vector3();
Matrix4x4 rotationMatrix = new Matrix4x4().identity();
rotationMatrix.setAxes(axis0, axis1, axis2);
rotationMatrix.computeEulerAngles(rotation);
// set up obb in screen
selectBoundingVolume(idx, BoundingVolumeType.ORIENTEDBOUNDINGBOX);
boundingvolumeObbCenter[idx].getController().setValue(value.reset().append(Tools.formatFloat(center.getX())).append(", ").append(Tools.formatFloat(center.getY())).append(", ").append(Tools.formatFloat(center.getZ())));
boundingvolumeObbHalfextension[idx].getController().setValue(value.reset().append(Tools.formatFloat(halfExtension.getX())).append(", ").append(Tools.formatFloat(halfExtension.getY())).append(", ").append(Tools.formatFloat(halfExtension.getZ())));
boundingvolumeObbRotationX[idx].getController().setValue(value.set(Tools.formatFloat(rotation.getX())));
boundingvolumeObbRotationY[idx].getController().setValue(value.set(Tools.formatFloat(rotation.getY())));
boundingvolumeObbRotationZ[idx].getController().setValue(value.set(Tools.formatFloat(rotation.getZ())));
}
use of net.drewke.tdme.math.Matrix4x4 in project tdme by andreasdr.
the class DAEReader method readLevel.
/**
* Reads Collada DAE file level
* @param path name
* @param file name
* @throws Exception
* @return Model instance
*/
public static LevelEditorLevel readLevel(String pathName, String fileName) throws Exception {
// (re)create tm files folder
File tmFilesFolder = new File(pathName + "/" + fileName + "-models");
if (tmFilesFolder.exists()) {
tmFilesFolder.delete();
}
tmFilesFolder.mkdir();
// create level
LevelEditorLevel levelEditorLevel = new LevelEditorLevel();
LevelPropertyPresets.getInstance().setDefaultLevelProperties(levelEditorLevel);
// load dae xml document
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(FileSystem.getInstance().getInputStream(pathName, fileName));
Element xmlRoot = document.getDocumentElement();
// authoring tool
AuthoringTool authoringTool = getAuthoringTool(xmlRoot);
// up vector and rotation order
UpVector upVector = getUpVector(xmlRoot);
RotationOrder rotationOrder = null;
switch(upVector) {
case Y_UP:
rotationOrder = RotationOrder.ZYX;
case Z_UP:
rotationOrder = RotationOrder.YZX;
}
levelEditorLevel.setRotationOrder(rotationOrder);
// parse scene from xml
String xmlSceneId = null;
Element xmlScene = getChildrenByTagName(xmlRoot, "scene").get(0);
for (Element xmlInstanceVisualscene : getChildrenByTagName(xmlScene, "instance_visual_scene")) {
xmlSceneId = xmlInstanceVisualscene.getAttribute("url").substring(1);
}
// check for xml scene id
if (xmlSceneId == null) {
throw new ModelFileIOException("No scene id found");
}
// parse visual scenes
Element xmlLibraryVisualScenes = getChildrenByTagName(xmlRoot, "library_visual_scenes").get(0);
for (Element xmlLibraryVisualScene : getChildrenByTagName(xmlLibraryVisualScenes, "visual_scene")) {
String xmlVisualSceneId = xmlLibraryVisualScene.getAttribute("id");
if (xmlVisualSceneId.equals(xmlSceneId)) {
// default FPS
float fps = 30f;
// parse frames per second
List<Element> xmlExtraNodes = getChildrenByTagName(xmlLibraryVisualScene, "extra");
if (xmlExtraNodes.isEmpty() == false) {
Element xmlExtraNode = xmlExtraNodes.get(0);
for (Element xmlTechnique : getChildrenByTagName(xmlExtraNode, "technique")) {
List<Element> xmlFrameRateNodes = getChildrenByTagName(xmlTechnique, "frame_rate");
if (xmlFrameRateNodes.isEmpty() == false) {
fps = Float.parseFloat(xmlFrameRateNodes.get(0).getTextContent());
break;
}
}
}
// visual scene root nodes
LevelEditorEntityLibrary entityLibrary = levelEditorLevel.getEntityLibrary();
LevelEditorEntity emptyEntity = null;
int nodeIdx = 0;
for (Element xmlNode : getChildrenByTagName(xmlLibraryVisualScene, "node")) {
// derive model name from node id
String modelName = xmlNode.getAttribute("id");
// replace blender _|-NUMBER, not sure if this is a good idea for all cases, we will see
modelName = modelName.replaceAll("[\\-\\_]{1}+[0-9]+$", "");
// replace number at the end still, not sure if this is a good idea for all cases, we will see
modelName = modelName.replaceAll("[0-9]+$", "");
// check if name is available, if not extend with numbers :DDD
boolean haveName = entityLibrary.getEntityCount() == 0;
if (haveName == false) {
for (int i = 0; i < 10000; i++) {
haveName = true;
String modelNameTry = modelName + (i == 0 ? "" : String.valueOf(i));
for (int entityIdx = 0; entityIdx < entityLibrary.getEntityCount(); entityIdx++) {
LevelEditorEntity entity = entityLibrary.getEntityAt(entityIdx);
if (entity.getName().equals(modelNameTry) == true) {
haveName = false;
break;
}
}
if (haveName == true) {
modelName = modelNameTry;
break;
}
}
}
// do we have a name now?
if (haveName == false) {
// nope, cant imagine this will happen
System.out.println("DAEReader::readLevel(): Skipping model '" + modelName + "' as no name could be created for it.");
continue;
}
// create model
Model model = new Model(pathName + File.separator + fileName + '-' + modelName, fileName + '-' + modelName, upVector, rotationOrder, null);
// import matrix
setupModelImportRotationMatrix(xmlRoot, model);
Matrix4x4 modelImportRotationMatrix = new Matrix4x4(model.getImportTransformationsMatrix());
setupModelImportScaleMatrix(xmlRoot, model);
// translation, scaling, rotation
Vector3 translation = new Vector3();
Vector3 scale = new Vector3();
Vector3 rotation = new Vector3();
Vector3 xAxis = new Vector3();
Vector3 yAxis = new Vector3();
Vector3 zAxis = new Vector3();
// set up local transformations matrix
Matrix4x4 nodeTransformationsMatrix = null;
List<Element> xmlMatrixElements = getChildrenByTagName(xmlNode, "matrix");
if (xmlMatrixElements.size() == 1) {
String xmlMatrix = xmlMatrixElements.get(0).getTextContent();
StringTokenizer t = new StringTokenizer(xmlMatrix, " \n\r");
//
nodeTransformationsMatrix = new Matrix4x4(Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken())).transpose();
}
// check if we have node transformations matrix
if (nodeTransformationsMatrix == null) {
throw new ModelFileIOException("missing node transformations matrix for node " + xmlNode.getAttribute("id"));
}
// extract coordinate system axes
nodeTransformationsMatrix.getAxes(xAxis, yAxis, zAxis);
nodeTransformationsMatrix.getTranslation(translation);
nodeTransformationsMatrix.getScale(scale);
// normalize coordinate axes
xAxis.normalize();
yAxis.normalize();
zAxis.normalize();
// write back normalized x axis
nodeTransformationsMatrix.setAxes(xAxis, yAxis, zAxis);
// TODO: move me into Matrix4x4 decomposing code?
if ((upVector == UpVector.Y_UP && Vector3.computeDotProduct(Vector3.computeCrossProduct(xAxis, yAxis), zAxis) < 0.0f) || (upVector == UpVector.Z_UP && Vector3.computeDotProduct(Vector3.computeCrossProduct(xAxis, zAxis), yAxis) < 0.0f)) {
// negate axes
xAxis.scale(-1f);
yAxis.scale(-1f);
zAxis.scale(-1f);
// and write back to node transformation matrices
nodeTransformationsMatrix.setAxes(xAxis, yAxis, zAxis);
// scale
scale.scale(-1f);
}
// determine rotation
nodeTransformationsMatrix.computeEulerAngles(rotation);
// apply model import matrix
modelImportRotationMatrix.multiply(scale, scale);
modelImportRotationMatrix.multiply(rotation, rotation);
model.getImportTransformationsMatrix().multiply(translation, translation);
// set up frames per seconds
model.setFPS(fps);
// read sub groups
Group group = readVisualSceneNode(authoringTool, pathName, model, null, xmlRoot, xmlNode, fps);
if (group != null) {
group.getTransformationsMatrix().identity();
model.getSubGroups().put(group.getId(), group);
model.getGroups().put(group.getId(), group);
}
// set up joints
ModelHelper.setupJoints(model);
// fix animation length
ModelHelper.fixAnimationLength(model);
// prepare for indexed rendering
ModelHelper.prepareForIndexedRendering(model);
// check if empty model
EntityType entityType = EntityType.MODEL;
ModelStatistics modelStatistics = ModelUtilities.computeModelStatistics(model);
if (modelStatistics.getOpaqueFaceCount() == 0 && modelStatistics.getTransparentFaceCount() == 0) {
entityType = EntityType.EMPTY;
}
// level editor entity
LevelEditorEntity levelEditorEntity = null;
// model
if (entityType == EntityType.MODEL) {
// check if we have that model already
for (int i = 0; i < levelEditorLevel.getEntityLibrary().getEntityCount(); i++) {
LevelEditorEntity levelEditorEntityCompare = levelEditorLevel.getEntityLibrary().getEntityAt(i);
if (levelEditorEntityCompare.getType() != EntityType.MODEL)
continue;
if (ModelUtilities.equals(model, levelEditorEntityCompare.getModel()) == true) {
levelEditorEntity = levelEditorEntityCompare;
break;
}
}
// create level editor model, if not yet exists
if (levelEditorEntity == null) {
// save model
TMWriter.write(model, pathName + "/" + fileName + "-models", modelName + ".tm");
// create level editor entity
levelEditorEntity = entityLibrary.addModel(nodeIdx++, modelName, modelName, pathName + "/" + fileName + "-models", modelName + ".tm", new Vector3());
}
} else // empty
if (entityType == EntityType.EMPTY) {
if (emptyEntity == null) {
emptyEntity = entityLibrary.addEmpty(nodeIdx++, "Default Empty", "");
}
levelEditorEntity = emptyEntity;
} else {
System.out.println("DAEReader::readLevel(): unknown entity type. Skipping");
continue;
}
// level editor object transformations
Transformations levelEditorObjectTransformations = new Transformations();
levelEditorObjectTransformations.getTranslation().set(translation);
levelEditorObjectTransformations.getRotations().add(new Rotation(rotation.getArray()[rotationOrder.getAxis0VectorIndex()], rotationOrder.getAxis0()));
levelEditorObjectTransformations.getRotations().add(new Rotation(rotation.getArray()[rotationOrder.getAxis1VectorIndex()], rotationOrder.getAxis1()));
levelEditorObjectTransformations.getRotations().add(new Rotation(rotation.getArray()[rotationOrder.getAxis2VectorIndex()], rotationOrder.getAxis2()));
levelEditorObjectTransformations.getScale().set(scale);
levelEditorObjectTransformations.update();
// level editor object
LevelEditorObject object = new LevelEditorObject(xmlNode.getAttribute("id"), xmlNode.getAttribute("id"), levelEditorObjectTransformations, levelEditorEntity);
// add object to level
levelEditorLevel.addObject(object);
}
}
}
// save level
LevelFileExport.export(pathName + "/" + fileName + ".tl", levelEditorLevel);
//
return levelEditorLevel;
}
Aggregations