Переглянути джерело

Fixed shader texture prop sheet, added scene label prop sheet

Ivan Safrin 12 роки тому
батько
коміт
496961ce73

+ 7 - 3
Core/Contents/Include/PolySceneLabel.h

@@ -39,9 +39,12 @@ namespace Polycode {
 		public:
 			
 			
-			SceneLabel(const String& text, int size, const String& fontName = "sans", int amode = 0, Number actualHeight = -1.0, bool premultiplyAlpha = false);
+			SceneLabel(const String& text, int size, const String& fontName = "sans", int amode = 0, Number actualHeight = 0.0, bool premultiplyAlpha = false);
 			
 			String getText();
+        
+            void setLabelActualHeight(Number actualHeight);
+            Number getLabelActualHeight();
 			
 			void Render();
 
@@ -67,8 +70,9 @@ namespace Polycode {
 		protected:
 			
 			void updateFromLabel();        
-			
-			Number labelScale;
+			     
+			Number actualHeight;
+            Number labelScale;
 			Label *label;
 	};
 }

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

@@ -39,15 +39,11 @@ bool SceneLabel::createMipmapsForLabels = true;
 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);
-    if(actualHeight > 0.0) {
-        this->labelScale = actualHeight/((Number)size);
-    } else {
-        this->labelScale = 1.0;
-    }
+    
 	positionAtBaseline = SceneLabel::defaultPositionAtBaseline;
 	setAnchorPoint(SceneLabel::defaultAnchor);	
 	snapToPixels = SceneLabel::defaultSnapToPixels;	
-	updateFromLabel();
+	setLabelActualHeight(actualHeight);
 }
 			
 
@@ -62,9 +58,24 @@ String SceneLabel::getText() {
 	return label->getText();
 }
 
