Browse Source

Streamlined SceneLabel constructors, removed some old unused code from Skeleton and Bone, added material options to the scene editor

Ivan Safrin 12 years ago
parent
commit
912f42e31d

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

@@ -43,8 +43,6 @@ namespace Polycode {
 			Bone(const String& boneName);
 			virtual ~Bone();
 			
-			void enableBoneLabel(const String& labelFont, Number size, Number scale, Color labelColor);
-			
 			/**
 			* Returns the name of the bone.
 			* @return Name of the bone.

+ 1 - 11
Core/Contents/Include/PolySceneLabel.h

@@ -39,17 +39,7 @@ namespace Polycode {
 		public:
 			
 			
-			SceneLabel(const String& text, int size, const String& fontName = "sans", int amode = 0, bool premultiplyAlpha = false);
-			
-			/**
-			* Constructor.
-			* @param fontName Name of a registered font to use. @see FontManager for info on how to register fonts.
-			* @param text Text to display.
-			* @param size Size in pixels.
-			* @param scale Scale to multiply pixel size by for the actual world size of the label.
-			* @param Anti-aliasing mode. Can be Label::ANTIALIAS_FULL or Label::ANTIALIAS_NONE.
-			*/			
-			SceneLabel(const String& fontName, const String& text, int size, Number scale, int amode, bool premultiplyAlpha = false);
+			SceneLabel(const String& text, int size, const String& fontName = "sans", int amode = 0, Number actualHeight = -1.0, bool premultiplyAlpha = false);
 			
 			String getText();
 			

+ 1 - 10
Core/Contents/Include/PolySkeleton.h

@@ -194,16 +194,7 @@ namespace Polycode {
 			* @param val If true, bones will be rendered, if false, they will not.
 			*/
 			void bonesVisible(bool val);
-			
-			/**
-			* Enables labels with bone names to be rendered. See SceneLabel for details on the parameters.
-			* @param labelFont Font to use
-			* @param size Size of font.
-			* @param scale Scale of font.
-			* @param labelColor Color of the label.
-			*/
-			void enableBoneLabels(const String& labelFont, Number size, Number scale, Color labelColor);
-					
+								
 			/**
 			* Returns the number of bones in the skeleton
 			*/

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

@@ -135,14 +135,6 @@ const String& Bone::getName() const {
 	return boneName;
 }
 
-void Bone::enableBoneLabel(const String& fontLabel, Number size, Number scale, Color labelColor) {
-	SceneLabel *label = new SceneLabel(fontLabel, boneName, size, scale, Label::ANTIALIAS_FULL);
-	label->setColor(labelColor);
-	label->billboardMode = true;
-	label->depthTest = false;
-	addChild(label);
-}
-
 void Bone::Render() {
 
 	CoreServices::getInstance()->getRenderer()->setTexture(NULL);	

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

@@ -33,7 +33,7 @@ SceneParticleEmitter::SceneParticleEmitter(unsigned int particleCount, Number li
     core = CoreServices::getInstance()->getCore();
     motionPerlin = new Perlin(3,5,1.0,RANDOM_NUMBER);
     mesh->useVertexColors = true;
-    depthTest = false;
+    depthWrite = false;
     setParticleCount(particleCount);
     
 }

+ 7 - 12
Core/Contents/Source/PolySceneLabel.cpp

@@ -36,19 +36,14 @@ bool SceneLabel::defaultPositionAtBaseline = false;
 bool SceneLabel::defaultSnapToPixels = false;
 bool SceneLabel::createMipmapsForLabels = true;
 
-SceneLabel::SceneLabel(const String& fontName, const String& text, int size, Number scale, int amode, bool premultiplyAlpha) : ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 1, 1) {
-	label = new Label(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), text, size, amode, premultiplyAlpha);
-	this->labelScale = scale;
-	positionAtBaseline = SceneLabel::defaultPositionAtBaseline;
-	setAnchorPoint(SceneLabel::defaultAnchor);
-	updateFromLabel();
-	snapToPixels = SceneLabel::defaultSnapToPixels;
-}
-
-SceneLabel::SceneLabel(const String& text, int size, const String& fontName, int amode, bool premultiplyAlpha) : ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 1, 1){
+SceneLabel::SceneLabel(const String& text, int size, const String& fontName, int amode, Number actualHeight, bool premultiplyAlpha) : ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 1, 1){
 
 	label = new Label(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), text, size * CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleX(), amode, premultiplyAlpha);
-	this->labelScale = 1.0;
+    if(actualHeight > 0.0) {
+        this->labelScale = actualHeight/((Number)size);
+    } else {
+        this->labelScale = 1.0;
+    }
 	positionAtBaseline = SceneLabel::defaultPositionAtBaseline;
 	setAnchorPoint(SceneLabel::defaultAnchor);	
 	snapToPixels = SceneLabel::defaultSnapToPixels;	
