use of net.drewke.tdme.tools.shared.model.LevelEditorEntity in project tdme by andreasdr.
the class EntityDisplayView method display.
/**
* Display
* @param entity
*/
public void display(LevelEditorEntity entity) {
// apply settings from gui
if (entity != null) {
// get model
Entity model = engine.getEntity("model");
// skip if no model yet
if (model == null)
return;
// apply display settings
Entity ground = engine.getEntity("ground");
model.setDynamicShadowingEnabled(displayShadowing);
ground.setEnabled(displayGroundPlate);
for (int i = 0; i < MODEL_BOUNDINGVOLUME_IDS.length; i++) {
Entity modelBoundingVolume = engine.getEntity(MODEL_BOUNDINGVOLUME_IDS[i]);
if (modelBoundingVolume != null) {
modelBoundingVolume.setEnabled(displayBoundingVolume);
}
}
}
}
use of net.drewke.tdme.tools.shared.model.LevelEditorEntity 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;
}
use of net.drewke.tdme.tools.shared.model.LevelEditorEntity in project tdme by andreasdr.
the class LevelEditorEntityLibraryScreenController method onDeleteEntity.
/**
* place model entity clicked
*/
public void onDeleteEntity() {
// check if we have a model selected
LevelEditorEntity entity = TDMELevelEditor.getInstance().getEntityLibrary().getEntity(Tools.convertToIntSilent(entityLibraryListBox.getController().getValue().toString()));
if (entity == null)
return;
//
TDMELevelEditor.getInstance().getLevel().removeObjectsByEntityId(entity.getId());
TDMELevelEditor.getInstance().getLevel().getEntityLibrary().removeEntity(entity.getId());
// set model library
setEntityLibrary();
//
View view = TDMELevelEditor.getInstance().getView();
if (view instanceof LevelEditorView) {
((LevelEditorView) view).loadLevel();
} else {
TDMELevelEditor.getInstance().switchToLevelEditor();
}
}
use of net.drewke.tdme.tools.shared.model.LevelEditorEntity in project tdme by andreasdr.
the class LevelEditorEntityLibraryScreenController method onEditEntity.
/**
* On edit entity
*/
public void onEditEntity() {
// check if we have a entity selected
LevelEditorEntity entity = TDMELevelEditor.getInstance().getEntityLibrary().getEntity(Tools.convertToIntSilent(entityLibraryListBox.getController().getValue().toString()));
if (entity == null)
return;
switch(entity.getType()) {
case MODEL:
// switch to model library view if not yet done
if (TDMELevelEditor.getInstance().getView() instanceof ModelViewerView == false) {
TDMELevelEditor.getInstance().switchToModelViewer();
}
// set model
((ModelViewerView) TDMELevelEditor.getInstance().getView()).setEntity(entity);
break;
case TRIGGER:
// switch to model trigger view if not yet done
if (TDMELevelEditor.getInstance().getView() instanceof TriggerView == false) {
TDMELevelEditor.getInstance().switchToTriggerView();
}
// set model
((TriggerView) TDMELevelEditor.getInstance().getView()).setEntity(entity);
break;
case EMPTY:
// switch to model trigger view if not yet done
if (TDMELevelEditor.getInstance().getView() instanceof EmptyView == false) {
TDMELevelEditor.getInstance().switchToEmptyView();
}
// set model
((EmptyView) TDMELevelEditor.getInstance().getView()).setEntity(entity);
break;
case PARTICLESYSTEM:
// switch to model trigger view if not yet done
if (TDMELevelEditor.getInstance().getView() instanceof ParticleSystemView == false) {
TDMELevelEditor.getInstance().switchToParticleSystemView();
}
// set model
((ParticleSystemView) TDMELevelEditor.getInstance().getView()).setEntity(entity);
break;
}
// button enabled
buttonEntityPlace.getController().setDisabled(true);
buttonLevelEdit.getController().setDisabled(false);
}
use of net.drewke.tdme.tools.shared.model.LevelEditorEntity in project tdme by andreasdr.
the class LevelEditorEntityLibraryScreenController method onPlaceEntity.
/**
* place object button clicked
*/
public void onPlaceEntity() {
// check if we have a model selected
LevelEditorEntity entity = TDMELevelEditor.getInstance().getEntityLibrary().getEntity(Tools.convertToIntSilent(entityLibraryListBox.getController().getValue().toString()));
if (entity == null)
return;
// place object
View view = TDMELevelEditor.getInstance().getView();
if (view instanceof LevelEditorView) {
((LevelEditorView) view).placeObject();
}
}
Aggregations