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

Added support for turning off key repeat in CoreInput, SceneLights will now remove themselves from the Scene in their destructor, Entity editor will now ignore shortcuts if not focused, added support for constraining Scene input to the camera viewport, entity editor will now ignore mouse input outside of its scene viewport

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

+ 1 - 0
Core/Contents/Include/PolyCoreInput.h

@@ -169,6 +169,7 @@ namespace Polycode {
 		
 		void clearInput();
 		
+        bool keyRepeat;
 		
 		std::vector<JoystickInfo> joysticks;
 		bool keyboardState[512];

+ 2 - 0
Core/Contents/Include/PolyScene.h

@@ -188,6 +188,8 @@ namespace Polycode {
 		
         Polycode::Rectangle sceneMouseRect;
         bool remapMouse;
+        
+        bool constrainPickingToViewport;
 		
 	protected:
 		

+ 8 - 0
Core/Contents/Source/PolyCoreInput.cpp

@@ -42,6 +42,7 @@ namespace Polycode {
 		simulateTouchWithMouse = false;
 		simulateMouseWithTouch = false;
 		ignoreOffScreenTouch = false;
+        keyRepeat = true;
 	}
 	
 	void CoreInput::clearInput() {
@@ -237,6 +238,13 @@ namespace Polycode {
 	}
 	
 	void CoreInput::setKeyState(PolyKEY keyCode, wchar_t code, bool newState, int ticks) {
+        
+        if(newState && !keyRepeat) {
+            if(keyboardState[keyCode]) {
+                return;
+            }
+        }
+        
 		InputEvent *evt = new InputEvent(keyCode, code, ticks);
 		if(keyCode < 512)
 			keyboardState[keyCode] = newState;

+ 12 - 1
Core/Contents/Source/PolyScene.cpp

@@ -63,6 +63,7 @@ void Scene::initScene(int sceneType, bool virtualScene) {
 	useClearColor = false;
 	ownsChildren = false;
     remapMouse = false;
+    constrainPickingToViewport = true;
 	renderer = CoreServices::getInstance()->getRenderer();
 	rootEntity.setRenderer(renderer);
     CoreServices::getInstance()->getSceneManager()->addScene(this);
@@ -220,7 +221,6 @@ void Scene::Render(Camera *targetCamera) {
 								  0.0f,	0.0f,	0.5f,	0.0f,
 								  0.5f,	0.5f,	0.5f,	1.0f );
 				
-								
 				light->renderDepthMap(this);
 				textureMatrix = light->getLightViewMatrix() * matTexAdj;				
 				matrixPtr = &textureMatrix;				
@@ -320,6 +320,17 @@ void Scene::handleEvent(Event *event) {
 	if(event->getDispatcher() == core->getInput() && rootEntity.processInputEvents) {
 		InputEvent *inputEvent = (InputEvent*) event;
 
+        if(constrainPickingToViewport) {
+            Polycode::Rectangle v = activeCamera->getViewport();
+            if(remapMouse) {
+                v.x = sceneMouseRect.x;
+                v.y = sceneMouseRect.y;
+            }            
+            if(inputEvent->mousePosition.x < v.x || inputEvent->mousePosition.x > v.x+(v.w / renderer->getBackingResolutionScaleX()) || inputEvent->mousePosition.y < v.y || inputEvent->mousePosition.y > v.y + (v.h/renderer->getBackingResolutionScaleY())) {
+                    return;
+            }
+        }
+        
 		Ray ray = projectRayFromCameraAndViewportCoordinate(activeCamera, inputEvent->mousePosition);
 		
 		switch(inputEvent->getEventCode()) {

+ 3 - 0
Core/Contents/Source/PolySceneLight.cpp

@@ -120,6 +120,9 @@ Number SceneLight::getShadowMapFOV() const {
 }
 
 SceneLight::~SceneLight() {
+    if(parentScene) {
+        parentScene->removeLight(this);
+    }
 	printf("Destroying scene light...\n");
 }
 

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

@@ -111,6 +111,8 @@ class EntityEditorMainView : public UIElement {
             void setMaterialRecursive(const String &materialName, bool wireFrame, Entity *entity);
             void restoreSettingsRecursive(Entity *entity);
     
+            void onGainFocus();
+            void onLoseFocus();
             void deleteSelected();
     
             Entity *getObjectRoot();
@@ -191,7 +193,6 @@ class PolycodeEntityEditor : public PolycodeEditor {
     
         void saveEntityToObjectEntry(Entity *entity, ObjectEntry *entry);
     
-		
         void handleEvent(Event *event);
     
 	protected:

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

@@ -222,6 +222,8 @@ EntityEditorMainView::EntityEditorMainView() {
 	renderTextureShape->setTexture(renderTexture->getTargetTexture());
 	addChild(renderTextureShape);
 	renderTextureShape->setPosition(0, 30);
+    renderTextureShape->focusable = true;
+    renderTextureShape->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
 
     cameraPreview = new CameraPreviewWindow();
     addChild(cameraPreview);
@@ -252,6 +254,8 @@ EntityEditorMainView::EntityEditorMainView() {
     mainScene->addChild(sceneObjectRoot);
     
 	transformGizmo = new TransformGizmo(mainScene, mainScene->getDefaultCamera());
+    transformGizmo->enabled = false;
+    
 	mainScene->addChild(transformGizmo);		
 	trackballCamera = new TrackballCamera(mainScene->getDefaultCamera(), renderTextureShape);
     trackballCamera->addEventListener(this, Event::CHANGE_EVENT);
@@ -572,9 +576,19 @@ void EntityEditorMainView::deleteSelected() {
     dispatchEvent(new Event(), Event::CHANGE_EVENT);
 }
 
+void EntityEditorMainView::onGainFocus() {
+    transformGizmo->enabled = true;
+}
+
+void EntityEditorMainView::onLoseFocus() {
+    transformGizmo->enabled = false;
+}
+
 void EntityEditorMainView::handleEvent(Event *event) {
 
-    if(event->getDispatcher() == trackballCamera) {
+    if(event->getDispatcher() == renderTextureShape) {
+        focusSelf();
+    } else if(event->getDispatcher() == trackballCamera) {
         Update();
     } else if(event->getDispatcher() == modeSwitchDropdown) {
         setEditorMode(modeSwitchDropdown->getSelectedIndex());
@@ -648,7 +662,9 @@ void EntityEditorMainView::handleEvent(Event *event) {
             switch(inputEvent->key) {
                 case KEY_BACKSPACE:
                 case KEY_DELETE:
-                    //deleteSelected();
+                    if(hasFocus) {
+                        deleteSelected();
+                    }
                 break;
             }
         }
@@ -665,7 +681,7 @@ void EntityEditorMainView::handleEvent(Event *event) {
             break;
         }
     } else {
-        if(event->getEventCode() == InputEvent::EVENT_MOUSEDOWN ) {
+        if(event->getEventCode() == InputEvent::EVENT_MOUSEDOWN && hasFocus && event->getDispatcher() != renderTextureShape) {
             InputEvent *inputEvent = (InputEvent*) event;
 
             if(inputEvent->mouseButton == CoreInput::MOUSE_BUTTON2) {

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

@@ -610,7 +610,10 @@ void TransformGizmo::setGizmoMode(int newMode) {
 }
 
 void TransformGizmo::handleEvent(Event *event) {
-
+    if(!enabled) {
+        return;
+    }
+    
 	if(!coreInput->getKeyState(KEY_LALT) && !coreInput->getKeyState(KEY_RALT)) {
 		if(event->getDispatcher() == pitchGrip) {
 			if(event->getEventCode() == InputEvent::EVENT_MOUSEDOWN) {