Browse Source

Improved UI performance

Ivan Safrin 9 năm trước cách đây
mục cha
commit
b3647aebd2

+ 16 - 12
include/polycode/modules/ui/PolyUIBox.h

@@ -27,10 +27,16 @@
 
 
 namespace Polycode {
 namespace Polycode {
 	
 	
+    class Mesh;
+    
 	class _PolyExport UIBox : public UIElement {
 	class _PolyExport UIBox : public UIElement {
 	public:
 	public:
 		UIBox(String imageFile, Number t, Number r, Number b, Number l, Number boxWidth, Number boxHeight);
 		UIBox(String imageFile, Number t, Number r, Number b, Number l, Number boxWidth, Number boxHeight);
 		virtual ~UIBox();
 		virtual ~UIBox();
+                                    
+        void setMaterial(Material *material);
+        void redrawMesh();
+        void Render(GPUDrawBuffer *buffer);
 		
 		
 		void resizeBox(Number newWidth, Number newHeight);		
 		void resizeBox(Number newWidth, Number newHeight);		
 		
 		
@@ -40,17 +46,15 @@ namespace Polycode {
 		Number r;
 		Number r;
 		Number b;
 		Number b;
 		Number l;
 		Number l;
-		
-		UIRect *tlImage;
-		UIRect *trImage;		
-		UIRect *blImage;		
-		UIRect *brImage;			
-		
-		UIRect *centerImage;
-		
-		UIRect *tImage;
-		UIRect *rImage;
-		UIRect *bImage;
-		UIRect *lImage;		
+        
+        Number imageWidth;
+        Number imageHeight;
+        Number uiScale;
+        
+        Texture *texture;
+        
+        Mesh *boxMesh;
+        Material *material;
+        std::vector<ShaderPass> shaderPasses;
 	};
 	};
 }
 }

+ 0 - 8
src/core/PolySceneEntityInstance.cpp

@@ -363,14 +363,6 @@ Entity *SceneEntityInstance::loadObjectEntryIntoEntity(ObjectEntry *entry, Entit
             label->positionAtBaseline = false;
             label->positionAtBaseline = false;
             applySceneMesh((*entry)["SceneMesh"], label);
             applySceneMesh((*entry)["SceneMesh"], label);
             
             
-            // RENDERER_TODO
-            /*
-            if(label->getLocalShaderOptions()) {
-                label->getLocalShaderOptions()->clearTexture("diffuse");
-                label->getLocalShaderOptions()->addTexture("diffuse", label->getTexture());
-            }
-            */
-            
 			entity = label;
 			entity = label;
         } else if(entityType->stringVal == "SceneParticleEmitter") {
         } else if(entityType->stringVal == "SceneParticleEmitter") {
             
             

+ 119 - 88
src/modules/ui/PolyUIBox.cpp

@@ -24,6 +24,9 @@
 #include "polycode/core/PolyCoreServices.h"
 #include "polycode/core/PolyCoreServices.h"
 #include "polycode/core/PolyConfig.h"
 #include "polycode/core/PolyConfig.h"
 #include "polycode/core/PolyRenderer.h"
 #include "polycode/core/PolyRenderer.h"
+#include "polycode/core/PolyMesh.h"
+#include "polycode/core/PolyResourceManager.h"
+#include "polycode/core/PolyTexture.h"
 
 
 using namespace Polycode;
 using namespace Polycode;
 
 
@@ -36,106 +39,134 @@ UIBox::UIBox(String imageFile, Number t, Number r, Number b, Number l, Number bo
 	
 	
 	setWidth(boxWidth);
 	setWidth(boxWidth);
 	setHeight(boxHeight);
 	setHeight(boxHeight);
-	
-	tlImage = new UIRect(imageFile);
-	tlImage->setImageCoordinates(0,0,l,t, uiScale);
-	addChild(tlImage);
-	tlImage->setPosition(0, 0);
-    tlImage->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
-    
-	trImage = new UIRect(imageFile);
-	trImage->setImageCoordinates((trImage->getWidth()/uiScale)-r,0,r,t, uiScale);
-	addChild(trImage);	
-	trImage->setPosition(boxWidth-r, 0);
-    trImage->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
-    
-	blImage = new UIRect(imageFile);
-	blImage->setImageCoordinates(0,(blImage->getHeight()/uiScale)-b,l,b, uiScale);
-	addChild(blImage);	
-	blImage->setPosition(0, boxHeight-b);
-    blImage->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
-    
-	brImage = new UIRect(imageFile);
-	brImage->setImageCoordinates((brImage->getWidth()/uiScale)-r,(brImage->getHeight()/uiScale)-b,r,b, uiScale);
-	addChild(brImage);	
-	brImage->setPosition(boxWidth-r, boxHeight-b);	
-    brImage->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
-    
-	centerImage = new UIRect(imageFile);
-	centerImage->setImageCoordinates(l,t,(centerImage->getWidth()/uiScale)-l-r, (centerImage->getHeight()/uiScale)-t-b, uiScale);
-	addChild(centerImage);	
-	centerImage->setPosition(l,t);	
-	centerImage->Resize(boxWidth-l-r, boxHeight-t-b);
-    centerImage->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
-    
-	tImage = new UIRect(imageFile);
-	tImage->setImageCoordinates(l,0,(tImage->getWidth()/uiScale)-l-r,t, uiScale);
-	addChild(tImage);
-	tImage->setPosition(l,0);	
-	tImage->Resize(boxWidth-l-r, t);
-    tImage->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
-    
-	bImage = new UIRect(imageFile);
-	bImage->setImageCoordinates(l,(bImage->getHeight()/uiScale)-b,(bImage->getWidth()/uiScale)-l-r,b, uiScale);
-	addChild(bImage);
-	bImage->setPosition(l,boxHeight-b);	
-	bImage->Resize(boxWidth-l-r, b);
-    bImage->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
-    
-	lImage = new UIRect(imageFile);
-	lImage->setImageCoordinates(0,t,l,(lImage->getHeight()/uiScale)-t-b, uiScale);
-	addChild(lImage);
-	lImage->setPosition(0,t);	
-	lImage->Resize(l, boxHeight-t-b);
-    lImage->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
-    
-	rImage = new UIRect(imageFile);
-	rImage->setImageCoordinates((rImage->getWidth()/uiScale)-r,t,r,(rImage->getHeight()/uiScale)-t-b, uiScale);
-	addChild(rImage);
-	rImage->setPosition(boxWidth-r,t);	
-	rImage->Resize(r, boxHeight-t-b);	
-    rImage->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
-	
-	this->t = t;
-	this->r = r;
-	this->b = b;
-	this->l = l;
-
+    
+    MaterialManager *materialManager = CoreServices::getInstance()->getMaterialManager();
+    texture = materialManager->createTextureFromFile(imageFile, materialManager->clampDefault, false);
+    
+    boxMesh = new Mesh(Mesh::TRI_MESH);
+    boxMesh->indexedMesh = true;
+    
+    setMaterial((Material*)CoreServices::getInstance()->getResourceManager()->getGlobalPool()->getResource(Resource::RESOURCE_MATERIAL, "Unlit"));
+    
+    shaderPasses[0].shaderBinding->setTextureForParam("diffuse", texture);
+    
+    imageWidth = texture->getWidth();
+    imageHeight = texture->getHeight();
+    
+    this->t = t;
+    this->r = r;
+    this->b = b;
+    this->l = l;
+    
+    setBlendingMode(Renderer::BLEND_MODE_NORMAL);
+    
+    redrawMesh();
+    
 	ownsChildren = true;	
 	ownsChildren = true;	
 }
 }
 
 
-void UIBox::resizeBox(Number newWidth, Number newHeight) {
 
 
-	brImage->setPosition(newWidth-brImage->getWidth(), newHeight-brImage->getHeight());
-	trImage->setPosition(newWidth-trImage->getWidth(), 0);
-	blImage->setPosition(0, newHeight-blImage->getHeight());
+void UIBox::redrawMesh() {
+    
+    boxMesh->clearMesh();
+
+    boxMesh->addVertexWithUV(0.0, 0.0, 0.0, 0.0, 0.0);
+    boxMesh->addVertexWithUV(l, 0.0, 0.0, l/imageWidth, 0.0);
+    boxMesh->addVertexWithUV(getWidth() - r, 0.0, 0.0, 1.0-r/imageWidth, 0.0);
+    boxMesh->addVertexWithUV(getWidth(), 0.0, 0.0, 1.0, 0.0);
+    
+    boxMesh->addVertexWithUV(0.0, t, 0.0, 0.0, t/imageHeight);
+    boxMesh->addVertexWithUV(l, t, 0.0, l/imageWidth, t/imageHeight);
+    boxMesh->addVertexWithUV(getWidth() - r, t, 0.0, 1.0-r/imageWidth, t/imageHeight);
+    boxMesh->addVertexWithUV(getWidth(), t, 0.0, 1.0, t/imageHeight);
+    
+    
+    boxMesh->addVertexWithUV(0.0, getHeight()-t, 0.0, 0.0, 1.0-b/imageHeight);
+    boxMesh->addVertexWithUV(l, getHeight()-t, 0.0, l/imageWidth, 1.0-b/imageHeight);
+    boxMesh->addVertexWithUV(getWidth() - r, getHeight()-t, 0.0, 1.0-r/imageWidth, 1.0-b/imageHeight);
+    boxMesh->addVertexWithUV(getWidth(), getHeight()-t, 0.0, 1.0, 1.0-b/imageHeight);
+
+    boxMesh->addVertexWithUV(0.0, getHeight(), 0.0, 0.0, 1.0);
+    boxMesh->addVertexWithUV(l, getHeight(), 0.0, l/imageWidth, 1.0);
+    boxMesh->addVertexWithUV(getWidth() - r, getHeight(), 0.0, 1.0-r/imageWidth, 1.0);
+    boxMesh->addVertexWithUV(getWidth(), getHeight(), 0.0, 1.0, 1.0);
+    
+    boxMesh->addIndexedFace(1, 0, 4);
+    boxMesh->addIndexedFace(1, 4, 5);
+    
+    boxMesh->addIndexedFace(2, 1, 5);
+    boxMesh->addIndexedFace(5, 6, 2);
+    
+    boxMesh->addIndexedFace(3, 2, 6);
+    boxMesh->addIndexedFace(3, 6, 7);
+
+    boxMesh->addIndexedFace(5, 4, 8);
+    boxMesh->addIndexedFace(5, 8, 9);
+    
+    boxMesh->addIndexedFace(6, 5, 9);
+    boxMesh->addIndexedFace(6, 9, 10);
+    
+    boxMesh->addIndexedFace(7, 6, 10);
+    boxMesh->addIndexedFace(7, 10, 11);
+    
+    boxMesh->addIndexedFace(9, 8, 12);
+    boxMesh->addIndexedFace(9, 12, 13);
+    
+    boxMesh->addIndexedFace(10, 9, 13);
+    boxMesh->addIndexedFace(10, 13, 14);
 
 
-	centerImage->Resize(ceil(newWidth-l-r), ceil(newHeight-t-b));
+    boxMesh->addIndexedFace(11, 10, 14);
+    boxMesh->addIndexedFace(11, 14, 15);
+    
+    
+    for(int i=0; i < boxMesh->getVertexCount(); i++) {
+        Vector3 v = boxMesh->getVertexPosition(i);
+        boxMesh->setVertexAtOffset(i, v.x-getWidth()/2.0, v.y-getHeight()/2.0, v.z);
+    }
 
 
-	lImage->Resize(l, newHeight-t-b);	
-	rImage->Resize(r, newHeight-t-b);		
-	bImage->Resize(ceil(newWidth-l-r), b);
-	tImage->Resize(ceil(newWidth-l-r), t);
+    shaderPasses[0].shaderBinding->resetAttributes = true;
+}
 
 
-	bImage->setPosition(bImage->getPosition().x, newHeight-bImage->getHeight());	
-	rImage->setPosition(newWidth-rImage->getWidth(),rImage->getPosition().y);
+void UIBox::setMaterial(Material *material) {
+    
+    for(int i=0; i < shaderPasses.size(); i++) {
+        Services()->getRenderer()->destroyShaderBinding(shaderPasses[i].shaderBinding);
+    }
+    shaderPasses.clear();
+    
+    this->material = material;
+    
+    ShaderPass pass;
+    pass.shaderBinding = new ShaderBinding();
+    pass.shaderBinding->targetShader = pass.shader;
+    pass.shader = material->getShaderPass(0).shader;
+    shaderPasses.push_back(pass);
+    
+    shaderPasses[0].shaderBinding->addParamPointer(ProgramParam::PARAM_COLOR, "entityColor", &color);
+    shaderPasses[0].setAttributeArraysFromMesh(boxMesh);
+    shaderPasses[0].shaderBinding->resetAttributes = true;
+}
+
+void UIBox::Render(GPUDrawBuffer *buffer) {
+    drawCall.options.depthTest = false;
+    drawCall.options.depthWrite = false;
+    drawCall.options.backfaceCull = false;
+    
+    drawCall.mesh = boxMesh;
+    drawCall.material = material;
+    drawCall.shaderPasses = shaderPasses;
+    
+    buffer->drawCalls.push_back(drawCall);
+    
+}
 
 
+void UIBox::resizeBox(Number newWidth, Number newHeight) {
 	setWidth(newWidth);
 	setWidth(newWidth);
 	setHeight(newHeight);
 	setHeight(newHeight);
-
+    redrawMesh();
 	this->rebuildTransformMatrix();
 	this->rebuildTransformMatrix();
 }
 }
 
 
 UIBox::~UIBox() {
 UIBox::~UIBox() {
-	if(!ownsChildren) {
-		delete tlImage;
-		delete trImage;		
-		delete blImage;		
-		delete brImage;					
-		delete centerImage;		
-		delete tImage;
-		delete rImage;
-		delete bImage;
-		delete lImage;		
-	}
+    delete boxMesh;
 }
 }