@@ -100,7 +95,7 @@ void SceneLabel::updateFromLabel() {
 
 void SceneLabel::Render() {
 	if(positionAtBaseline) {
-		CoreServices::getInstance()->getRenderer()->translate2D(0.0, (((Number)label->getSize()) * -1.0 / CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleY()) + (((Number)label->getBaselineAdjust())/CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleY()));
+		CoreServices::getInstance()->getRenderer()->translate2D(0.0, (((Number)label->getSize()*labelScale) * -1.0 / CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleY()) + (((Number)label->getBaselineAdjust())*labelScale/CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleY()));
 	}
 	ScenePrimitive::Render();
 }

+ 0 - 13
Core/Contents/Source/PolySkeleton.cpp

@@ -63,19 +63,6 @@ Bone *Skeleton::getBone(int index) const {
 	return bones[index];
 }
 
-void Skeleton::enableBoneLabels(const String& labelFont, Number size, Number scale, Color labelColor) {
-	for(int i=0; i < bones.size(); i++) {
-		bones[i]->enableBoneLabel(labelFont, size, scale,labelColor);
-	}	
-	
-	SceneLabel *label = new SceneLabel(labelFont, "Skeleton", size, scale, Label::ANTIALIAS_FULL);
-	label->setColor(labelColor);
-	label->billboardMode = true;
-	label->depthWrite = false;
-	addChild(label);
-	
-}
-
 void Skeleton::playAnimationByIndex(int index, bool once) {
 	if(index > animations.size()-1)
 		return;

+ 8 - 0
IDE/Contents/Include/EntityEditorPropertyView.h

@@ -37,10 +37,15 @@ class EntityEditorPropertyView : public UIElement {
     
         void setEntity(Entity *entity);
     
+        void handleEvent(Event *event);
+    
+        void updateShaderOptions();
+    
         void Resize(Number width, Number height);
     
     protected:
     
+        Entity *targetEntity;
         PropList *entityProps;
     
         TransformSheet *transformSheet;    
@@ -49,5 +54,8 @@ class EntityEditorPropertyView : public UIElement {
         ScenePrimitiveSheet *primitiveSheet;
         SceneLightSheet *lightSheet;
         ParticleEmitterSheet *particleSheet;
+    
+        ShaderTexturesSheet *shaderTexturesSheet;
+        ShaderOptionsSheet *shaderOptionsSheet;
 };
 

+ 38 - 1
IDE/Contents/Source/EntityEditorPropertyView.cpp

@@ -24,6 +24,9 @@
 
 
 EntityEditorPropertyView::EntityEditorPropertyView() : UIElement() {
+    
+    targetEntity = NULL;
+    
     entityProps = new PropList();
     addChild(entityProps);
     
@@ -35,6 +38,14 @@ EntityEditorPropertyView::EntityEditorPropertyView() : UIElement() {
     entityProps->addPropSheet(materialSheet);
     materialSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
     
+    shaderTexturesSheet = new ShaderTexturesSheet();
+    entityProps->addPropSheet(shaderTexturesSheet);
+    shaderTexturesSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
+
+    shaderOptionsSheet = new ShaderOptionsSheet();
+    entityProps->addPropSheet(shaderOptionsSheet);
+    shaderOptionsSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
+    
     lightSheet = new SceneLightSheet();
     entityProps->addPropSheet(lightSheet);
     lightSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
@@ -59,14 +70,40 @@ void EntityEditorPropertyView::Resize(Number width, Number height) {
     UIElement::Resize(width, height);
 }
 
+void EntityEditorPropertyView::handleEvent(Event *event) {
+    if(event->getDispatcher() == materialSheet) {
+        if(targetEntity) {
+            updateShaderOptions();
+        }
+    }
+}
+
+void EntityEditorPropertyView::updateShaderOptions() {
+    SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(targetEntity);
+    
+    shaderTexturesSheet->enabled = false;
+    shaderOptionsSheet->enabled = false;
+    
+    if(sceneMesh) {
+        if(sceneMesh->getMaterial() && sceneMesh->getLocalShaderOptions()) {
+            shaderTexturesSheet->setShader(sceneMesh->getMaterial()->getShader(0), sceneMesh->getMaterial(), sceneMesh->getLocalShaderOptions());
+            
+            shaderOptionsSheet->setShader(sceneMesh->getMaterial()->getShader(0), sceneMesh->getMaterial(), sceneMesh->getLocalShaderOptions());
+        }
+    }
+}
+
 void EntityEditorPropertyView::setEntity(Entity *entity) {
     
+    targetEntity = entity;
+    
     SceneLight *sceneLight = dynamic_cast<SceneLight*>(entity);
     lightSheet->setSceneLight(sceneLight);
     
     SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(entity);
     materialSheet->setSceneMesh(sceneMesh);
-
+    updateShaderOptions();
+    
     ScenePrimitive *scenePrimitive = dynamic_cast<ScenePrimitive*>(entity);
     primitiveSheet->setScenePrimitive(scenePrimitive);
 

+ 35 - 21
IDE/Contents/Source/PolycodeProps.cpp

@@ -1916,6 +1916,7 @@ void EntityPropSheet::Update() {
 ShaderOptionsSheet::ShaderOptionsSheet() : PropSheet("SHADER OPTIONS", "shader_options"){
 	shader = NULL;
 	propHeight = 40;
+    enabled = false;
 }
 
 ShaderOptionsSheet::~ShaderOptionsSheet() {
@@ -1927,13 +1928,21 @@ void ShaderOptionsSheet::handleEvent(Event *event) {
 	if(event->getEventCode() == Event::CHANGE_EVENT) {
 		for(int i=0 ; i < props.size(); i++) {
 			if(event->getDispatcher() == props[i]) {
+                
+                LocalShaderParam *param = binding->getLocalParamByName(props[i]->label->getText());
+                
 				if(props[i]->propType == "Number") {
-					(*(Number*)binding->getLocalParamByName(props[i]->label->getText())->data) = ((NumberProp*)props[i])->get();
+                    if(!param){
+                        param = binding->addParam(ProgramParam::PARAM_NUMBER, props[i]->label->getText());
+                    }
+					(*(Number*)param->data) = ((NumberProp*)props[i])->get();
 				} else if(props[i]->propType == "Color") {
-					(*(Color*)binding->getLocalParamByName(props[i]->label->getText())->data) = ((ColorProp*)props[i])->get();
-				
-				} else if(props[i]->propType == "Vector2") {
-					(*(Vector2*)binding->getLocalParamByName(props[i]->label->getText())->data) = ((Vector2Prop*)props[i])->get();
+                    
+                    if(!param){
+                        param = binding->addParam(ProgramParam::PARAM_COLOR, props[i]->label->getText());
+                    }
+                    
+					(*(Color*)param->data) = ((ColorProp*)props[i])->get();
 				
 				}
 				dispatchEvent(new Event(), Event::CHANGE_EVENT);				
@@ -1971,7 +1980,11 @@ void ShaderOptionsSheet::setOptionsFromParams(std::vector<ProgramParam> &params)
 						NumberProp *numberProp = new NumberProp(paramName);
 						addProp(numberProp);
 												
-						Number numberValue = (*(Number*)binding->getLocalParamByName(params[i].name)->data);
+                        LocalShaderParam *param = binding->getLocalParamByName(params[i].name);
+                        Number numberValue = 0.0;
+                        if(param) {
+                            numberValue = (*(Number*)param->data);
+                        }
 						numberProp->set(numberValue);
 						propHeight += 30;
 					}
@@ -1979,25 +1992,19 @@ void ShaderOptionsSheet::setOptionsFromParams(std::vector<ProgramParam> &params)
 					case ProgramParam::PARAM_COLOR:
 					{
 						String paramName = params[i].name;
-						
+
+                        LocalShaderParam *param = binding->getLocalParamByName(params[i].name);
+
 						ColorProp *colorProp = new ColorProp(paramName);
 						addProp(colorProp);
 						
-						Color colorValue = (*(Color*)binding->getLocalParamByName(params[i].name)->data);
+						Color colorValue;
+                        if(param) {
+                            colorValue = (*(Color*)param->data);
+                        }
 						colorProp->set(colorValue);
 						
-						propHeight += 40;												
-					}
-					break;
-					case ProgramParam::PARAM_VECTOR2:
-					{
-						String paramName = params[i].name;						
-						Vector2Prop *vec2Prop = new Vector2Prop(paramName);;
-						addProp(vec2Prop);
-						
-						Vector2 vec2val = (*(Vector2*)binding->getLocalParamByName(params[i].name)->data);
-						vec2Prop->set(vec2val);
-						propHeight += 30;
+						propHeight += 40;				
 					}
 					break;
 				}	
@@ -2010,6 +2017,8 @@ void ShaderOptionsSheet::setShader(Shader *shader, Material *material, ShaderBin
 	this->shader = shader;
 	this->material = material;
 	
+    enabled = true;
+    
 	if(!shader || !material)
 		return;
 		
@@ -2024,6 +2033,7 @@ void ShaderOptionsSheet::setShader(Shader *shader, Material *material, ShaderBin
 ShaderTexturesSheet::ShaderTexturesSheet() : PropSheet("SHADER TEXTURES", "shader_textures"){
 	shader = NULL;
 	propHeight = 40;
+    enabled = false;
 }
 
 ShaderTexturesSheet::~ShaderTexturesSheet() {
@@ -2077,6 +2087,8 @@ void ShaderTexturesSheet::setShader(Shader *shader, Material *material, ShaderBi
 	this->shader = shader;
 	this->material = material;
 	
+    enabled = true;
+    
 	if(!shader || !material)
 		return;
 		
@@ -2713,7 +2725,9 @@ void MaterialPropSheet::handleEvent(Event *event) {
         
     if(event->getDispatcher() == materialProp  && event->getEventCode() == Event::CHANGE_EVENT) {
         Material *newMaterial = (Material*)materialProp->comboEntry->getSelectedItem()->data;
-        sceneMesh->setMaterial(newMaterial);
+        if(sceneMesh->getMaterial() != newMaterial) {
+            sceneMesh->setMaterial(newMaterial);
+        }
     }
     PropSheet::handleEvent(event);
 }