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

Added ability to specify an override material in Scene, added wireframe option to materials, added flag to applyMaterial to force the material and ignore override material, added default wireframe material, added ability to toggle lighting in the entity editor, added ability to change between textured, solid and wireframe modes in entity editor

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

BIN
Assets/Default asset pack/default.pak


+ 7 - 0
Assets/Default asset pack/default/UnlitUntextured.frag

@@ -0,0 +1,7 @@
+
+varying vec4 vertexColor;
+
+void main()
+{
+    gl_FragColor = vertexColor;
+}

+ 9 - 1
Assets/Default asset pack/default/default.mat

@@ -29,6 +29,10 @@
 			<vp source="default/Unlit.vert"/>
 			<vp source="default/Unlit.vert"/>
 			<fp source="default/Unlit.frag"/>
 			<fp source="default/Unlit.frag"/>
 		</shader>
 		</shader>
+		<shader type="glsl" name="UnlitUntextured" numAreaLights="0" numSpotLights="0">		
+			<vp source="default/Unlit.vert"/>
+			<fp source="default/UnlitUntextured.frag"/>
+		</shader>		
 		<shader type="glsl" name="LightCube" numAreaLights="0" numSpotLights="0">		
 		<shader type="glsl" name="LightCube" numAreaLights="0" numSpotLights="0">		
 			<vp source="default/DefaultShader.vert"/>
 			<vp source="default/DefaultShader.vert"/>
 			<fp source="default/LightCube.frag"/>
 			<fp source="default/LightCube.frag"/>
@@ -70,7 +74,11 @@
 				<textures>
 				<textures>
 				</textures>				
 				</textures>				
 			</shader>
 			</shader>
-		</material>		
+		</material>	
+		<material name="UnlitWireframe" wireframe="true">
+			<shader name="UnlitUntextured">
+			</shader>
+		</material>
 		<material name="Unlit">
 		<material name="Unlit">
 			<shader name="Unlit">
 			<shader name="Unlit">
 				<textures>
 				<textures>

BIN
Assets/default.pak


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

