Răsfoiți Sursa

Added bounding box visualization to entity editor, added bounding box field to entity prop sheet, changed sprite editor zoom to a slider instead of a drop down

Ivan Safrin 11 ani în urmă
părinte
comite
110ca74a1d

+ 1 - 1
Core/Contents/Source/PolyEntity.cpp

@@ -105,7 +105,7 @@ Entity *Entity::Clone(bool deepClone, bool ignoreEditorOnly) const {
 void Entity::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const {
 	clone->ownsChildren = ownsChildren;
 	clone->setPosition(position);
-	clone->setRotationEuler(rotation);
+	clone->setRotationByQuaternion(rotationQuat);
 	clone->setScale(scale);
 	clone->color = color;
 	clone->custEntityType = custEntityType;

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

@@ -192,6 +192,8 @@ class EntityEditorMainView : public UIElement {
     
             void didPlaceEntity(Entity *entity);
     
+            void setBBox();
+    
             Entity *getObjectRoot();
             void setObjectRoot(SceneEntityInstance *entity);
     
@@ -226,6 +228,8 @@ class EntityEditorMainView : public UIElement {
             SceneLight *customLight1;
             SceneLight *customLight2;
     
+        	ScenePrimitive *bBoxVis;
+    
             Entity *objectRootBase;
             Entity *iconBase;
             SceneEntityInstance *objectRootInstance;

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

@@ -521,6 +521,7 @@ class EntitySheet : public PropSheet {
 		StringProp *tagProp;
 		ColorProp *colorProp;
 		ComboProp *blendingProp;
+		Vector3Prop *bBoxProp;
 };
 
 class ShaderPassesSheet : public PropSheet {

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

@@ -65,7 +65,7 @@ class SpritePreviewSheet : public PropSheet {
 		void setSprite(SceneSprite *sprite);
 		
 	protected:
-		ComboProp *zoomProp;
+		SliderProp *zoomProp;
 		SpritePreviewProp *previewProp;
 };
 

+ 34 - 3
IDE/Contents/Source/PolycodeEntityEditor.cpp

@@ -325,8 +325,8 @@ EntityEditorMainView::EntityEditorMainView(PolycodeEditor *editor) {
     this->editor = editor;
 	mainScene = new Scene(Scene::SCENE_3D, true);
     
-//    mainScene->getDefaultCamera()->frustumCulling = false;
-//    mainScene->doVisibilityChecking(false);
+    mainScene->getDefaultCamera()->frustumCulling = false;
+    mainScene->doVisibilityChecking(false);
     
 	renderTexture = new SceneRenderTexture(mainScene, mainScene->getDefaultCamera(), 512, 512);
 	mainScene->clearColor.setColor(0.2, 0.2, 0.2, 1.0);	
@@ -383,7 +383,7 @@ EntityEditorMainView::EntityEditorMainView(PolycodeEditor *editor) {
 	
 	mainScene->getDefaultCamera()->setPosition(10, 10, 10);
 	mainScene->getDefaultCamera( )->lookAt(Vector3());
-	mainScene->getDefaultCamera()->setClippingPlanes(0.01, 10000);
+	mainScene->getDefaultCamera()->setClippingPlanes(0.01, 1000);
     
 	grid = new EditorGrid();
     grid->addEventListener(this, Event::CHANGE_EVENT);
@@ -482,6 +482,12 @@ EntityEditorMainView::EntityEditorMainView(PolycodeEditor *editor) {
     iconVisibilitySelector->setPosition(230, 2);
     iconVisibilitySelector->addEventListener(this, UIEvent::SELECT_EVENT);
     
+    bBoxVis = new ScenePrimitive(ScenePrimitive::TYPE_BOX, 1.0, 1.0, 1.0);
+    bBoxVis->overlayWireframe = true;
+    bBoxVis->wireFrameColor = Color(0.3, 0.5, 1.0, 0.5);
+    bBoxVis->color.a = 0.0;
+    bBoxVis->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
+    mainScene->addChild(bBoxVis);
     
     editorMode = EDITOR_MODE_3D;
     
@@ -506,6 +512,7 @@ void EntityEditorMainView::doAction(String actionName, PolycodeEditorActionData
             }
 		}
         transformGizmo->setTransformSelection(selectedEntities);
+        setBBox();
 	} else if(actionName == "scale") {
 		for(int i=0; i < selectedEntities.size(); i++) {
             if(i < sceneData->entries.size()) {
@@ -650,6 +657,8 @@ void EntityEditorMainView::Update() {
         icons[i]->rebuildTransformMatrix();
         icons[i]->recalculateAABBAllChildren();
     }
+    
+    setBBox();
 }
 
 void EntityEditorMainView::createIcon(Entity *entity, String iconFile) {
@@ -959,6 +968,7 @@ void EntityEditorMainView::deleteSelected(bool doAction) {
     
     selectedEntities.clear();
     transformGizmo->setTransformSelection(selectedEntities);
+    setBBox();
     dispatchEvent(new Event(), Event::CHANGE_EVENT);
 }
 
@@ -1274,6 +1284,7 @@ void EntityEditorMainView::selectAll(bool doAction) {
         }
     }
     transformGizmo->setTransformSelection(selectedEntities);
+    setBBox();
     dispatchEvent(new Event(), Event::CHANGE_EVENT);
 }
 
@@ -1295,6 +1306,7 @@ void EntityEditorMainView::selectNone(bool doAction) {
     }
     selectedEntities.clear();
     transformGizmo->setTransformSelection(selectedEntities);
+    setBBox();
     dispatchEvent(new Event(), Event::CHANGE_EVENT);
 }
 
@@ -1406,11 +1418,30 @@ void EntityEditorMainView::selectEntity(Entity *targetEntity, bool addToSelectio
         beforeData = NULL;
     }
     
+    
+    
     transformGizmo->setTransformSelection(selectedEntities);
+    setBBox();
     dispatchEvent(new Event(), Event::CHANGE_EVENT);
     
 }
 
+void EntityEditorMainView::setBBox() {
+    if(selectedEntities.size() > 0) {
+        bBoxVis->visible = true;
+        
+        Entity *targetEntity = selectedEntities[0];
+        bBoxVis->setPrimitiveOptions(ScenePrimitive::TYPE_BOX, targetEntity->getLocalBoundingBox().x, targetEntity->getLocalBoundingBox().y, targetEntity->getLocalBoundingBox().z);
+        
+        Matrix4 mat = targetEntity->getConcatenatedMatrix();
+        bBoxVis->setTransformByMatrixPure(mat);
+        bBoxVis->dirtyMatrix(false);
+        
+    } else {
+        bBoxVis->visible = false;
+    }
+}
+
 Entity *EntityEditorMainView::getObjectRoot() {
     return sceneObjectRoot;
 }

+ 8 - 1
IDE/Contents/Source/PolycodeProps.cpp

@@ -2923,7 +2923,10 @@ EntitySheet::EntitySheet() : PropSheet("ENTITY", "entity"){
 	
 	blendingProp = new ComboProp("Blend mode");
 	addProp(blendingProp);
-
+    
+    bBoxProp = new Vector3Prop("Bounding box");
+	addProp(bBoxProp);
+    
     blendingProp->comboEntry->addComboItem("None");
 	blendingProp->comboEntry->addComboItem("Normal");
 	blendingProp->comboEntry->addComboItem("Lighten");
@@ -2952,6 +2955,8 @@ void EntitySheet::handleEvent(Event *event) {
 		entity->color = colorProp->get();
 	}else if(event->getDispatcher() == idProp  && event->getEventCode() == Event::CHANGE_EVENT) {
 		entity->id = idProp->get();
+	}else if(event->getDispatcher() == bBoxProp  && event->getEventCode() == Event::CHANGE_EVENT) {
+		entity->setLocalBoundingBox(bBoxProp->get());
 	} else if(event->getDispatcher() == tagProp  && event->getEventCode() == Event::CHANGE_EVENT) {
 		
 		String tagString = "";
@@ -2991,6 +2996,8 @@ void EntitySheet::setEntity(Entity *entity) {
         colorProp->set(entity->color);
         blendingProp->set(entity->blendingMode);
         
+        bBoxProp->set(entity->getLocalBoundingBox());
+        
         enabled = true;
     } else {
         enabled = false;

+ 3 - 25
IDE/Contents/Source/PolycodeSpriteEditor.cpp

@@ -114,17 +114,11 @@ SpriteAnimationEntry::~SpriteAnimationEntry() {
 }
 
 SpritePreviewSheet::SpritePreviewSheet() : PropSheet("SPRITE PREVIEW", ""){
-	zoomProp = new ComboProp("Zoom");
+	zoomProp = new SliderProp("Zoom", 0.1, 16);
 	addProp(zoomProp);
 	zoomProp->addEventListener(this, Event::CHANGE_EVENT);	
 	
-	zoomProp->comboEntry->addComboItem("No Zoom");
-	zoomProp->comboEntry->addComboItem("Zoom 2x");
-	zoomProp->comboEntry->addComboItem("Zoom 4x");
-	zoomProp->comboEntry->addComboItem("Zoom 8x");
-	zoomProp->comboEntry->addComboItem("Zoom 16x");
-
-	zoomProp->set(0);
+	zoomProp->set(1.0);
 	
 	previewProp = new SpritePreviewProp();
 	addProp(previewProp);
@@ -132,23 +126,7 @@ SpritePreviewSheet::SpritePreviewSheet() : PropSheet("SPRITE PREVIEW", ""){
 
 void SpritePreviewSheet::handleEvent(Event *event) {
 	if(event->getDispatcher() == zoomProp) {
-		switch (zoomProp->get()) {
-			case 1:
-				previewProp->setSpriteScale(2.0);
-			break;
-			case 2:
-				previewProp->setSpriteScale(4.0);
-			break;
-			case 3:
-				previewProp->setSpriteScale(8.0);			
-			break;
-			case 4:
-				previewProp->setSpriteScale(16.0);			
-			break;
-			default:
-				previewProp->setSpriteScale(1.0);
-			break;
-		}
+        previewProp->setSpriteScale(zoomProp->get());
 		
 		if(previewProp->previewSprite) {
 			propHeight = (previewProp->previewSprite->getHeight() * previewProp->previewSprite->getScale().y) + zoomProp->getHeight()+ 50;