Просмотр исходного кода

Added select all functionality to entity editor, added eye distance scale settings to Oculus module, added basic scene import support to polyimport (experimental)

Ivan Safrin 12 лет назад
Родитель
Сommit
cef68a6de2

+ 2 - 1
IDE/Contents/Include/PolycodeEditor.h

@@ -77,7 +77,8 @@ public:
 	
 	virtual String Copy(void **data) { return ""; }
 	virtual void Paste(void *data, String clipboardType) {}
-
+	virtual void selectAll() {}
+    
 	virtual void handleDroppedFile(OSFileEntry file, Number x, Number y) {};
 	
 	virtual ObjectEntry *getEditorConfig() { return NULL; }

+ 2 - 0
IDE/Contents/Include/PolycodeEntityEditor.h

@@ -179,6 +179,7 @@ class EntityEditorMainView : public UIElement {
     
             void disableLighting(bool disable);
             void selectNone(bool doAction);
+            void selectAll(bool doAction);
     
             void onGainFocus();
             void onLoseFocus();
@@ -298,6 +299,7 @@ class PolycodeEntityEditor : public PolycodeEditor {
     
         String Copy(void **data);
         void Paste(void *data, String clipboardType);
+        void selectAll();
         void destroyClipboardData(void *data, String type);
     
         void handleEvent(Event *event);

+ 7 - 1
IDE/Contents/Source/PolycodeEditor.cpp

@@ -61,7 +61,8 @@ PolycodeEditor::PolycodeEditor(bool _isReadOnly) : UIElement(), ClipboardProvide
 	core->addEventListener(this, Core::EVENT_COPY);
 	core->addEventListener(this, Core::EVENT_PASTE);
 	core->addEventListener(this, Core::EVENT_UNDO);	
-	core->addEventListener(this, Core::EVENT_REDO);	
+	core->addEventListener(this, Core::EVENT_REDO);
+	core->addEventListener(this, Core::EVENT_SELECT_ALL);
 }
 
 void PolycodeEditor::setHasChanges(bool newVal) {
@@ -88,6 +89,11 @@ void PolycodeEditor::handleEvent(Event *event) {
 			// Only copypaste of more complex IDE entities is handled here.
 			// Pure text copy/paste is handled in:
 			// Modules/Contents/UI/Source/PolyUITextInput.cpp
+			case Core::EVENT_SELECT_ALL:
+			{
+                selectAll();
+            }
+            break;
 			case Core::EVENT_COPY:
 			{
 				void *data = NULL;

+ 29 - 0
IDE/Contents/Source/PolycodeEntityEditor.cpp

@@ -1238,6 +1238,29 @@ void EntityEditorMainView::moveSelectedBottom() {
     }
 }
 
+void EntityEditorMainView::selectAll(bool doAction) {
+
+    if(doAction) {
+        beforeData = new PolycodeSceneEditorActionData();
+        for(int i=0; i < selectedEntities.size(); i++) {
+            beforeData->entries.push_back(PolycodeSceneEditorActionDataEntry(selectedEntities[i]));
+        }
+        
+        editor->didAction("select", beforeData, NULL, false);
+        beforeData = NULL;
+    }
+
+    selectedEntities.clear();
+    for(int i=0; i < objectRootInstance->getNumChildren(); i++) {
+        Entity *child = objectRootInstance->getChildAtIndex(i);
+        if(!child->editorOnly) {
+            selectEntity(child, true, false);
+        }
+    }
+    transformGizmo->setTransformSelection(selectedEntities);
+    dispatchEvent(new Event(), Event::CHANGE_EVENT);
+}
+
 void EntityEditorMainView::selectNone(bool doAction) {
     
     if(doAction) {
@@ -1913,6 +1936,12 @@ void PolycodeEntityEditor::destroyClipboardData(void *data, String type) {
     }
 }
 
+void PolycodeEntityEditor::selectAll() {
+    if(mainView->hasFocus) {
+        mainView->selectAll(true);
+    }
+}
+
 void PolycodeEntityEditor::Paste(void *data, String clipboardType) {
     if(!data) {
         return;

+ 28 - 9
Modules/Contents/OculusVR/PolycodeOVR.cpp

@@ -22,12 +22,16 @@
 
 #include "PolycodeOVR.h"
 
-PolycodeOVR::PolycodeOVR(Scene *parentScene) {
+PolycodeOVR::PolycodeOVR(Scene *parentScene, Number eyeDistanceScale) {
     
+    this->eyeDistanceScale = eyeDistanceScale;
     this->parentScene = parentScene;
     
     cameraRoot = new Entity();
     
+    cameraBase = new Entity();
+    cameraRoot->addChild(cameraBase);
+    
     leftCamera = new Camera(parentScene);
     rightCamera = new Camera(parentScene);
     
@@ -36,8 +40,8 @@ PolycodeOVR::PolycodeOVR(Scene *parentScene) {
     rightCamera->setClippingPlanes(0.001, 100.0);
     rightCamera->frustumCulling = false;
     
-    cameraRoot->addChild(leftCamera);
-    cameraRoot->addChild(rightCamera);
+    cameraBase->addChild(leftCamera);
+    cameraBase->addChild(rightCamera);
     
     initOVR();
 }
@@ -104,14 +108,13 @@ void PolycodeOVR::initOVR() {
     rightCamera->setProjectionMode(Camera::MANUAL_MATRIX);
     rightCamera->setProjectionMatrix(projRightPolycode);
     
-    
-    float    halfIPD  = hmd.InterpupillaryDistance * 0.5f;
-    
-    Number scale = 1.0;
-    
+    interpupilaryDistance = hmd.InterpupillaryDistance;
+    float halfIPD  = interpupilaryDistance * 0.5f * eyeDistanceScale;
     leftCamera->setPosition(-halfIPD, 0.0, 0.0);
     rightCamera->setPosition(halfIPD, 0.0, 0.0);
     
+    Number scale = 1.0;
+    
     leftCamera->setPostFilterByName("VRCorrect");
     leftCamera->getLocalShaderOptions()[0]->addParam(ProgramParam::PARAM_VECTOR2, "screenCenter")->setVector2(Vector2(0.5, 0.5));
     leftCamera->getLocalShaderOptions()[0]->addParam(ProgramParam::PARAM_VECTOR2, "lensCenter")->setVector2(Vector2(0.5, 0.5));
@@ -129,6 +132,18 @@ void PolycodeOVR::initOVR() {
     
 }
 
+Number PolycodeOVR::getEyeDistanceScale() {
+    return eyeDistanceScale;
+}
+
+void PolycodeOVR::setEyeDistanceScale(Number scale) {
+    this->eyeDistanceScale = scale;
+    float halfIPD  = interpupilaryDistance * 0.5f * eyeDistanceScale;
+    leftCamera->setPosition(-halfIPD, 0.0, 0.0);
+    rightCamera->setPosition(halfIPD, 0.0, 0.0);
+    
+}
+
 Texture *PolycodeOVR::getLeftTexture() {
     return leftTexture->getTargetTexture();
 }
@@ -141,13 +156,17 @@ void PolycodeOVR::Update() {
     Quaternion q;
     OVR::Quatf ovrQ = SFusion->GetOrientation();
     q.set(ovrQ.w, ovrQ.x, ovrQ.y, ovrQ.z);
-    cameraRoot->setRotationByQuaternion(q);
+    cameraBase->setRotationByQuaternion(q);
 }
 
 Entity *PolycodeOVR::getCameraRoot() {
     return cameraRoot;
 }
 
+Entity *PolycodeOVR::getCameraBase() {
+    return cameraBase;
+}
+
 PolycodeOVR::~PolycodeOVR() {
     if(cameraRoot->getParentEntity()) {
         cameraRoot->getParentEntity()->removeChild(cameraRoot);

+ 8 - 1
Modules/Contents/OculusVR/PolycodeOVR.h

@@ -27,7 +27,7 @@ using namespace Polycode;
 
 class PolycodeOVR {
     public:
-        PolycodeOVR(Scene *parentScene);
+        PolycodeOVR(Scene *parentScene, Number scale);
         ~PolycodeOVR();
     
         void initOVR();
@@ -37,15 +37,22 @@ class PolycodeOVR {
     
         void Update();
         Entity *getCameraRoot();
+        Entity *getCameraBase();
     
+        void setEyeDistanceScale(Number scale);
+        Number getEyeDistanceScale();
     protected:
     
+        float    interpupilaryDistance;
+        Number eyeDistanceScale;
+    
         OVR::Ptr<OVR::DeviceManager> pManager;
         OVR::Ptr<OVR::HMDDevice>     pHMD;
         OVR::Ptr<OVR::SensorDevice> pSensor;
         OVR::SensorFusion *SFusion;
     
         Entity *cameraRoot;
+        Entity *cameraBase;
     
         SceneRenderTexture *leftTexture;
         SceneRenderTexture *rightTexture;

+ 125 - 9
Tools/Contents/polyimport/Source/polyimport.cpp

@@ -1,6 +1,7 @@
 
 #include "polyimport.h"
 #include "OSBasics.h"
+#include "PolyObject.h"
 
 #include "physfs.h"
 #ifdef WIN32
@@ -35,7 +36,7 @@ unsigned int addBone(aiBone *bone) {
 	return bones.size()-1;
 }
 
-void addToMesh(String prefix, Polycode::Mesh *tmesh, const struct aiScene *sc, const struct aiNode* nd, bool swapZY, bool addSubmeshes, bool listOnly) {
+void addToMesh(String prefix, Polycode::Mesh *tmesh, const struct aiScene *sc, const struct aiNode* nd, bool swapZY, bool addSubmeshes, bool listOnly, ObjectEntry *parentSceneObject) {
 	int i, nIgnoredPolygons = 0;
 	unsigned int n = 0, t;
 	// draw all meshes assigned to this node
@@ -48,6 +49,9 @@ void addToMesh(String prefix, Polycode::Mesh *tmesh, const struct aiScene *sc, c
 		}
 	
 		const struct aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]];
+        
+        Vector3 bBox;
+        
 		if(listOnly) {
 			if(!addSubmeshes) {
 				printf("%s%s.mesh\n", prefix.c_str(), nd->mName.data);
@@ -106,6 +110,17 @@ void addToMesh(String prefix, Polycode::Mesh *tmesh, const struct aiScene *sc, c
             } else {
                 vertex->set(mesh->mVertices[index].x, mesh->mVertices[index].y, mesh->mVertices[index].z);
             }
+            
+            if(fabs(vertex->x) > bBox.x) {
+                bBox.x = vertex->x;
+            }
+            if(fabs(vertex->y) > bBox.y) {
+                bBox.y = vertex->y;
+            }
+            if(fabs(vertex->z) > bBox.z) {
+                bBox.z = vertex->z;
+            }
+            
             tmesh->addVertex(vertex);
 		}
         
@@ -129,16 +144,61 @@ void addToMesh(String prefix, Polycode::Mesh *tmesh, const struct aiScene *sc, c
 			tmesh->saveToFile(outFile, writeNormals, writeTangents, writeColors, writeBoneWeights, writeUVs, writeSecondaryUVs);
 			OSBasics::close(outFile);
 			delete tmesh;
+            
+            ObjectEntry *meshEntry = parentSceneObject->addChild("child");
+            meshEntry->addChild("id", String(nd->mName.data));
+            meshEntry->addChild("tags", "");
+            meshEntry->addChild("type", "SceneMesh");
+            meshEntry->addChild("cR", "1");
+            meshEntry->addChild("cG", "1");
+            meshEntry->addChild("cB", "1");
+            meshEntry->addChild("cA", "1");
+            meshEntry->addChild("blendMode", "0");
+            
+            aiVector3D p;
+            aiVector3D s;
+            aiQuaternion r;
+            nd->mTransformation.Decompose(s, r, p);
+            
+            meshEntry->addChild("sX", s.x);
+            meshEntry->addChild("sY", s.y);
+            meshEntry->addChild("sZ", s.z);
+
+            meshEntry->addChild("rX", r.x);
+            meshEntry->addChild("rY", r.y);
+            meshEntry->addChild("rZ", r.z);
+            meshEntry->addChild("rW", r.w);
+            
+            meshEntry->addChild("pX", p.x);
+            meshEntry->addChild("pY", p.y);
+            meshEntry->addChild("pZ", p.z);
+            
+            meshEntry->addChild("bbX", bBox.x);
+            meshEntry->addChild("bbY", bBox.y);
+            meshEntry->addChild("bbZ", bBox.z);
+            
+            ObjectEntry *sceneMeshEntry = meshEntry->addChild("SceneMesh");
+            sceneMeshEntry->addChild("file", fileNameMesh);
+            
+            String materialName = "Default";
+            int materialIndex = mesh->mMaterialIndex;
+            if(materialIndex < scene->mNumMaterials) {
+                aiString name;
+                scene->mMaterials[materialIndex]->Get(AI_MATKEY_NAME,name);
+                if(name.length > 0) {
+                    materialName = String(name.data);
+                }
+            }
+            sceneMeshEntry->addChild("material", materialName);
 		}
 		if (nIgnoredPolygons) {
 			printf("Ignored %d non-triangular polygons\n", nIgnoredPolygons);
 		}
 	}
-	
-
+	   
 	// draw all children
 	for (n = 0; n < nd->mNumChildren; ++n) {
-		addToMesh(prefix, tmesh, sc, nd->mChildren[n], swapZY, addSubmeshes, listOnly);
+		addToMesh(prefix, tmesh, sc, nd->mChildren[n], swapZY, addSubmeshes, listOnly, parentSceneObject);
 	}
 }
 
@@ -169,13 +229,46 @@ void addToISkeleton(ISkeleton *skel, IBone *parent, const struct aiScene *sc, co
 	skel->addIBone(bone, getBoneID(bone->name));
 }
 
-int exportToFile(String prefix, bool swapZY, bool addSubmeshes, bool listOnly) {
+int exportToFile(String prefix, bool swapZY, bool addSubmeshes, bool listOnly, bool exportEntity) {
+
+    Object sceneObject;
+    sceneObject.root.name = "entity";
+    ObjectEntry *parentEntry = sceneObject.root.addChild("root");
+    
+    parentEntry->addChild("id", "");
+    parentEntry->addChild("tags", "");
+    parentEntry->addChild("type", "Entity");
+    parentEntry->addChild("cR", "1");
+    parentEntry->addChild("cG", "1");
+    parentEntry->addChild("cB", "1");
+    parentEntry->addChild("cA", "1");
+    parentEntry->addChild("blendMode", "0");
+    parentEntry->addChild("sX", 1.0);
+    parentEntry->addChild("sY", 1.0);
+    parentEntry->addChild("sZ", 1.0);
+    
+    parentEntry->addChild("rX", 0.0);
+    parentEntry->addChild("rY", 0.0);
+    parentEntry->addChild("rZ", 0.0);
+    parentEntry->addChild("rW", 1.0);
+    
+    parentEntry->addChild("pX", 0.0);
+    parentEntry->addChild("pY", 0.0);
+    parentEntry->addChild("pZ", 0.0);
+    
+    parentEntry->addChild("bbX", 0.0);
+    parentEntry->addChild("bbY", 0.0);
+    parentEntry->addChild("bbZ", 0.0);
+    
+    ObjectEntry *children = parentEntry->addChild("children");
+
 		
 	Polycode::Mesh *mesh = new Polycode::Mesh(Mesh::TRI_MESH);
     mesh->indexedMesh = true;
-	addToMesh(prefix, mesh, scene, scene->mRootNode, swapZY, addSubmeshes, listOnly);
+	addToMesh(prefix, mesh, scene, scene->mRootNode, swapZY, addSubmeshes, listOnly, children);
+    
 	
-	if(addSubmeshes) {		
+	if(addSubmeshes) {
 		String fileNameMesh;
 		if(prefix != "") {
 			fileNameMesh = prefix+".mesh";			
@@ -255,6 +348,15 @@ int exportToFile(String prefix, bool swapZY, bool addSubmeshes, bool listOnly) {
 			printf("No weight data, skipping skeleton export...\n");
 		}
 	}
+    
+    if(!listOnly && exportEntity) {
+		String entityFileName;
+		if(prefix != "") {
+			entityFileName = prefix+".entity";
+		} else {
+			entityFileName = "out.entity";
+		}        sceneObject.saveToXML(entityFileName);
+    }
 
 	if(mesh) {
 		delete mesh;
@@ -273,12 +375,17 @@ int main(int argc, char **argv) {
 	bool addSubmeshes = false;
 	bool listOnly = false;
 	bool showAssimpDebug = false;
+    bool generateNormals = false;
+    bool exportEntity = false;
 	   
 	String prefix;
 	
 	int opt;
-	while ((opt = getopt(argc, argv, "ngcwuvadlhp:st")) != -1) {
+	while ((opt = getopt(argc, argv, "engcwuvadlhp:stm")) != -1) {
 		switch ((char)opt) {
+            case 'e':
+                exportEntity = true;
+            break;
             case 'n':
                 writeNormals = true;
             break;
@@ -303,6 +410,9 @@ int main(int argc, char **argv) {
 			case 't':
 				generateTangents = true;
 			break;
+			case 'm':
+				generateNormals = true;
+                break;
 			case 'a':
 				addSubmeshes = true;
 			break;
@@ -347,6 +457,7 @@ int main(int argc, char **argv) {
 		printf("Mesh import options:\n");
 		printf("a: Add all meshes to a single mesh.\n");
 		printf("s: Swap Z/Y axis (e.g. import from Blender)\n");
+		printf("m: Generate normals.\n");
 		printf("t: Generate tangents.\n\n");
 		printf("Mesh export options:\n");
 		printf("n: Export normals\n");
@@ -355,6 +466,7 @@ int main(int argc, char **argv) {
 		printf("w: Export bone weights\n");
 		printf("u: Export UV coordinates\n");
 		printf("v: Export secondary UV coordinates\n");
+		printf("e: Export entity scene\n");
 		printf("\n");
 		return 0;
 	}
@@ -377,12 +489,16 @@ int main(int argc, char **argv) {
                          aiProcess_Triangulate);
     
     if(scene) {
+
+        if(generateNormals && !listOnly) {
+            aiApplyPostProcessing(scene, aiProcess_GenSmoothNormals);
+        }
         
         if(generateTangents && !listOnly) {
             aiApplyPostProcessing(scene, aiProcess_CalcTangentSpace);
         }
         
-		exportToFile(prefix, swapZYAxis, addSubmeshes, listOnly);
+		exportToFile(prefix, swapZYAxis, addSubmeshes, listOnly, exportEntity);
 	} else {
 		printf("Error opening scene (%s)\n", aiGetErrorString());
 	}