+void SceneLabel::setLabelActualHeight(Number actualHeight) {
+    this->actualHeight = actualHeight;
+    
+    if(actualHeight > 0.0) {
+        labelScale = actualHeight/((Number)label->getSize());
+    } else {
+        labelScale = 1.0;
+    }
+    updateFromLabel();
+}
+
+Number SceneLabel::getLabelActualHeight() {
+    return actualHeight;
+}
+
 void SceneLabel::updateFromLabel() {
 
-	MaterialManager *materialManager = CoreServices::getInstance()->getMaterialManager();	
+	MaterialManager *materialManager = CoreServices::getInstance()->getMaterialManager();
 	if(texture)
 		materialManager->deleteTexture(texture);
 

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

@@ -54,6 +54,7 @@ class EntityEditorPropertyView : public UIElement {
         ScenePrimitiveSheet *primitiveSheet;
         SceneLightSheet *lightSheet;
         ParticleEmitterSheet *particleSheet;
+        SceneLabelSheet *labelSheet;
     
         ShaderTexturesSheet *shaderTexturesSheet;
         ShaderOptionsSheet *shaderOptionsSheet;

+ 26 - 11
IDE/Contents/Include/PolycodeProps.h

@@ -618,6 +618,20 @@ class SceneLightSheet : public PropSheet {
         SliderProp *shadowMapFOVProp;
         NumberProp *shadowResolutionProp;
 };
+/*
+class SceneMeshSheet : public PropSheet {
+    public:
+        SceneMeshSheet();
+        ~SceneMeshSheet();
+    
+        void setSceneMesh(SceneMesh *mesh);
+        void handleEvent(Event *event);
+    
+    private:
+    
+        SceneMesh *sceneMesh;
+};
+*/
 
 class ScenePrimitiveSheet : public PropSheet {
 public:
@@ -673,24 +687,23 @@ class EntityPropSheet : public PropSheet {
 		int removeIndex;
 };
 
-class UILabelSheet : public PropSheet {
+class SceneLabelSheet : public PropSheet {
 	public:
-		UILabelSheet();
-		~UILabelSheet();
+		SceneLabelSheet();
+		~SceneLabelSheet();
 		
 		void refreshFonts();
-		
 		void handleEvent(Event *event);
-		void Update();
-				
-		UILabel *label;
-		UILabel *lastLabel;	
-		
-		int lastSize;
-		String lastFont;
+    
+        void setSceneLabel(SceneLabel *label);
 		
+    
+    private:
+		SceneLabel *label;
+				
 		StringProp *caption;
 		NumberProp *size;
+        NumberProp *actualHeight;
 		ComboProp *font;
 		BoolProp *enableAA;
 };
@@ -709,6 +722,8 @@ class SceneSpriteSheet : public PropSheet {
 		SceneSprite *lastSprite;
 };
 
+
+
 class SceneEntityInstanceSheet : public PropSheet {
 	public:
 		SceneEntityInstanceSheet();

+ 21 - 2
IDE/Contents/Source/EntityEditorPropertyView.cpp

@@ -46,6 +46,11 @@ EntityEditorPropertyView::EntityEditorPropertyView() : UIElement() {
     entityProps->addPropSheet(shaderOptionsSheet);
     shaderOptionsSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
     
+    labelSheet = new SceneLabelSheet();
+    entityProps->addPropSheet(labelSheet);
+    labelSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
+    
+    
     lightSheet = new SceneLightSheet();
     entityProps->addPropSheet(lightSheet);
     lightSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
@@ -80,13 +85,18 @@ void EntityEditorPropertyView::handleEvent(Event *event) {
 
 void EntityEditorPropertyView::updateShaderOptions() {
     SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(targetEntity);
+    SceneLabel *sceneLabel = dynamic_cast<SceneLabel*>(targetEntity);
     
     shaderTexturesSheet->enabled = false;
     shaderOptionsSheet->enabled = false;
     
     if(sceneMesh) {
         if(sceneMesh->getMaterial() && sceneMesh->getLocalShaderOptions()) {
+            
+            // can't edit the textures manually on a scene label
+            if(!sceneLabel) {
             shaderTexturesSheet->setShader(sceneMesh->getMaterial()->getShader(0), sceneMesh->getMaterial(), sceneMesh->getLocalShaderOptions());
+            }
             
             shaderOptionsSheet->setShader(sceneMesh->getMaterial()->getShader(0), sceneMesh->getMaterial(), sceneMesh->getLocalShaderOptions());
         }
@@ -103,9 +113,18 @@ void EntityEditorPropertyView::setEntity(Entity *entity) {
     SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(entity);
     materialSheet->setSceneMesh(sceneMesh);
     updateShaderOptions();
-    
+
+    SceneLabel *sceneLabel = dynamic_cast<SceneLabel*>(entity);
+    labelSheet->setSceneLabel(sceneLabel);
+
     ScenePrimitive *scenePrimitive = dynamic_cast<ScenePrimitive*>(entity);
-    primitiveSheet->setScenePrimitive(scenePrimitive);
+    
+    if(!sceneLabel) {
+        primitiveSheet->setScenePrimitive(scenePrimitive);
+    } else {
+        primitiveSheet->setScenePrimitive(NULL);
+    }
+    
 
     SceneParticleEmitter *emitter = dynamic_cast<SceneParticleEmitter*>(entity);
     particleSheet->setParticleEmitter(emitter);

+ 18 - 2
IDE/Contents/Source/PolycodeEntityEditor.cpp

@@ -181,7 +181,6 @@ void EntityEditorMainView::addEntityFromMenu(String command) {
         setEditorProps(newPrimitive);
         newPrimitive->setPosition(cursorPosition);
         selectEntity(newPrimitive);
-        newPrimitive->getMesh()->calculateNormals(false);
         return;
     }
 
@@ -204,7 +203,20 @@ void EntityEditorMainView::addEntityFromMenu(String command) {
         globalFrame->showAssetBrowser(extensions);
         return;
     }
-    
+
+    if(command == "add_label") {
+        SceneLabel  *newLabel = new SceneLabel("TEXT", 12);
+        newLabel->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
+        newLabel->setAnchorPoint(-1.0, 0.0, 0.0);
+        newLabel->snapToPixels = false;
+        newLabel->positionAtBaseline = false;
+        sceneObjectRoot->addChild(newLabel);
+        setEditorProps(newLabel);
+        newLabel->setPosition(cursorPosition);
+        selectEntity(newLabel);
+        return;
+    }
+
     
     if(command == "add_light") {
         SceneLight *newLight = new SceneLight(SceneLight::AREA_LIGHT, mainScene, 1.0);
@@ -274,6 +286,10 @@ void EntityEditorMainView::handleEvent(Event *event) {
                 selectEntity(newMesh);
             } else if(assetSelectType == "image") {
                 SceneImage *newImage = new SceneImage(globalFrame->assetBrowser->getFullSelectedAssetPath());
+                newImage->setMaterialByName("UnlitMaterial");
+                if(newImage->getLocalShaderOptions()) {
+                    newImage->getLocalShaderOptions()->addTexture("diffuse", newImage->getTexture());
+                }
                 sceneObjectRoot->addChild(newImage);
                 setEditorProps(newImage);
                 newImage->setPosition(cursorPosition);

+ 62 - 41
IDE/Contents/Source/PolycodeProps.cpp

@@ -2102,8 +2102,8 @@ void ShaderTexturesSheet::setShader(Shader *shader, Material *material, ShaderBi
 		for(int j=0; j < cubemaps.size(); j++) {
 			comboProp->comboEntry->addComboItem(cubemaps[j]->getResourceName(), (void*) cubemaps[j]);
 			if(material) {
-				if(material->getShaderBinding(0)) {
-					Cubemap *currentCubemap = material->getShaderBinding(0)->getCubemap(shader->expectedCubemaps[i]);
+				if(binding) {
+					Cubemap *currentCubemap = binding->getCubemap(shader->expectedCubemaps[i]);
 					if(currentCubemap) {
 						if(currentCubemap->getResourceName() == cubemaps[j]->getResourceName()) {
 							comboProp->set(j);
@@ -2122,8 +2122,8 @@ void ShaderTexturesSheet::setShader(Shader *shader, Material *material, ShaderBi
 		TextureProp *textureProp = new TextureProp(shader->expectedTextures[i]);
 		
 		if(material) {
-			if(material->getShaderBinding(0)) {
-				Texture *currentTexture = material->getShaderBinding(0)->getTexture(shader->expectedTextures[i]);
+			if(binding) {
+				Texture *currentTexture = binding->getTexture(shader->expectedTextures[i]);
 				if(currentTexture) {
 					textureProp->set(currentTexture);
 				}
@@ -2455,6 +2455,24 @@ void SceneLightSheet::handleEvent(Event *event) {
     }
     PropSheet::handleEvent(event);
 }
+/*
+SceneMeshSheet::SceneMeshSheet() : PropSheet("MESH FILE", "scene_mesh_file") {
+    enabled = false;
+    sceneMesh = NULL;
+}
+
+SceneMeshSheet::~SceneMeshSheet() {
+        
+}
+
+void SceneMeshSheet::setSceneMesh(SceneMesh *mesh) {
+    
+}
+
+void SceneMeshSheet::handleEvent(Event *event) {
+    
+}
+*/
 
 ScenePrimitiveSheet::ScenePrimitiveSheet() : PropSheet("PRIMITIVE", "scene_primitive") {
     typeProp = new ComboProp("Type");
@@ -2927,8 +2945,9 @@ void SceneEntityInstanceSheet::Update() {
 	}
 }
 
-UILabelSheet::UILabelSheet() : PropSheet("SCREEN LABEL", "UILabel") {
+SceneLabelSheet::SceneLabelSheet() : PropSheet("SCREEN LABEL", "UILabel") {
 	label = NULL;
+    enabled = false;
 	
 	caption = new StringProp("Contents");
 	caption->addEventListener(this, Event::CHANGE_EVENT);
@@ -2938,6 +2957,10 @@ UILabelSheet::UILabelSheet() : PropSheet("SCREEN LABEL", "UILabel") {
 	size->addEventListener(this, Event::CHANGE_EVENT);
 	addProp(size);	
 
+    actualHeight = new NumberProp("Actual height");
+	actualHeight->addEventListener(this, Event::CHANGE_EVENT);
+	addProp(actualHeight);
+
 	font = new ComboProp("Font");
 	font->addEventListener(this, Event::CHANGE_EVENT);
 	addProp(font);	
@@ -2946,15 +2969,13 @@ UILabelSheet::UILabelSheet() : PropSheet("SCREEN LABEL", "UILabel") {
 	enableAA = new BoolProp("Antialias");
 	enableAA->addEventListener(this, Event::CHANGE_EVENT);
 	addProp(enableAA);	
-
-	lastSize = -1;
 	
 	propHeight = 160;
 	
 	refreshFonts();
 }
 
-void UILabelSheet::refreshFonts() {
+void SceneLabelSheet::refreshFonts() {
 	
 	FontManager *fontManager = CoreServices::getInstance()->getFontManager();
 	
@@ -2969,11 +2990,36 @@ void UILabelSheet::refreshFonts() {
 
 }
 
-UILabelSheet::~UILabelSheet() {
+void SceneLabelSheet::setSceneLabel(SceneLabel *label) {
+    this->label = label;
+    
+	if(label) {
+		enabled = true;
+        caption->set(label->getText());
+        enableAA->set(label->getLabel()->getAntialiasMode() == Label::ANTIALIAS_FULL);
+        size->set(label->getLabel()->getSize());
+        actualHeight->set(label->getLabelActualHeight());
+        
+        refreshFonts();
+        
+        for(int i=0; i < font->comboEntry->getNumItems(); i++) {
+            String comboFont = font->comboEntry->getItemAtIndex(i)->label;
+            
+            if(comboFont == label->getLabel()->getFont()->getFontName()) {
+                font->set(i);
+            }
+        }
+        
+	} else {
+		enabled = false;
+	}
+}
+
+SceneLabelSheet::~SceneLabelSheet() {
 
 }
 
-void UILabelSheet::handleEvent(Event *event) {
+void SceneLabelSheet::handleEvent(Event *event) {
 	if(!label)
 		return;
 
@@ -2986,8 +3032,7 @@ void UILabelSheet::handleEvent(Event *event) {
 		String fontName = font->comboEntry->getSelectedItem()->label;
 		Font *font = CoreServices::getInstance()->getFontManager()->getFontByName(fontName);
 		label->getLabel()->setFont(font);
-		label->setText(caption->get());		
-		lastFont = fontName;
+		label->setText(caption->get());
 		dispatchEvent(new Event(), Event::CHANGE_EVENT);
 	}
 
@@ -2996,14 +3041,17 @@ void UILabelSheet::handleEvent(Event *event) {
 		int newSize= size->get();
 		if(newSize < 4)
 			newSize = 4;
-		
-		lastSize = newSize;	
 					
 		label->getLabel()->setSize(newSize);
 		label->setText(caption->get());		
 		dispatchEvent(new Event(), Event::CHANGE_EVENT);
 	}
 
+    if(event->getDispatcher() == actualHeight) {
+		label->setLabelActualHeight(actualHeight->get());
+		dispatchEvent(new Event(), Event::CHANGE_EVENT);
+	}
+
 
 	if(event->getDispatcher() == enableAA) {
 		if(enableAA->get()) {
@@ -3018,33 +3066,6 @@ void UILabelSheet::handleEvent(Event *event) {
 	PropSheet::handleEvent(event);
 }
 
-void UILabelSheet::Update() {
-	if(label) {
-		enabled = true;		
-		if(label != lastLabel) {
-			lastLabel = label;
-	
-		caption->set(label->getText());		
-		enableAA->set(label->getLabel()->getAntialiasMode() == Label::ANTIALIAS_FULL);
-		size->set(label->getLabel()->getSize());
-		
-		for(int i=0; i < font->comboEntry->getNumItems(); i++) {
-			String comboFont = font->comboEntry->getItemAtIndex(i)->label;
-			
-			if(comboFont == label->getLabel()->getFont()->getFontName()) {
-				if(comboFont != lastFont) {
-					font->set(i);
-					lastFont = comboFont;
-				}
-			}
-		}
-
-		}
-	} else {
-		enabled = false;
-	}
-}
-
 SoundSheet::SoundSheet() : PropSheet("SCREEN SOUND", "Sound") {
 	sound = NULL;