فهرست منبع

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 سال پیش
والد
کامیت
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"/>
 			<fp source="default/Unlit.frag"/>
 		</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">		
 			<vp source="default/DefaultShader.vert"/>
 			<fp source="default/LightCube.frag"/>
@@ -70,7 +74,11 @@
 				<textures>
 				</textures>				
 			</shader>
-		</material>		
+		</material>	
+		<material name="UnlitWireframe" wireframe="true">
+			<shader name="UnlitUntextured">
+			</shader>
+		</material>
 		<material name="Unlit">
 			<shader name="Unlit">
 				<textures>

BIN
Assets/default.pak


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

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

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

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

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

@@ -172,7 +172,7 @@ namespace Polycode {
 		
 		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 setDepthFunction(int depthFunction) = 0;
@@ -306,6 +306,8 @@ namespace Polycode {
         Number getBackingResolutionScaleX();
         Number getBackingResolutionScaleY();
         
+        void setOverrideMaterial(Material *material);
+        
         void pushVertexColor();
         void popVertexColor();
         void multiplyVertexColor(const Color &color);
@@ -340,7 +342,8 @@ namespace Polycode {
 		int textureFilteringMode;
 		
 		Matrix4 cameraMatrix;
-	
+        Material *overrideMaterial;
+        
 		PolycodeShaderModule* currentShaderModule;
 		std::vector <PolycodeShaderModule*> shaderModules;
 

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

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

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

@@ -183,11 +183,8 @@ namespace Polycode {
 			bool useGeometryHitDetection;
 			
 			bool customHitDetection(const Ray &ray);
-
-            /**
-             * If this flag is set to true, the entity will render in wireframe.
-             */
-            bool renderWireframe;
+        
+            bool forceMaterial;
 
 			
 		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);
 		}
 		
-		renderer->applyMaterial(filterShaderMaterial, localShaderOptions[i], i);		
+		renderer->applyMaterial(filterShaderMaterial, localShaderOptions[i], i, true);
 		if(i==filterShaderMaterial->getNumShaders()-1) {
 				if(targetTexture) {
 					renderer->setViewportSize(targetTextureWidth, targetTextureHeight);	

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

@@ -758,41 +758,6 @@ void OpenGLRenderer::clearBuffer(bool colorBuffer, bool depthBuffer) {
 	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() {
 
 	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;
 	blendingMode = Renderer::BLEND_MODE_NORMAL;
 	screenMaterial = false;
+    wireframe = false;
 }
 
 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") {
 			newMaterial->screenMaterial = true;
 		}
-	}	
+	}
+    
+	if(nodeElement->Attribute("wireframe")) {
+		newMaterial->wireframe = String(nodeElement->Attribute("wireframe")) == "true";
+	}
 	
 	if(nodeElement->Attribute("blendingMode")) {
 		newMaterial->blendingMode = atoi(nodeElement->Attribute("blendingMode"));

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

@@ -21,6 +21,9 @@
 */
 
 #include "PolyRenderer.h"
+#include "PolyFixedShader.h"
+#include "PolyMaterial.h"
+#include "PolyModule.h"
 #include "PolyMesh.h"
 
 using namespace Polycode;
@@ -48,6 +51,11 @@ Renderer::Renderer() : clearColor(0.2f, 0.2f, 0.2f, 0.0), currentTexture(NULL),
 	doClearBuffer = true;
     backingResolutionScaleX = 1.0;
     backingResolutionScaleY = 1.0;
+    overrideMaterial = NULL;
+}
+
+void Renderer::setOverrideMaterial(Material *material) {
+    overrideMaterial = material;
 }
 
 Number Renderer::getBackingResolutionScaleX() {
@@ -246,6 +254,49 @@ void Renderer::pushDataArrayForMesh(Mesh *mesh, int 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) {
     backingResolutionScaleX = xScale;
     backingResolutionScaleY = yScale;

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

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

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

@@ -51,12 +51,12 @@ SceneMesh::SceneMesh(const String& fileName) : Entity(), texture(NULL), material
 	lineSmooth = false;
 	ownsMesh = true;
 	ownsSkeleton = true;
-    renderWireframe = false;
 	lineWidth = 1.0;
 	pointSize = 1.0;
 	pointSmooth = false;
 	overlayWireframe = false;
 	useGeometryHitDetection = false;
+    forceMaterial = false;
 }
 
 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;
 	lineSmooth = false;
 	ownsMesh = true;
-    renderWireframe = false;
 	ownsSkeleton = true;	
 	lineWidth = 1.0;
 	pointSize = 1.0;
 	pointSmooth = false;
 	overlayWireframe = false;	
 	useGeometryHitDetection = false;
+    forceMaterial = false;
 }
 
 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;	
 	useVertexBuffer = false;	
 	lineSmooth = false;
-    renderWireframe = false;
 	ownsMesh = true;
 	ownsSkeleton = true;	
 	lineWidth = 1.0;
 	overlayWireframe = false;
-	useGeometryHitDetection = false;			
+	useGeometryHitDetection = false;
+    forceMaterial = false;
 }
 
 void SceneMesh::setMesh(Mesh *mesh) {
@@ -318,19 +318,13 @@ void SceneMesh::Render() {
 	renderer->setPointSmooth(pointSmooth);
 	
 	if(material) {
-		renderer->applyMaterial(material, localShaderOptions,0);
+		renderer->applyMaterial(material, localShaderOptions,0, forceMaterial);
 	} else {
 		if(texture)
 			renderer->setTexture(texture);
 		else
 			renderer->setTexture(NULL);
 	}
-		
-    if(renderWireframe) {
-		renderer->setWireframePolygonMode(true);
-    } else {
-        renderer->setWireframePolygonMode(false);
-    }
     
 	if(useVertexBuffer) {
 		renderer->drawVertexBuffer(mesh->getVertexBuffer(), mesh->useVertexColors);
@@ -355,9 +349,7 @@ void SceneMesh::Render() {
 		} else {
 			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);
             Entity *getSelectedEntity();
     
-            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 disableLighting(bool disable);
+    
             void onGainFocus();
             void onLoseFocus();
             void deleteSelected();
@@ -132,6 +132,7 @@ class EntityEditorMainView : public UIElement {
     
             CoreInput *input;
 			
+            bool lightsDisabled;
             int editorMode;
 			Entity *topBar;
 			UIRect *headerBg;
@@ -143,6 +144,9 @@ class EntityEditorMainView : public UIElement {
 			Scene *mainScene;
             Entity *sceneObjectRoot;
     
+            SceneLight *customLight1;
+            SceneLight *customLight2;
+    
             Entity *objectRootBase;
             Entity *iconBase;
             SceneEntityInstance *objectRootInstance;
@@ -160,6 +164,7 @@ class EntityEditorMainView : public UIElement {
             UIMenu *addEntityMenu;
     
             UIIconSelector *shadeModeSelector;
+            UIIconSelector *lightingModeSelector;
     
             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;
     multiselectIndex = 0;
     objectRootInstance = NULL;
+    lightsDisabled = false;
 
 	mainScene = new Scene(Scene::SCENE_3D, true);
 	renderTexture = new SceneRenderTexture(mainScene, mainScene->getDefaultCamera(), 512, 512);
@@ -218,6 +219,20 @@ EntityEditorMainView::EntityEditorMainView() {
 	mainScene->useClearColor = 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->setAnchorPoint(-1.0, -1.0, 0.0);	
 	renderTextureShape->setTexture(renderTexture->getTargetTexture());
@@ -290,9 +305,17 @@ EntityEditorMainView::EntityEditorMainView() {
     shadeModeSelector->addIcon("entityEditor/shade_full.png");
     shadeModeSelector->addIcon("entityEditor/shade_solid.png");
     shadeModeSelector->addIcon("entityEditor/shade_wire.png");
-//    topBar->addChild(shadeModeSelector);
+    topBar->addChild(shadeModeSelector);
     shadeModeSelector->setPosition(320, 3);
     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;
     
@@ -378,6 +401,7 @@ void EntityEditorMainView::createIcon(Entity *entity, String iconFile) {
     iconBase->addChild(iconPrimitive);
     iconPrimitive->billboardMode = true;
     iconPrimitive->setUserData((void*)entity);
+    iconPrimitive->forceMaterial = true;
     iconPrimitive->processInputEvents = true;
     iconPrimitive->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
     iconPrimitive->ignoreParentMatrix = true;
@@ -548,6 +572,7 @@ void EntityEditorMainView::addEntityFromMenu(String command) {
         SceneLight *newLight = new SceneLight(SceneLight::POINT_LIGHT, mainScene, 1.0);
         sceneObjectRoot->addChild(newLight);
         mainScene->addLight(newLight);
+        newLight->enabled = !lightsDisabled;        
         setEditorProps(newLight);
         newLight->setPosition(cursorPosition);
         selectEntity(newLight);
@@ -736,16 +761,25 @@ void EntityEditorMainView::handleEvent(Event *event) {
                 break;
             }
         }
+    } else if(event->getDispatcher() == lightingModeSelector) {
+        switch(lightingModeSelector->getSelectedIndex()) {
+            case 0:
+                disableLighting(false);
+            break;
+            case 1:
+                disableLighting(true);
+            break;
+        }
     } else if(event->getDispatcher() == shadeModeSelector) {
         switch(shadeModeSelector->getSelectedIndex()) {
             case 0:
-                restoreSettingsRecursive(sceneObjectRoot);
+                mainScene->setOverrideMaterial(NULL);
             break;
             case 1:
-                setMaterialRecursive("Default", false, sceneObjectRoot);
+                mainScene->setOverrideMaterial((Material*)CoreServices::getInstance()->getResourceManager()->getGlobalPool()->getResource(Resource::RESOURCE_MATERIAL, "Default"));
             break;
             case 2:
-                setMaterialRecursive("", true, sceneObjectRoot);
+                mainScene->setOverrideMaterial((Material*)CoreServices::getInstance()->getResourceManager()->getGlobalPool()->getResource(Resource::RESOURCE_MATERIAL, "UnlitWireframe"));
             break;
         }
     } 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() {

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است