@@ -199,7 +199,6 @@ namespace Polycode {
 		void setDepthFunction(int depthFunction);
 		void setDepthFunction(int depthFunction);
 						
 						
 		void clearShader();
 		void clearShader();
-		void applyMaterial(Material *material,  ShaderBinding *localOptions, unsigned int shaderIndex);
 		
 		
 	protected:
 	protected:
 		void initOSSpecific();
 		void initOSSpecific();

+ 2 - 1
Core/Contents/Include/PolyMaterial.h

@@ -67,7 +67,8 @@ namespace Polycode {
 			void *shaderModule;
 			void *shaderModule;
 			
 			
 			int blendingMode;
 			int blendingMode;
-			
+        
+            bool wireframe;
 			bool screenMaterial;
 			bool screenMaterial;
 			
 			
 		protected:
 		protected:

+ 5 - 2
Core/Contents/Include/PolyRenderer.h

@@ -172,7 +172,7 @@ namespace Polycode {
 		
 		
 		virtual void setBlendingMode(int blendingMode) = 0;	
 		virtual void setBlendingMode(int blendingMode) = 0;	
 			
 			
-		virtual void applyMaterial(Material *material, ShaderBinding *localOptions, unsigned int shaderIndex) = 0;
+		virtual void applyMaterial(Material *material, ShaderBinding *localOptions, unsigned int shaderIndex, bool forceMaterial);
 		virtual void clearShader() = 0;
 		virtual void clearShader() = 0;
 		
 		
 		virtual void setDepthFunction(int depthFunction) = 0;
 		virtual void setDepthFunction(int depthFunction) = 0;
@@ -306,6 +306,8 @@ namespace Polycode {
         Number getBackingResolutionScaleX();
         Number getBackingResolutionScaleX();
         Number getBackingResolutionScaleY();
         Number getBackingResolutionScaleY();
         
         
+        void setOverrideMaterial(Material *material);
+        
         void pushVertexColor();
         void pushVertexColor();
         void popVertexColor();
         void popVertexColor();
         void multiplyVertexColor(const Color &color);
         void multiplyVertexColor(const Color &color);
@@ -340,7 +342,8 @@ namespace Polycode {
 		int textureFilteringMode;
 		int textureFilteringMode;
 		
 		
 		Matrix4 cameraMatrix;
 		Matrix4 cameraMatrix;
-	
+        Material *overrideMaterial;
+        
 		PolycodeShaderModule* currentShaderModule;
 		PolycodeShaderModule* currentShaderModule;
 		std::vector <PolycodeShaderModule*> shaderModules;
 		std::vector <PolycodeShaderModule*> shaderModules;
 
 

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

@@ -129,6 +129,8 @@ namespace Polycode {
 		
 		
 		void Render(Camera *targetCamera = NULL);
 		void Render(Camera *targetCamera = NULL);
 		void RenderDepthOnly(Camera *targetCamera);
 		void RenderDepthOnly(Camera *targetCamera);
+        
+        void setOverrideMaterial(Material *material);
 		
 		
 		void handleEvent(Event *event);
 		void handleEvent(Event *event);
 		
 		
@@ -204,6 +206,8 @@ namespace Polycode {
 		Camera *defaultCamera;
 		Camera *defaultCamera;
 		Camera *activeCamera;
 		Camera *activeCamera;
 		
 		
+        Material *overrideMaterial;
+        
 		Core *core;
 		Core *core;
 		
 		
 		bool lightingEnabled;
 		bool lightingEnabled;

+ 2 - 5
Core/Contents/Include/PolySceneMesh.h

@@ -183,11 +183,8 @@ namespace Polycode {
 			bool useGeometryHitDetection;
 			bool useGeometryHitDetection;
 			
 			
 			bool customHitDetection(const Ray &ray);
 			bool customHitDetection(const Ray &ray);
-
-            /**
-             * If this flag is set to true, the entity will render in wireframe.
-             */
-            bool renderWireframe;
+        
+            bool forceMaterial;
 
 
 			
 			
 		protected:
 		protected:

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

@@ -359,7 +359,7 @@ void Camera::drawFilter(Texture *targetTexture, Number targetTextureWidth, Numbe
 			materialBinding->addTexture(depthBinding->name, finalTargetZTexture);
 			materialBinding->addTexture(depthBinding->name, finalTargetZTexture);
 		}
 		}
 		
 		
-		renderer->applyMaterial(filterShaderMaterial, localShaderOptions[i], i);		
+		renderer->applyMaterial(filterShaderMaterial, localShaderOptions[i], i, true);
 		if(i==filterShaderMaterial->getNumShaders()-1) {
 		if(i==filterShaderMaterial->getNumShaders()-1) {
 				if(targetTexture) {
 				if(targetTexture) {
 					renderer->setViewportSize(targetTextureWidth, targetTextureHeight);	
 					renderer->setViewportSize(targetTextureWidth, targetTextureHeight);	

+ 0 - 35
Core/Contents/Source/PolyGLRenderer.cpp

@@ -758,41 +758,6 @@ void OpenGLRenderer::clearBuffer(bool colorBuffer, bool depthBuffer) {
 	glClear(clearMask);	
 	glClear(clearMask);	
 }
 }
 
 
-void OpenGLRenderer::applyMaterial(Material *material,  ShaderBinding *localOptions,unsigned int shaderIndex) {
-	if(!material->getShader(shaderIndex) || !shadersEnabled) {
-		setTexture(NULL);
-		return;
-	}
-	
-	FixedShaderBinding *fBinding;
-	
-	switch(material->getShader(shaderIndex)->getType()) {
-		case Shader::FIXED_SHADER:
-//			FixedShader *fShader = (FixedShader*)material->getShader();
-			fBinding = (FixedShaderBinding*)material->getShaderBinding(shaderIndex);
-			setTexture(fBinding->getDiffuseTexture());
-//			setTexture(fShader->getDiffuseTexture());
-		break;	
-		case Shader::MODULE_SHADER:		
-			currentMaterial = material;
-			if(material->shaderModule == NULL) {
-				for(int m=0; m < shaderModules.size(); m++) {
-					PolycodeShaderModule *shaderModule = shaderModules[m];	
-					if(shaderModule->hasShader(material->getShader(shaderIndex))) {
-						material->shaderModule = (void*)shaderModule;
-					}
-				}	
-			} else {
-				PolycodeShaderModule *shaderModule = (PolycodeShaderModule*)material->shaderModule;
-				shaderModule->applyShaderMaterial(this, material, localOptions, shaderIndex);
-				currentShaderModule = shaderModule;
-			}
-		break;
-	}
-	
-	setBlendingMode(material->blendingMode);
-}
-
 void OpenGLRenderer::clearShader() {
 void OpenGLRenderer::clearShader() {
 
 
 	glDisable(GL_COLOR_MATERIAL);
 	glDisable(GL_COLOR_MATERIAL);

+ 1 - 0
Core/Contents/Source/PolyMaterial.cpp

@@ -36,6 +36,7 @@ Material::Material(const String& name) : Resource(Resource::RESOURCE_MATERIAL) {
 	shaderModule = NULL;
 	shaderModule = NULL;
 	blendingMode = Renderer::BLEND_MODE_NORMAL;
 	blendingMode = Renderer::BLEND_MODE_NORMAL;
 	screenMaterial = false;
 	screenMaterial = false;
+    wireframe = false;
 }
 }
 
 
 Material::~Material() {
 Material::~Material() {

+ 5 - 1
Core/Contents/Source/PolyMaterialManager.cpp

@@ -431,7 +431,11 @@ Material *MaterialManager::materialFromXMLNode(ResourcePool *resourcePool, TiXml
 		if(String(nodeElement->Attribute("screen")) == "true") {
 		if(String(nodeElement->Attribute("screen")) == "true") {
 			newMaterial->screenMaterial = true;
 			newMaterial->screenMaterial = true;
 		}
 		}
-	}	
+	}
+    
+	if(nodeElement->Attribute("wireframe")) {
+		newMaterial->wireframe = String(nodeElement->Attribute("wireframe")) == "true";
+	}
 	
 	
 	if(nodeElement->Attribute("blendingMode")) {
 	if(nodeElement->Attribute("blendingMode")) {
 		newMaterial->blendingMode = atoi(nodeElement->Attribute("blendingMode"));
 		newMaterial->blendingMode = atoi(nodeElement->Attribute("blendingMode"));

+ 51 - 0
Core/Contents/Source/PolyRenderer.cpp

@@ -21,6 +21,9 @@
 */
 */
 
 
 #include "PolyRenderer.h"
 #include "PolyRenderer.h"
+#include "PolyFixedShader.h"
+#include "PolyMaterial.h"
+#include "PolyModule.h"
 #include "PolyMesh.h"
 #include "PolyMesh.h"
 
 
 using namespace Polycode;
 using namespace Polycode;
@@ -48,6 +51,11 @@ Renderer::Renderer() : clearColor(0.2f, 0.2f, 0.2f, 0.0), currentTexture(NULL),
 	doClearBuffer = true;
 	doClearBuffer = true;
     backingResolutionScaleX = 1.0;
     backingResolutionScaleX = 1.0;
     backingResolutionScaleY = 1.0;
     backingResolutionScaleY = 1.0;
+    overrideMaterial = NULL;
+}
+
+void Renderer::setOverrideMaterial(Material *material) {
+    overrideMaterial = material;
 }
 }
 
 
 Number Renderer::getBackingResolutionScaleX() {
 Number Renderer::getBackingResolutionScaleX() {
@@ -246,6 +254,49 @@ void Renderer::pushDataArrayForMesh(Mesh *mesh, int arrayType) {
 	pushRenderDataArray(mesh->renderDataArrays[arrayType]);
 	pushRenderDataArray(mesh->renderDataArrays[arrayType]);
 }
 }
 
 
+void Renderer::applyMaterial(Material *material,  ShaderBinding *localOptions,unsigned int shaderIndex, bool forceMaterial) {
+    
+    if(overrideMaterial) {
+        if(!forceMaterial) {
+            material = overrideMaterial;
+        }
+    }
+    
+	if(!material->getShader(shaderIndex) || !shadersEnabled) {
+		setTexture(NULL);
+		return;
+	}
+	
+	FixedShaderBinding *fBinding;
+	
+	switch(material->getShader(shaderIndex)->getType()) {
+		case Shader::FIXED_SHADER:
+            //			FixedShader *fShader = (FixedShader*)material->getShader();
+			fBinding = (FixedShaderBinding*)material->getShaderBinding(shaderIndex);
+			setTexture(fBinding->getDiffuseTexture());
+            //			setTexture(fShader->getDiffuseTexture());
+            break;
+		case Shader::MODULE_SHADER:
+			currentMaterial = material;
+			if(material->shaderModule == NULL) {
+				for(int m=0; m < shaderModules.size(); m++) {
+					PolycodeShaderModule *shaderModule = shaderModules[m];
+					if(shaderModule->hasShader(material->getShader(shaderIndex))) {
+						material->shaderModule = (void*)shaderModule;
+					}
+				}
+			} else {
+				PolycodeShaderModule *shaderModule = (PolycodeShaderModule*)material->shaderModule;
+				shaderModule->applyShaderMaterial(this, material, localOptions, shaderIndex);
+				currentShaderModule = shaderModule;
+			}
+            break;
+	}
+	
+	setBlendingMode(material->blendingMode);
+    setWireframePolygonMode(material->wireframe);
+}
+
 void Renderer::setBackingResolutionScale(Number xScale, Number yScale) {
 void Renderer::setBackingResolutionScale(Number xScale, Number yScale) {
     backingResolutionScaleX = xScale;
     backingResolutionScaleX = xScale;
     backingResolutionScaleY = yScale;
     backingResolutionScaleY = yScale;

+ 7 - 0
Core/Contents/Source/PolyScene.cpp

@@ -54,6 +54,7 @@ void Scene::initScene(int sceneType, bool virtualScene) {
 	defaultCamera = new Camera(this);
 	defaultCamera = new Camera(this);
 	activeCamera = defaultCamera;	
 	activeCamera = defaultCamera;	
 	fogEnabled = false;
 	fogEnabled = false;
+    overrideMaterial = NULL;
 	lightingEnabled = false;
 	lightingEnabled = false;
 	enabled = true;
 	enabled = true;
 	isSceneVirtual = virtualScene;	
 	isSceneVirtual = virtualScene;	
@@ -77,6 +78,10 @@ void Scene::initScene(int sceneType, bool virtualScene) {
 	core->getInput()->addEventListener(this, InputEvent::EVENT_MOUSEWHEEL_DOWN);	
 	core->getInput()->addEventListener(this, InputEvent::EVENT_MOUSEWHEEL_DOWN);	
 }
 }
 
 
+void Scene::setOverrideMaterial(Material *material) {
+    overrideMaterial = material;
+}
+
 void Scene::setSceneType(int newType) {
 void Scene::setSceneType(int newType) {
     sceneType = newType;
     sceneType = newType;
 	switch(sceneType) {
 	switch(sceneType) {
@@ -174,6 +179,8 @@ Camera *Scene::getDefaultCamera() {
 void Scene::Render(Camera *targetCamera) {	
 void Scene::Render(Camera *targetCamera) {	
 	if(!targetCamera && !activeCamera)
 	if(!targetCamera && !activeCamera)
 		return;
 		return;
+    
+    renderer->setOverrideMaterial(overrideMaterial);
 	
 	
 	if(!targetCamera)
 	if(!targetCamera)
 		targetCamera = activeCamera;
 		targetCamera = activeCamera;

+ 7 - 15
Core/Contents/Source/PolySceneMesh.cpp

@@ -51,12 +51,12 @@ SceneMesh::SceneMesh(const String& fileName) : Entity(), texture(NULL), material
 	lineSmooth = false;
 	lineSmooth = false;
 	ownsMesh = true;
 	ownsMesh = true;
 	ownsSkeleton = true;
 	ownsSkeleton = true;
-    renderWireframe = false;
 	lineWidth = 1.0;
 	lineWidth = 1.0;
 	pointSize = 1.0;
 	pointSize = 1.0;
 	pointSmooth = false;
 	pointSmooth = false;
 	overlayWireframe = false;
 	overlayWireframe = false;
 	useGeometryHitDetection = false;
 	useGeometryHitDetection = false;
+    forceMaterial = false;
 }
 }
 
 
 SceneMesh::SceneMesh(Mesh *mesh) : Entity(), texture(NULL), material(NULL), skeleton(NULL), localShaderOptions(NULL) {
 SceneMesh::SceneMesh(Mesh *mesh) : Entity(), texture(NULL), material(NULL), skeleton(NULL), localShaderOptions(NULL) {
@@ -68,13 +68,13 @@ SceneMesh::SceneMesh(Mesh *mesh) : Entity(), texture(NULL), material(NULL), skel
 	useVertexBuffer = false;
 	useVertexBuffer = false;
 	lineSmooth = false;
 	lineSmooth = false;
 	ownsMesh = true;
 	ownsMesh = true;
-    renderWireframe = false;
 	ownsSkeleton = true;	
 	ownsSkeleton = true;	
 	lineWidth = 1.0;
 	lineWidth = 1.0;
 	pointSize = 1.0;
 	pointSize = 1.0;
 	pointSmooth = false;
 	pointSmooth = false;
 	overlayWireframe = false;	
 	overlayWireframe = false;	
 	useGeometryHitDetection = false;
 	useGeometryHitDetection = false;
+    forceMaterial = false;
 }
 }
 
 
 SceneMesh::SceneMesh(int meshType) : texture(NULL), material(NULL), skeleton(NULL), localShaderOptions(NULL) {
 SceneMesh::SceneMesh(int meshType) : texture(NULL), material(NULL), skeleton(NULL), localShaderOptions(NULL) {
@@ -85,12 +85,12 @@ SceneMesh::SceneMesh(int meshType) : texture(NULL), material(NULL), skeleton(NUL
 	showVertexNormals = false;	
 	showVertexNormals = false;	
 	useVertexBuffer = false;	
 	useVertexBuffer = false;	
 	lineSmooth = false;
 	lineSmooth = false;
-    renderWireframe = false;
 	ownsMesh = true;
 	ownsMesh = true;
 	ownsSkeleton = true;	
 	ownsSkeleton = true;	
 	lineWidth = 1.0;
 	lineWidth = 1.0;
 	overlayWireframe = false;
 	overlayWireframe = false;
-	useGeometryHitDetection = false;			
+	useGeometryHitDetection = false;
+    forceMaterial = false;
 }
 }
 
 
 void SceneMesh::setMesh(Mesh *mesh) {
 void SceneMesh::setMesh(Mesh *mesh) {
@@ -318,19 +318,13 @@ void SceneMesh::Render() {
 	renderer->setPointSmooth(pointSmooth);
 	renderer->setPointSmooth(pointSmooth);
 	
 	
 	if(material) {
 	if(material) {
-		renderer->applyMaterial(material, localShaderOptions,0);
+		renderer->applyMaterial(material, localShaderOptions,0, forceMaterial);
 	} else {
 	} else {
 		if(texture)
 		if(texture)
 			renderer->setTexture(texture);
 			renderer->setTexture(texture);
 		else
 		else
 			renderer->setTexture(NULL);
 			renderer->setTexture(NULL);
 	}
 	}
-		
-    if(renderWireframe) {
-		renderer->setWireframePolygonMode(true);
-    } else {
-        renderer->setWireframePolygonMode(false);
-    }
     
     
 	if(useVertexBuffer) {
 	if(useVertexBuffer) {
 		renderer->drawVertexBuffer(mesh->getVertexBuffer(), mesh->useVertexColors);
 		renderer->drawVertexBuffer(mesh->getVertexBuffer(), mesh->useVertexColors);
@@ -355,9 +349,7 @@ void SceneMesh::Render() {
 		} else {
 		} else {
 			renderMeshLocally();
 			renderMeshLocally();
 		}
 		}
-		renderer->enableDepthTest(depthTestVal);		
-		renderer->setWireframePolygonMode(false);
+		renderer->enableDepthTest(depthTestVal);
 	}	
 	}	
-	
-    
+    renderer->setWireframePolygonMode(false);    
 }
 }

Разница между файлами не показана из-за своего большого размера
+ 3 - 3
IDE/Assets/ide_icons.ai


+ 8 - 3
IDE/Contents/Include/PolycodeEntityEditor.h

@@ -109,11 +109,11 @@ class EntityEditorMainView : public UIElement {
             void setEditorMode(int newMode);
             void setEditorMode(int newMode);
             Entity *getSelectedEntity();
             Entity *getSelectedEntity();
     
     
-            void setMaterialRecursive(const String &materialName, bool wireFrame, Entity *entity);
-            void restoreSettingsRecursive(Entity *entity);
             void setOverlayWireframeRecursive(Entity *targetEntity, bool val);
             void setOverlayWireframeRecursive(Entity *targetEntity, bool val);
             void setLinkedEntityPropsRecursive(SceneEntityInstance *parentInstance, Entity *entity);
             void setLinkedEntityPropsRecursive(SceneEntityInstance *parentInstance, Entity *entity);
-        
+    
+            void disableLighting(bool disable);
+    
             void onGainFocus();
             void onGainFocus();
             void onLoseFocus();
             void onLoseFocus();
             void deleteSelected();
             void deleteSelected();
@@ -132,6 +132,7 @@ class EntityEditorMainView : public UIElement {
     
     
             CoreInput *input;
             CoreInput *input;
 			
 			
+            bool lightsDisabled;
             int editorMode;
             int editorMode;
 			Entity *topBar;
 			Entity *topBar;
 			UIRect *headerBg;
 			UIRect *headerBg;
@@ -143,6 +144,9 @@ class EntityEditorMainView : public UIElement {
 			Scene *mainScene;
 			Scene *mainScene;
             Entity *sceneObjectRoot;
             Entity *sceneObjectRoot;
     
     
+            SceneLight *customLight1;
+            SceneLight *customLight2;
+    
             Entity *objectRootBase;
             Entity *objectRootBase;
             Entity *iconBase;
             Entity *iconBase;
             SceneEntityInstance *objectRootInstance;
             SceneEntityInstance *objectRootInstance;
@@ -160,6 +164,7 @@ class EntityEditorMainView : public UIElement {
             UIMenu *addEntityMenu;
             UIMenu *addEntityMenu;
     
     
             UIIconSelector *shadeModeSelector;
             UIIconSelector *shadeModeSelector;
+            UIIconSelector *lightingModeSelector;
     
     
             CameraPreviewWindow *cameraPreview;
             CameraPreviewWindow *cameraPreview;
     
     

BIN
IDE/Contents/Resources/Images/entityEditor/lights_icon.png


BIN
IDE/Contents/Resources/Images/entityEditor/nolights_icon.png


BIN
IDE/Contents/Resources/ImagesRetina/entityEditor/lights_icon.png


BIN
IDE/Contents/Resources/ImagesRetina/entityEditor/nolights_icon.png


+ 50 - 44
IDE/Contents/Source/PolycodeEntityEditor.cpp

@@ -211,6 +211,7 @@ EntityEditorMainView::EntityEditorMainView() {
 	processInputEvents = true;
 	processInputEvents = true;
     multiselectIndex = 0;
     multiselectIndex = 0;
     objectRootInstance = NULL;
     objectRootInstance = NULL;
+    lightsDisabled = false;
 
 
 	mainScene = new Scene(Scene::SCENE_3D, true);
 	mainScene = new Scene(Scene::SCENE_3D, true);
 	renderTexture = new SceneRenderTexture(mainScene, mainScene->getDefaultCamera(), 512, 512);
 	renderTexture = new SceneRenderTexture(mainScene, mainScene->getDefaultCamera(), 512, 512);
@@ -218,6 +219,20 @@ EntityEditorMainView::EntityEditorMainView() {
 	mainScene->useClearColor = true;
 	mainScene->useClearColor = true;
 	mainScene->rootEntity.processInputEvents = true;
 	mainScene->rootEntity.processInputEvents = true;
 	   
 	   
+    Number customFalloff = 0.006;
+    // setup custom lights for disabled lighting
+    customLight1 = new SceneLight(SceneLight::POINT_LIGHT, mainScene,999999, customFalloff, customFalloff, customFalloff);
+    customLight1->editorOnly = true;
+    customLight1->setPosition(9999, 9999, 9999);
+    mainScene->addLight(customLight1);
+    customLight1->enabled = false;
+
+    customLight2 = new SceneLight(SceneLight::POINT_LIGHT, mainScene,999999, customFalloff, customFalloff, customFalloff);
+    customLight2->editorOnly = true;
+    customLight2->setPosition(-9999, -9999, -9999);
+    mainScene->addLight(customLight2);
+    customLight2->enabled = false;
+    
 	renderTextureShape = new UIRect(256, 256);
 	renderTextureShape = new UIRect(256, 256);
 	renderTextureShape->setAnchorPoint(-1.0, -1.0, 0.0);	
 	renderTextureShape->setAnchorPoint(-1.0, -1.0, 0.0);	
 	renderTextureShape->setTexture(renderTexture->getTargetTexture());
 	renderTextureShape->setTexture(renderTexture->getTargetTexture());
@@ -290,9 +305,17 @@ EntityEditorMainView::EntityEditorMainView() {
     shadeModeSelector->addIcon("entityEditor/shade_full.png");
     shadeModeSelector->addIcon("entityEditor/shade_full.png");
     shadeModeSelector->addIcon("entityEditor/shade_solid.png");
     shadeModeSelector->addIcon("entityEditor/shade_solid.png");
     shadeModeSelector->addIcon("entityEditor/shade_wire.png");
     shadeModeSelector->addIcon("entityEditor/shade_wire.png");
-//    topBar->addChild(shadeModeSelector);
+    topBar->addChild(shadeModeSelector);
     shadeModeSelector->setPosition(320, 3);
     shadeModeSelector->setPosition(320, 3);
     shadeModeSelector->addEventListener(this, UIEvent::SELECT_EVENT);
     shadeModeSelector->addEventListener(this, UIEvent::SELECT_EVENT);
+
+    lightingModeSelector = new UIIconSelector();
+    lightingModeSelector->addIcon("entityEditor/lights_icon.png");
+    lightingModeSelector->addIcon("entityEditor/nolights_icon.png");
+    topBar->addChild(lightingModeSelector);
+    lightingModeSelector->setPosition(420, 3);
+    lightingModeSelector->addEventListener(this, UIEvent::SELECT_EVENT);
+    
     
     
     editorMode = EDITOR_MODE_3D;
     editorMode = EDITOR_MODE_3D;
     
     
@@ -378,6 +401,7 @@ void EntityEditorMainView::createIcon(Entity *entity, String iconFile) {
     iconBase->addChild(iconPrimitive);
     iconBase->addChild(iconPrimitive);
     iconPrimitive->billboardMode = true;
     iconPrimitive->billboardMode = true;
     iconPrimitive->setUserData((void*)entity);
     iconPrimitive->setUserData((void*)entity);
+    iconPrimitive->forceMaterial = true;
     iconPrimitive->processInputEvents = true;
     iconPrimitive->processInputEvents = true;
     iconPrimitive->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
     iconPrimitive->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
     iconPrimitive->ignoreParentMatrix = true;
     iconPrimitive->ignoreParentMatrix = true;
@@ -548,6 +572,7 @@ void EntityEditorMainView::addEntityFromMenu(String command) {
         SceneLight *newLight = new SceneLight(SceneLight::POINT_LIGHT, mainScene, 1.0);
         SceneLight *newLight = new SceneLight(SceneLight::POINT_LIGHT, mainScene, 1.0);
         sceneObjectRoot->addChild(newLight);
         sceneObjectRoot->addChild(newLight);
         mainScene->addLight(newLight);
         mainScene->addLight(newLight);
+        newLight->enabled = !lightsDisabled;        
         setEditorProps(newLight);
         setEditorProps(newLight);
         newLight->setPosition(cursorPosition);
         newLight->setPosition(cursorPosition);
         selectEntity(newLight);
         selectEntity(newLight);
@@ -736,16 +761,25 @@ void EntityEditorMainView::handleEvent(Event *event) {
                 break;
                 break;
             }
             }
         }
         }
+    } else if(event->getDispatcher() == lightingModeSelector) {
+        switch(lightingModeSelector->getSelectedIndex()) {
+            case 0:
+                disableLighting(false);
+            break;
+            case 1:
+                disableLighting(true);
+            break;
+        }
     } else if(event->getDispatcher() == shadeModeSelector) {
     } else if(event->getDispatcher() == shadeModeSelector) {
         switch(shadeModeSelector->getSelectedIndex()) {
         switch(shadeModeSelector->getSelectedIndex()) {
             case 0:
             case 0:
-                restoreSettingsRecursive(sceneObjectRoot);
+                mainScene->setOverrideMaterial(NULL);
             break;
             break;
             case 1:
             case 1:
-                setMaterialRecursive("Default", false, sceneObjectRoot);
+                mainScene->setOverrideMaterial((Material*)CoreServices::getInstance()->getResourceManager()->getGlobalPool()->getResource(Resource::RESOURCE_MATERIAL, "Default"));
             break;
             break;
             case 2:
             case 2:
-                setMaterialRecursive("", true, sceneObjectRoot);
+                mainScene->setOverrideMaterial((Material*)CoreServices::getInstance()->getResourceManager()->getGlobalPool()->getResource(Resource::RESOURCE_MATERIAL, "UnlitWireframe"));
             break;
             break;
         }
         }
     } else {
     } else {
@@ -768,50 +802,22 @@ void EntityEditorMainView::handleEvent(Event *event) {
     }
     }
 }
 }
 
 
-void EntityEditorMainView::restoreSettingsRecursive(Entity *entity) {
-    SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(entity);
-    if(sceneMesh && !entity->editorOnly) {
-        SceneMeshSettings *meshSettings = (SceneMeshSettings*) entity->getUserData();
-        if(meshSettings) {
-            sceneMesh->setMaterial(meshSettings->material);
-            sceneMesh->backfaceCulled = meshSettings->backfaceCulled;
-        }
-        sceneMesh->renderWireframe = false;
-    }
+void EntityEditorMainView::disableLighting(bool disable) {
     
     
-    for(int i=0; i < entity->getNumChildren(); i++) {
-        restoreSettingsRecursive(entity->getChildAtIndex(i));
-    }
-}
-
-void EntityEditorMainView::setMaterialRecursive(const String &materialName, bool wireFrame, Entity *entity) {
-    SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(entity);
-    if(sceneMesh && !entity->editorOnly) {
-        
-        if(!sceneMesh->getUserData()) {
-            SceneMeshSettings *meshSettings = new SceneMeshSettings();
-            meshSettings->material = sceneMesh->getMaterial();
-            meshSettings->backfaceCulled = sceneMesh->backfaceCulled;
-            sceneMesh->setUserData((void*)meshSettings);
-            
-        } else {
-            SceneMeshSettings *meshSettings = (SceneMeshSettings*) entity->getUserData();
-            meshSettings->material = sceneMesh->getMaterial();
-            meshSettings->backfaceCulled = sceneMesh->backfaceCulled;
-        }
-        
-        sceneMesh->setMaterialByName(materialName);
-        sceneMesh->renderWireframe = wireFrame;
-        if(wireFrame) {
-//            sceneMesh->setColor(RANDOM_NUMBER, RANDOM_NUMBER, RANDOM_NUMBER, 1.0);
-            sceneMesh->backfaceCulled = false;
-        }
+    lightsDisabled = disable;
+    
+    for(int i=0; i < mainScene->getNumLights(); i++) {
+        SceneLight *light = mainScene->getLight(i);
+        light->enabled = !disable;
     }
     }
     
     
-    for(int i=0; i < entity->getNumChildren(); i++) {
-        setMaterialRecursive(materialName, wireFrame, entity->getChildAtIndex(i));
+    if(disable) {
+        customLight1->enabled = true;
+        customLight2->enabled = true;
+    } else {
+        customLight1->enabled = false;
+        customLight2->enabled = false;
     }
     }
-
 }
 }
 
 
 Scene *EntityEditorMainView::getMainScene() {
 Scene *EntityEditorMainView::getMainScene() {

Некоторые файлы не были показаны из-за большого количества измененных файлов