Quellcode durchsuchen

Added ability to add entities into other entities in the entity editor, fixed removal of linked resource pools from entity property view, added shortcut to deselect all in entity editor (KEY_ESCAPE)

Ivan Safrin vor 12 Jahren
Ursprung
Commit
e0228cb5d3

+ 6 - 14
Core/Contents/Source/PolySceneEntityInstance.cpp

@@ -266,20 +266,12 @@ Entity *SceneEntityInstance::loadObjectEntryIntoEntity(ObjectEntry *entry, Entit
 
 	ObjectEntry *entityType = (*entry)["type"];
 	if(entityType) {
-			
-        
-        /*
-         
-         if(entityType->stringVal == "SceneEntityInstance") {
-         ObjectEntry *screenInstanceEntry = (*entry)["SceneEntityInstance"];
-         String filePath = (*screenInstanceEntry)["filePath"]->stringVal;
-         SceneEntityInstance *instance = new SceneEntityInstance(filePath);
-         entity = instance;
-         }
-         
-         */
-
-		if(entityType->stringVal == "SceneSprite") {
+        if(entityType->stringVal == "SceneEntityInstance") {
+            ObjectEntry *instanceEntry = (*entry)["SceneEntityInstance"];
+            String filePath = (*instanceEntry)["filePath"]->stringVal;
+            SceneEntityInstance *instance = new SceneEntityInstance(parentScene, filePath);
+            entity = instance;
+         } else if(entityType->stringVal == "SceneSprite") {
 			ObjectEntry *spriteEntry = (*entry)["SceneSprite"];
 			String filePath = (*spriteEntry)["filePath"]->stringVal;
 			

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

@@ -88,6 +88,7 @@ class SceneMeshSettings {
         ShaderBinding *shaderBinding;
 };
 
+
 class EntityEditorMainView : public UIElement {
 		public:
 			EntityEditorMainView();
@@ -110,13 +111,15 @@ class EntityEditorMainView : public UIElement {
     
             void setMaterialRecursive(const String &materialName, bool wireFrame, Entity *entity);
             void restoreSettingsRecursive(Entity *entity);
-    
+            void setOverlayWireframeRecursive(Entity *targetEntity, bool val);
+            void setLinkedEntityPropsRecursive(SceneEntityInstance *parentInstance, Entity *entity);
+        
             void onGainFocus();
             void onLoseFocus();
             void deleteSelected();
     
             Entity *getObjectRoot();
-            void setObjectRoot(Entity *entity);
+            void setObjectRoot(SceneEntityInstance *entity);
     
             Scene *getMainScene();
     
@@ -140,6 +143,10 @@ class EntityEditorMainView : public UIElement {
 			Scene *mainScene;
             Entity *sceneObjectRoot;
     
+            Entity *objectRootBase;
+            Entity *iconBase;
+            SceneEntityInstance *objectRootInstance;
+    
 			SceneRenderTexture *renderTexture;
 			UIRect *renderTextureShape;	
 

+ 1 - 1
IDE/Contents/Include/PolycodeProps.h

@@ -845,7 +845,7 @@ class LinkedMaterialsSheet : public PropSheet {
         SceneEntityInstance *instance;
         ButtonProp *addMaterialProp;
     
-        RemovableStringProp *propToRemove;
+        int poolRemoveIndex;
     
 };
 

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

@@ -71,6 +71,8 @@ class TransformGizmo : public Entity {
         static const int CENTER_MODE_MEDIAN = 0;
         static const int CENTER_MODE_INDIVIDUAL = 1;
     
+        bool enableGizmo;
+    
 	private:
         int transformMode;
         int gizmoMode;

+ 124 - 28
IDE/Contents/Source/PolycodeEntityEditor.cpp

@@ -210,6 +210,7 @@ void CameraPreviewWindow::setCamera(Scene *scene, Camera *camera) {
 EntityEditorMainView::EntityEditorMainView() {
 	processInputEvents = true;
     multiselectIndex = 0;
+    objectRootInstance = NULL;
 
 	mainScene = new Scene(Scene::SCENE_3D, true);
 	renderTexture = new SceneRenderTexture(mainScene, mainScene->getDefaultCamera(), 512, 512);
@@ -249,12 +250,20 @@ EntityEditorMainView::EntityEditorMainView() {
 	grid = new EditorGrid();
 	mainScene->addChild(grid);
 	
+    objectRootBase = new Entity();
+    mainScene->addChild(objectRootBase);
+    objectRootBase->processInputEvents = true;
+    
     sceneObjectRoot = new Entity();
     sceneObjectRoot->processInputEvents = true;
-    mainScene->addChild(sceneObjectRoot);
+    objectRootBase->addChild(sceneObjectRoot);
+    
+    iconBase = new Entity();
+    mainScene->addChild(iconBase);
+    iconBase->processInputEvents = true;
     
 	transformGizmo = new TransformGizmo(mainScene, mainScene->getDefaultCamera());
-    transformGizmo->enabled = false;
+    transformGizmo->enableGizmo = false;
     
 	mainScene->addChild(transformGizmo);		
 	trackballCamera = new TrackballCamera(mainScene->getDefaultCamera(), renderTextureShape);
@@ -338,12 +347,19 @@ void EntityEditorMainView::Update() {
     
     for(int i=0; i < icons.size(); i++) {
         Number scale;
+        
+        Entity *parentEntity = (Entity*) icons[i]->getUserData();
+        
+        Vector3 parentPosition = parentEntity->getConcatenatedMatrix().getPosition();
+        icons[i]->setPosition(parentPosition);
+        
         if(editorMode == EDITOR_MODE_2D) {
             scale = trackballCamera->getCameraDistance() * 0.1;
         } else {
             scale = mainScene->getDefaultCamera()->getPosition().distance(icons[i]->getConcatenatedMatrix().getPosition()) * 0.1;
         }
         icons[i]->setScale(scale, scale, scale);
+        icons[i]->rebuildTransformMatrix();
     }
 }
 
@@ -359,11 +375,12 @@ void EntityEditorMainView::createIcon(Entity *entity, String iconFile) {
         iconPrimitive->getLocalShaderOptions()->addTexture("diffuse", tex);
 	}
     
-    entity->addChild(iconPrimitive);
+    iconBase->addChild(iconPrimitive);
     iconPrimitive->billboardMode = true;
+    iconPrimitive->setUserData((void*)entity);
     iconPrimitive->processInputEvents = true;
     iconPrimitive->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-    
+    iconPrimitive->ignoreParentMatrix = true;
     iconPrimitive->addTag("");
     iconPrimitive->depthTest = false;
     iconPrimitive->depthWrite = false;
@@ -380,6 +397,26 @@ void EntityEditorMainView::setEditorPropsRecursive(Entity *entity) {
     }
 }
 
+void EntityEditorMainView::setLinkedEntityPropsRecursive(SceneEntityInstance *parentInstance, Entity *entity) {
+    SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(entity);
+    SceneParticleEmitter *emitter = dynamic_cast<SceneParticleEmitter*>(entity);
+    
+    entity->setUserData((void*)parentInstance);
+    entity->processInputEvents = true;
+    entity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
+    entity->editorOnly = true;
+    
+    if(sceneMesh && !emitter) {
+        sceneMesh->wireFrameColor = Color(0.2, 0.9, 0.6, 1.0);
+        sceneMesh->useGeometryHitDetection = true;
+    }
+ 
+    for(int i=0; i < entity->getNumChildren(); i++) {
+        setLinkedEntityPropsRecursive(parentInstance, entity->getChildAtIndex(i));
+    }
+
+}
+
 void EntityEditorMainView::setEditorProps(Entity *entity) {
     entity->processInputEvents = true;
     entity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
@@ -393,6 +430,13 @@ void EntityEditorMainView::setEditorProps(Entity *entity) {
         sceneMesh->useGeometryHitDetection = true;
     }
     
+    SceneEntityInstance *instance = dynamic_cast<SceneEntityInstance*>(entity);
+    if(instance && instance != objectRootInstance) {
+        for(int i=0; i < instance->getNumChildren(); i++) {
+            setLinkedEntityPropsRecursive(instance, instance->getChildAtIndex(i));
+        }
+    }
+    
     SceneLight *sceneLight = dynamic_cast<SceneLight*>(entity);
     if(sceneLight) {
         createIcon(entity, "light_icon.png");
@@ -519,6 +563,15 @@ void EntityEditorMainView::addEntityFromMenu(String command) {
         return;
     }
     
+    if(command == "add_entity") {
+        assetSelectType = "entity";
+        globalFrame->assetBrowser->addEventListener(this, UIEvent::OK_EVENT);
+        std::vector<String> extensions;
+        extensions.push_back("entity");
+        globalFrame->showAssetBrowser(extensions);
+        return;
+    }
+    
     if(command == "add_particles") {
         SceneParticleEmitter  *newEmitter = new SceneParticleEmitter(30, 3.0, 0.2);
         newEmitter->bBox = Vector3(0.5, 0.5, 0.5);
@@ -577,11 +630,11 @@ void EntityEditorMainView::deleteSelected() {
 }
 
 void EntityEditorMainView::onGainFocus() {
-    transformGizmo->enabled = true;
+    transformGizmo->enableGizmo = true;
 }
 
 void EntityEditorMainView::onLoseFocus() {
-    transformGizmo->enabled = false;
+    transformGizmo->enableGizmo = false;
 }
 
 void EntityEditorMainView::handleEvent(Event *event) {
@@ -595,14 +648,14 @@ void EntityEditorMainView::handleEvent(Event *event) {
     } else if(event->getDispatcher() == globalFrame->assetBrowser) {
         if(event->getEventCode() == UIEvent::OK_EVENT) {
             if(assetSelectType == "mesh") {
-                SceneMesh *newMesh = new SceneMesh(globalFrame->assetBrowser->getFullSelectedAssetPath());
+                SceneMesh *newMesh = new SceneMesh(globalFrame->assetBrowser->getSelectedAssetPath());
                 newMesh->cacheToVertexBuffer(true);
                 sceneObjectRoot->addChild(newMesh);
                 setEditorProps(newMesh);
                 newMesh->setPosition(cursorPosition);
                 selectEntity(newMesh);
             } else if(assetSelectType == "image") {
-                SceneImage *newImage = new SceneImage(globalFrame->assetBrowser->getFullSelectedAssetPath());
+                SceneImage *newImage = new SceneImage(globalFrame->assetBrowser->getSelectedAssetPath());
                 newImage->setMaterialByName("Unlit");
                 if(newImage->getLocalShaderOptions()) {
                     newImage->getLocalShaderOptions()->addTexture("diffuse", newImage->getTexture());
@@ -611,24 +664,29 @@ void EntityEditorMainView::handleEvent(Event *event) {
                 setEditorProps(newImage);
                 newImage->setPosition(cursorPosition);
                 selectEntity(newImage);
-        } else if(assetSelectType == "sprite") {
-            SceneSprite *newSprite = new SceneSprite(globalFrame->assetBrowser->getFullSelectedAssetPath());
-            
-            if(newSprite->getNumAnimations()) {
-                newSprite->playAnimation(newSprite->getAnimationAtIndex(0)->name, 0, false);
+            } else if(assetSelectType == "sprite") {
+                SceneSprite *newSprite = new SceneSprite(globalFrame->assetBrowser->getSelectedAssetPath());
+                
+                if(newSprite->getNumAnimations()) {
+                    newSprite->playAnimation(newSprite->getAnimationAtIndex(0)->name, 0, false);
+                }
+                
+                newSprite->setMaterialByName("Unlit");
+                if(newSprite->getLocalShaderOptions()) {
+                    newSprite->getLocalShaderOptions()->addTexture("diffuse", newSprite->getTexture());
+                }
+                sceneObjectRoot->addChild(newSprite);
+                setEditorProps(newSprite);
+                newSprite->setPosition(cursorPosition);
+                selectEntity(newSprite);
+            } else if(assetSelectType == "entity") {
+                SceneEntityInstance *newEntity = new SceneEntityInstance(mainScene, globalFrame->assetBrowser->getSelectedAssetPath());
+                sceneObjectRoot->addChild(newEntity);
+                setEditorProps(newEntity);
+                newEntity->setPosition(cursorPosition);
+                selectEntity(newEntity);
             }
             
-            newSprite->setMaterialByName("Unlit");
-            if(newSprite->getLocalShaderOptions()) {
-                newSprite->getLocalShaderOptions()->addTexture("diffuse", newSprite->getTexture());
-            }
-            sceneObjectRoot->addChild(newSprite);
-            setEditorProps(newSprite);
-            newSprite->setPosition(cursorPosition);
-            selectEntity(newSprite);
-        }
-        
-        
             globalFrame->assetBrowser->removeAllHandlersForListener(this);
             globalFrame->hideModal();
         }
@@ -666,6 +724,16 @@ void EntityEditorMainView::handleEvent(Event *event) {
                         deleteSelected();
                     }
                 break;
+                case KEY_ESCAPE:
+                {
+                    for(int i=0; i < selectedEntities.size(); i++) {
+                        doEntityDeselect(selectedEntities[i]);
+                    }
+                    selectedEntities.clear();
+                    transformGizmo->setTransformSelection(selectedEntities);
+                    dispatchEvent(new Event(), Event::CHANGE_EVENT);                    
+                }
+                break;
             }
         }
     } else if(event->getDispatcher() == shadeModeSelector) {
@@ -755,6 +823,22 @@ void EntityEditorMainView::doEntityDeselect(Entity *targetEntity) {
     if(sceneMesh) {
         sceneMesh->overlayWireframe = false;
     }
+    
+    SceneEntityInstance *instance = dynamic_cast<SceneEntityInstance*>(targetEntity);
+    if(instance) {
+        setOverlayWireframeRecursive(targetEntity, false);
+    }
+    
+}
+
+void EntityEditorMainView::setOverlayWireframeRecursive(Entity *targetEntity, bool val) {
+    SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(targetEntity);
+    if(sceneMesh) {
+        sceneMesh->overlayWireframe = val;
+    }
+    for(int i=0; i < targetEntity->getNumChildren(); i++) {
+        setOverlayWireframeRecursive(targetEntity->getChildAtIndex(i), val);
+    }
 }
 
 void EntityEditorMainView::doEntitySelect(Entity *targetEntity) {
@@ -765,6 +849,11 @@ void EntityEditorMainView::doEntitySelect(Entity *targetEntity) {
         sceneMesh->overlayWireframe = true;
     }
     
+    SceneEntityInstance *instance = dynamic_cast<SceneEntityInstance*>(targetEntity);
+    if(instance) {
+        setOverlayWireframeRecursive(targetEntity, true);
+    }
+    
     Camera *camera = dynamic_cast<Camera*>(targetEntity);
     cameraPreview->setCamera(mainScene, camera);
 }
@@ -772,6 +861,11 @@ void EntityEditorMainView::doEntitySelect(Entity *targetEntity) {
 
 void EntityEditorMainView::selectEntity(Entity *targetEntity, bool addToSelection) {
     
+    if(targetEntity->getUserData()) {
+        SceneEntityInstance *instance = (SceneEntityInstance*)targetEntity->getUserData();
+        targetEntity = instance;
+    }
+    
     bool doNotReselect = false;
     if(!addToSelection) {
         for(int i=0; i < selectedEntities.size(); i++) {
@@ -803,14 +897,15 @@ Entity *EntityEditorMainView::getObjectRoot() {
     return sceneObjectRoot;
 }
 
-void EntityEditorMainView::setObjectRoot(Entity *entity) {
+void EntityEditorMainView::setObjectRoot(SceneEntityInstance *entity) {
+    objectRootInstance = entity;
     if(sceneObjectRoot) {
         sceneObjectRoot->getParentEntity()->removeChild(sceneObjectRoot);
         delete sceneObjectRoot;
     }
     sceneObjectRoot = entity;
     sceneObjectRoot->processInputEvents = true;
-    mainScene->addChild(sceneObjectRoot);
+    objectRootBase->addChild(sceneObjectRoot);
     sceneObjectRoot->getParentEntity()->moveChildBottom(sceneObjectRoot);
 }
 
@@ -945,6 +1040,7 @@ bool PolycodeEntityEditor::openFile(OSFileEntry filePath) {
     
     mainView->setObjectRoot(loadedInstance);
     mainView->setEditorPropsRecursive(loadedInstance);
+    
     treeView->setRootEntity(loadedInstance);
     propertyView->setEntityInstance(loadedInstance);
     settingsView->setEntityInstance(loadedInstance);
@@ -1003,7 +1099,7 @@ void PolycodeEntityEditor::saveEntityToObjectEntry(Entity *entity, ObjectEntry *
         }
     }
     
-    if(dynamic_cast<SceneEntityInstance*>(entity)) {
+    if(dynamic_cast<SceneEntityInstance*>(entity) && entity != mainView->getObjectRoot()) {
         if(!(*(entry))["type"]) {
             entry->addChild("type", "SceneEntityInstance");
         }
@@ -1122,7 +1218,7 @@ void PolycodeEntityEditor::saveEntityToObjectEntry(Entity *entity, ObjectEntry *
         }
         
     }
-    
+
     if(dynamic_cast<SceneSound*>(entity)) {
         SceneSound *sound = (SceneSound*) entity;
         

+ 5 - 5
IDE/Contents/Source/PolycodeProps.cpp

@@ -3377,7 +3377,7 @@ LinkedMaterialsSheet::LinkedMaterialsSheet() : PropSheet("LINKED MATERIALS", "li
     addProp(addMaterialProp);
     addMaterialProp->getButton()->addEventListener(this, UIEvent::CLICK_EVENT);
     
-    propToRemove = NULL;
+    poolRemoveIndex = -1;
 }
 
 LinkedMaterialsSheet::~LinkedMaterialsSheet() {
@@ -3385,12 +3385,12 @@ LinkedMaterialsSheet::~LinkedMaterialsSheet() {
 }
 
 void LinkedMaterialsSheet::Update() {
-    if(propToRemove) {
+    if(poolRemoveIndex > -1) {
         if(instance) {
-//            instance->removeLinkedMaterialFile(propToRemove->getCaption());
+            instance->unlinkResourcePool(instance->getLinkedResourcePoolAtIndex(poolRemoveIndex));
             updateMaterials();
         }
-        propToRemove = NULL;
+        poolRemoveIndex = -1;
     }
 }
 
@@ -3402,7 +3402,7 @@ void LinkedMaterialsSheet::handleEvent(Event *event) {
     
     for(int i=0; i < props.size(); i++) {
         if(props[i] == event->getDispatcher()) {
-            propToRemove = (RemovableStringProp*) props[i];
+            poolRemoveIndex = i;
         }
     }
     

+ 2 - 3
IDE/Contents/Source/TextureBrowser.cpp

@@ -50,7 +50,7 @@ AssetEntry::AssetEntry(String assetPath, String assetName, String extension, Res
 	} else if(extension == "ogg" || extension == "wav") {
 		imageShape->loadTexture("browserIcons/sound_icon.png");
 	} else if(extension == "entity") {
-		imageShape->loadTexture("browserIcons/entity_icon");
+		imageShape->loadTexture("browserIcons/entity_icon.png");
 	} else if(extension == "sprite") {
 		imageShape->loadTexture("browserIcons/sprite_icon.png");
 	} else if(extension == "ttf" || extension == "otf") {
@@ -63,8 +63,7 @@ AssetEntry::AssetEntry(String assetPath, String assetName, String extension, Res
 		imageShape->loadTexture("browserIcons/materials_icon.png");
     } else if(extension == "material_resource") {
 		imageShape->loadTexture("browserIcons/material_resource_icon.png");
-	}
-
+    }
 	
 	imageShape->setPosition(28, 10);
     imageShape->setBlendingMode(Renderer::BLEND_MODE_NORMAL);

+ 2 - 1
IDE/Contents/Source/TransformGizmo.cpp

@@ -91,6 +91,7 @@ TransformGizmo::TransformGizmo(Scene *targetScene, Camera *targetCamera) : Entit
 	processInputEvents = true;
     orientation = ORIENTATION_GLOBAL;
     centerMode = CENTER_MODE_MEDIAN;
+    enableGizmo = true;
 	
 	this->targetScene = targetScene;
 	this->targetCamera = targetCamera;
@@ -610,7 +611,7 @@ void TransformGizmo::setGizmoMode(int newMode) {
 }
 
 void TransformGizmo::handleEvent(Event *event) {
-    if(!enabled) {
+    if(!enableGizmo) {
         return;
     }