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

Added ability to pin camera preview and adjust its aspect ration in entity editor

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

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

@@ -42,7 +42,10 @@ class PolycodeEditorActionData {
 
 class PolycodeEditorAction  {
 	public:
-		PolycodeEditorAction(){}
+		PolycodeEditorAction(){
+            beforeData = NULL;
+            afterData = NULL;
+        }
 		~PolycodeEditorAction() {}
 		
 		void deleteData() {

+ 10 - 1
IDE/Contents/Include/PolycodeEntityEditor.h

@@ -116,9 +116,14 @@ class CameraPreviewWindow : public UIElement {
     public:
         CameraPreviewWindow();
         ~CameraPreviewWindow();
-
+    
+        void handleEvent(Event *event);
+        void Resize(Number width, Number height);
+    
         void setCamera(Scene *scene, Camera *camera);
     
+        bool isPinned();
+    
     private:
     
         SceneRenderTexture *renderTexture;
@@ -126,7 +131,11 @@ class CameraPreviewWindow : public UIElement {
         Scene *scene;
         UIRect *bgRect;
         UIRect *previewRect;
+        bool pinned;
+        bool cameraSelected;
     
+        UIComboBox *aspectCombo;
+        UIButton *pinButton;
 };
 
 class SceneMeshSettings {

+ 86 - 5
IDE/Contents/Source/PolycodeEntityEditor.cpp

@@ -189,22 +189,89 @@ void CameraDisplay::Update() {
 
 CameraPreviewWindow::CameraPreviewWindow() : UIElement() {
     
-    bgRect = new UIRect((160 * 1.5)+16, (90 * 1.5) + 28);
+    bgRect = new UIRect((160 * 1.5)+16, (90 * 1.5) + 38);
     addChild(bgRect);
     bgRect->setColor(0.0, 0.0, 0.0, 0.5);
     
-    UILabel *label = new UILabel("CAMERA PREVIEW", 11);
+    UILabel *label = new UILabel("PREVIEW", 11);
     label->setColor(1.0, 1.0, 1.0, 1.0);
-    addChild(label);
+//    addChild(label);
     label->setPosition(15, 3);
+  
+    aspectCombo = new UIComboBox(globalMenu, 80);
+    addChild(aspectCombo);
+    aspectCombo->setPosition(5, 3);
+    aspectCombo->addComboItem("16:9");
+    aspectCombo->addComboItem("16:10");
+    aspectCombo->addComboItem("4:3");
+    aspectCombo->addEventListener(this, UIEvent::CHANGE_EVENT);
+    
+    pinButton = new UIButton("Pin", 60);
+    addChild(pinButton);
+    pinButton->addEventListener(this, UIEvent::CLICK_EVENT);
     
     previewRect = new UIRect(160 * 1.5, 90 * 1.5);
-    previewRect->setPosition(8, 20);
+    previewRect->setPosition(8, 30);
     addChild(previewRect);
     enabled = false;
     camera = NULL;
     scene = NULL;
     renderTexture = NULL;
+    
+    bBox = bgRect->bBox;
+    pinned = false;
+    cameraSelected = false;
+    
+    aspectCombo->setSelectedIndex(0);
+}
+
+bool CameraPreviewWindow::isPinned() {
+    return pinned;
+}
+
+void CameraPreviewWindow::Resize(Number width, Number height) {
+    UIElement::Resize(width, height);
+    bgRect->Resize(width, height);
+    
+    previewRect->Resize(width-16, height-38);
+    
+    if(camera) {
+        if(renderTexture) {
+            delete renderTexture;
+        }
+        renderTexture = new SceneRenderTexture(scene, camera, previewRect->getWidth(), previewRect->getHeight());
+        previewRect->setTexture(renderTexture->getTargetTexture());
+    }
+    pinButton->setPosition(width-70, 3);
+}
+
+void CameraPreviewWindow::handleEvent(Event *event) {
+    
+    if(event->getDispatcher() == pinButton) {
+        pinned = !pinned;
+        if(pinned) {
+            pinButton->setCaption("Unpin");
+        } else {
+            pinButton->setCaption("Pin");
+            if(!cameraSelected) {
+                enabled = false;
+                camera = NULL;
+            }
+        }
+    } else if(event->getDispatcher() == aspectCombo) {
+        switch(aspectCombo->getSelectedIndex()) {
+            case 0:
+                Resize(bBox.y * 1.77777, bBox.y);
+            break;
+            case 1:
+                Resize(bBox.y * 1.6, bBox.y);
+            break;
+            case 2:
+                Resize(bBox.y * 1.3, bBox.y);
+            break;
+                
+        }
+    }
 }
 
 CameraPreviewWindow::~CameraPreviewWindow() {
@@ -212,8 +279,15 @@ CameraPreviewWindow::~CameraPreviewWindow() {
 }
 
 void CameraPreviewWindow::setCamera(Scene *scene, Camera *camera) {
+    
+    if(pinned && !camera) {
+        cameraSelected = false;
+        return;
+    }
+    
     this->camera = camera;
     this->scene = scene;
+    
     if(camera) {
         enabled = true;
         if(renderTexture) {
@@ -223,7 +297,9 @@ void CameraPreviewWindow::setCamera(Scene *scene, Camera *camera) {
         previewRect->setTexture(renderTexture->getTargetTexture());
         
     } else {
-        enabled = false;
+        if(!pinned) {
+            enabled = false;
+        }
     }
 }
 
@@ -865,6 +941,7 @@ void EntityEditorMainView::handleEvent(Event *event) {
                         data->entries.push_back(PolycodeSceneEditorActionDataEntry(selectedEntities[i]->getPosition()));
                     }
                     editor->didAction("move", beforeData, data);
+                    beforeData = NULL;
                 }
                 break;
                 case TransformGizmo::TRANSFORM_SCALE:
@@ -875,6 +952,7 @@ void EntityEditorMainView::handleEvent(Event *event) {
                         data->entries.push_back(PolycodeSceneEditorActionDataEntry(selectedEntities[i]->getScale()));
                     }
                     editor->didAction("scale", beforeData, data);
+                    beforeData = NULL;
                 }
                 break;
                 case TransformGizmo::TRANSFORM_ROTATE:
@@ -885,6 +963,7 @@ void EntityEditorMainView::handleEvent(Event *event) {
                         data->entries.push_back(PolycodeSceneEditorActionDataEntry(selectedEntities[i]->getRotationQuat()));
                     }
                     editor->didAction("rotate", beforeData, data);
+                    beforeData = NULL;                    
                 }
                 break;
             }
@@ -1118,6 +1197,7 @@ void EntityEditorMainView::selectNone(bool doAction) {
         }
         
         editor->didAction("select", beforeData, NULL, false);
+        beforeData = NULL;
     }
     
     for(int i=0; i < selectedEntities.size(); i++) {
@@ -1233,6 +1313,7 @@ void EntityEditorMainView::selectEntity(Entity *targetEntity, bool addToSelectio
             data->entries.push_back(PolycodeSceneEditorActionDataEntry(selectedEntities[i]));
         }
         editor->didAction("select", beforeData, data);
+        beforeData = NULL;
     }
     
     transformGizmo->setTransformSelection(selectedEntities);