From d1c65d1cc10a61b2073be1a0f5365a0e8fb03cd7 Mon Sep 17 00:00:00 2001 From: Yaski Date: Wed, 16 May 2012 13:23:07 +0600 Subject: [PATCH 1/7] FillMaterial:cache getVariableIndex() --- .../engine3d/materials/FillMaterial.as | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/alternativa/engine3d/materials/FillMaterial.as b/src/alternativa/engine3d/materials/FillMaterial.as index 9a031bf..26f0d78 100644 --- a/src/alternativa/engine3d/materials/FillMaterial.as +++ b/src/alternativa/engine3d/materials/FillMaterial.as @@ -77,7 +77,7 @@ package alternativa.engine3d.materials { this.alpha = alpha; } - private function setupProgram(object:Object3D):ShaderProgram { + private function setupProgram(object:Object3D):FillMaterialProgram { var vertexLinker:Linker = new Linker(Context3DProgramType.VERTEX); var positionVar:String = "aPosition"; vertexLinker.declareVariable(positionVar, VariableType.ATTRIBUTE); @@ -90,7 +90,7 @@ package alternativa.engine3d.materials { var fragmentLinker:Linker = new Linker(Context3DProgramType.FRAGMENT); fragmentLinker.addProcedure(outColorProcedure); fragmentLinker.varyings = vertexLinker.varyings; - return new ShaderProgram(vertexLinker, fragmentLinker); + return new FillMaterialProgram(vertexLinker, fragmentLinker); } /** @@ -114,7 +114,7 @@ package alternativa.engine3d.materials { } } - var program:ShaderProgram = programsCache[object.transformProcedure]; + var program:FillMaterialProgram = programsCache[object.transformProcedure]; if (program == null) { program = setupProgram(object); program.upload(camera.context3D); @@ -123,11 +123,11 @@ package alternativa.engine3d.materials { // Drawcall var drawUnit:DrawUnit = camera.renderer.createDrawUnit(object, program.program, geometry._indexBuffer, surface.indexBegin, surface.numTriangles, program); // Streams - drawUnit.setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"), positionBuffer, geometry._attributesOffsets[VertexAttributes.POSITION], VertexAttributes.FORMATS[VertexAttributes.POSITION]); + drawUnit.setVertexBufferAt(program.aPosition, positionBuffer, geometry._attributesOffsets[VertexAttributes.POSITION], VertexAttributes.FORMATS[VertexAttributes.POSITION]); // Constants object.setTransformConstants(drawUnit, surface, program.vertexShader, camera); - drawUnit.setProjectionConstants(camera, program.vertexShader.getVariableIndex("cProjMatrix"), object.localToCameraTransform); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cColor"), red, green, blue, alpha); + drawUnit.setProjectionConstants(camera, program.cProjMatrix, object.localToCameraTransform); + drawUnit.setFragmentConstantsFromNumbers(program.cColor, red, green, blue, alpha); // Send to render if (alpha < 1) { drawUnit.blendSource = Context3DBlendFactor.SOURCE_ALPHA; @@ -149,3 +149,27 @@ package alternativa.engine3d.materials { } } + +import alternativa.engine3d.materials.ShaderProgram; +import alternativa.engine3d.materials.compiler.Linker; + +import flash.display3D.Context3D; + +class FillMaterialProgram extends ShaderProgram { + + public var aPosition:int = -1; + public var cProjMatrix:int = -1; + public var cColor:int = -1; + + public function FillMaterialProgram(vertex:Linker, fragment:Linker) { + super(vertex, fragment); + } + + override public function upload(context3D:Context3D):void { + super.upload(context3D); + + aPosition = vertexShader.findVariable("aPosition"); + cProjMatrix = vertexShader.findVariable("cProjMatrix"); + cColor = fragmentShader.findVariable("cColor"); + } +} From c0fae48feafaeef5baa304912a22bb75d5e114ab Mon Sep 17 00:00:00 2001 From: Yaski Date: Wed, 16 May 2012 13:33:11 +0600 Subject: [PATCH 2/7] TextureMaterial: Cache getVariableIndex() --- .../engine3d/materials/TextureMaterial.as | 41 ++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/src/alternativa/engine3d/materials/TextureMaterial.as b/src/alternativa/engine3d/materials/TextureMaterial.as index e8f1805..05e21e2 100644 --- a/src/alternativa/engine3d/materials/TextureMaterial.as +++ b/src/alternativa/engine3d/materials/TextureMaterial.as @@ -176,9 +176,9 @@ package alternativa.engine3d.materials { * @param alphaTest 0 - disabled, 1 - opaque, 2 - contours * @return */ - private function getProgram(object:Object3D, programs:Vector., camera:Camera3D, opacityMap:TextureResource, alphaTest:int):ShaderProgram { + private function getProgram(object:Object3D, programs:Vector., camera:Camera3D, opacityMap:TextureResource, alphaTest:int):TextureMaterialProgram { var key:int = (opacityMap != null ? 3 : 0) + alphaTest; - var program:ShaderProgram = programs[key]; + var program:TextureMaterialProgram = programs[key]; if (program == null) { // Make program // Vertex shader @@ -208,7 +208,7 @@ package alternativa.engine3d.materials { } fragmentLinker.varyings = vertexLinker.varyings; - program = new ShaderProgram(vertexLinker, fragmentLinker); + program = new TextureMaterialProgram(vertexLinker, fragmentLinker); program.upload(camera.context3D); programs[key] = program; @@ -262,9 +262,9 @@ package alternativa.engine3d.materials { caches[cachedContext3D] = programsCache; } } - var optionsPrograms:Vector. = programsCache[object.transformProcedure]; + var optionsPrograms:Vector. = programsCache[object.transformProcedure]; if(optionsPrograms == null) { - optionsPrograms = new Vector.(6, true); + optionsPrograms = new Vector.(6, true); programsCache[object.transformProcedure] = optionsPrograms; } @@ -329,3 +329,34 @@ package alternativa.engine3d.materials { } } + +import alternativa.engine3d.materials.ShaderProgram; +import alternativa.engine3d.materials.compiler.Linker; + +import flash.display3D.Context3D; + +class TextureMaterialProgram extends ShaderProgram { + + public var aPosition:int = -1; + public var aUV:int = -1; + public var cProjMatrix:int = -1; + public var cThresholdAlpha:int = -1; + public var sDiffuse:int = -1; + public var sOpacity:int = -1; + + public function TextureMaterialProgram(vertex:Linker, fragment:Linker) { + super(vertex, fragment); + } + + override public function upload(context3D:Context3D):void { + super.upload(context3D); + + aPosition = vertexShader.findVariable("aPosition"); + aUV = vertexShader.findVariable("aUV"); + cProjMatrix = vertexShader.findVariable("cProjMatrix"); + cThresholdAlpha = fragmentShader.findVariable("cThresholdAlpha"); + sDiffuse = fragmentShader.findVariable("sDiffuse"); + sOpacity = fragmentShader.findVariable("sOpacity"); + } + +} From a38a0ef4f3b261b8e64630c2e7a4ae5c8d2fda14 Mon Sep 17 00:00:00 2001 From: Yaski Date: Wed, 16 May 2012 13:36:11 +0600 Subject: [PATCH 3/7] TextureMaterial: Cache getVariableIndex() --- .../engine3d/materials/Material.as | 5 ---- .../engine3d/materials/TextureMaterial.as | 23 +++++++------------ 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/src/alternativa/engine3d/materials/Material.as b/src/alternativa/engine3d/materials/Material.as index 47a34e3..03d4d7c 100644 --- a/src/alternativa/engine3d/materials/Material.as +++ b/src/alternativa/engine3d/materials/Material.as @@ -27,11 +27,6 @@ package alternativa.engine3d.materials { */ public class Material { - /** - * @private - */ - alternativa3d function get canDrawInShadowMap():Boolean {return true} - /** * Name of the material */ diff --git a/src/alternativa/engine3d/materials/TextureMaterial.as b/src/alternativa/engine3d/materials/TextureMaterial.as index 05e21e2..3504555 100644 --- a/src/alternativa/engine3d/materials/TextureMaterial.as +++ b/src/alternativa/engine3d/materials/TextureMaterial.as @@ -42,13 +42,6 @@ package alternativa.engine3d.materials { */ public class TextureMaterial extends Material { - /** - * @private - */ - alternativa3d override function get canDrawInShadowMap():Boolean { - return opaquePass && alphaThreshold == 0; - } - private static var caches:Dictionary = new Dictionary(true); private var cachedContext3D:Context3D; private var programsCache:Dictionary; @@ -216,7 +209,7 @@ package alternativa.engine3d.materials { return program; } - private function getDrawUnit(program:ShaderProgram, camera:Camera3D, surface:Surface, geometry:Geometry, opacityMap:TextureResource):DrawUnit { + private function getDrawUnit(program:TextureMaterialProgram, camera:Camera3D, surface:Surface, geometry:Geometry, opacityMap:TextureResource):DrawUnit { var positionBuffer:VertexBuffer3D = geometry.getVertexBuffer(VertexAttributes.POSITION); var uvBuffer:VertexBuffer3D = geometry.getVertexBuffer(VertexAttributes.TEXCOORDS[0]); @@ -226,16 +219,16 @@ package alternativa.engine3d.materials { var drawUnit:DrawUnit = camera.renderer.createDrawUnit(object, program.program, geometry._indexBuffer, surface.indexBegin, surface.numTriangles, program); // Streams - drawUnit.setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"), positionBuffer, geometry._attributesOffsets[VertexAttributes.POSITION], VertexAttributes.FORMATS[VertexAttributes.POSITION]); - drawUnit.setVertexBufferAt(program.vertexShader.getVariableIndex("aUV"), uvBuffer, geometry._attributesOffsets[VertexAttributes.TEXCOORDS[0]], VertexAttributes.FORMATS[VertexAttributes.TEXCOORDS[0]]); + drawUnit.setVertexBufferAt(program.aPosition, positionBuffer, geometry._attributesOffsets[VertexAttributes.POSITION], VertexAttributes.FORMATS[VertexAttributes.POSITION]); + drawUnit.setVertexBufferAt(program.aUV, uvBuffer, geometry._attributesOffsets[VertexAttributes.TEXCOORDS[0]], VertexAttributes.FORMATS[VertexAttributes.TEXCOORDS[0]]); //Constants object.setTransformConstants(drawUnit, surface, program.vertexShader, camera); - drawUnit.setProjectionConstants(camera, program.vertexShader.getVariableIndex("cProjMatrix"), object.localToCameraTransform); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cThresholdAlpha"), alphaThreshold, 0, 0, alpha); + drawUnit.setProjectionConstants(camera, program.cProjMatrix, object.localToCameraTransform); + drawUnit.setFragmentConstantsFromNumbers(program.cThresholdAlpha, alphaThreshold, 0, 0, alpha); // Textures - drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sDiffuse"), diffuseMap._texture); + drawUnit.setTextureAt(program.sDiffuse, diffuseMap._texture); if (opacityMap != null) { - drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sOpacity"), opacityMap._texture); + drawUnit.setTextureAt(program.sOpacity, opacityMap._texture); } return drawUnit; } @@ -268,7 +261,7 @@ package alternativa.engine3d.materials { programsCache[object.transformProcedure] = optionsPrograms; } - var program:ShaderProgram; + var program:TextureMaterialProgram; var drawUnit:DrawUnit; // Opaque pass if (opaquePass && alphaThreshold <= alpha) { From fb439857b820e08d57171dfe4fdef4e86778da1e Mon Sep 17 00:00:00 2001 From: Yaski Date: Wed, 16 May 2012 13:59:27 +0600 Subject: [PATCH 4/7] LightMapMaterial:cache getVariableIndex() --- .../engine3d/materials/LightMapMaterial.as | 65 ++++++++++++++----- 1 file changed, 50 insertions(+), 15 deletions(-) diff --git a/src/alternativa/engine3d/materials/LightMapMaterial.as b/src/alternativa/engine3d/materials/LightMapMaterial.as index c48c978..92b2677 100644 --- a/src/alternativa/engine3d/materials/LightMapMaterial.as +++ b/src/alternativa/engine3d/materials/LightMapMaterial.as @@ -112,9 +112,9 @@ package alternativa.engine3d.materials { * @param alphaTest 0 - disabled, 1 - opaque, 2 - contours * @return */ - private function getProgram(object:Object3D, programs:Vector., camera:Camera3D, opacityMap:TextureResource, alphaTest:int):ShaderProgram { + private function getProgram(object:Object3D, programs:Vector., camera:Camera3D, opacityMap:TextureResource, alphaTest:int):LightMapMaterialProgram { var key:int = (opacityMap != null ? 3 : 0) + alphaTest; - var program:ShaderProgram = programs[key]; + var program:LightMapMaterialProgram = programs[key]; if (program == null) { // Make program // Vertex shader @@ -147,7 +147,7 @@ package alternativa.engine3d.materials { fragmentLinker.varyings = vertexLinker.varyings; - program = new ShaderProgram(vertexLinker, fragmentLinker); + program = new LightMapMaterialProgram(vertexLinker, fragmentLinker); program.upload(camera.context3D); programs[key] = program; @@ -155,7 +155,7 @@ package alternativa.engine3d.materials { return program; } - private function getDrawUnit(program:ShaderProgram, camera:Camera3D, surface:Surface, geometry:Geometry, opacityMap:TextureResource):DrawUnit { + private function getDrawUnit(program:LightMapMaterialProgram, camera:Camera3D, surface:Surface, geometry:Geometry, opacityMap:TextureResource):DrawUnit { var positionBuffer:VertexBuffer3D = geometry.getVertexBuffer(VertexAttributes.POSITION); var uvBuffer:VertexBuffer3D = geometry.getVertexBuffer(VertexAttributes.TEXCOORDS[0]); var lightMapUVBuffer:VertexBuffer3D = geometry.getVertexBuffer(VertexAttributes.TEXCOORDS[lightMapChannel]); @@ -166,18 +166,18 @@ package alternativa.engine3d.materials { var drawUnit:DrawUnit = camera.renderer.createDrawUnit(object, program.program, geometry._indexBuffer, surface.indexBegin, surface.numTriangles, program); // Streams - drawUnit.setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"), positionBuffer, geometry._attributesOffsets[VertexAttributes.POSITION], VertexAttributes.FORMATS[VertexAttributes.POSITION]); - drawUnit.setVertexBufferAt(program.vertexShader.getVariableIndex("aUV"), uvBuffer, geometry._attributesOffsets[VertexAttributes.TEXCOORDS[0]], VertexAttributes.FORMATS[VertexAttributes.TEXCOORDS[0]]); - drawUnit.setVertexBufferAt(program.vertexShader.getVariableIndex("aUV1"), lightMapUVBuffer, geometry._attributesOffsets[VertexAttributes.TEXCOORDS[lightMapChannel]], VertexAttributes.FORMATS[VertexAttributes.TEXCOORDS[lightMapChannel]]); + drawUnit.setVertexBufferAt(program.aPosition, positionBuffer, geometry._attributesOffsets[VertexAttributes.POSITION], VertexAttributes.FORMATS[VertexAttributes.POSITION]); + drawUnit.setVertexBufferAt(program.aUV, uvBuffer, geometry._attributesOffsets[VertexAttributes.TEXCOORDS[0]], VertexAttributes.FORMATS[VertexAttributes.TEXCOORDS[0]]); + drawUnit.setVertexBufferAt(program.aUV1, lightMapUVBuffer, geometry._attributesOffsets[VertexAttributes.TEXCOORDS[lightMapChannel]], VertexAttributes.FORMATS[VertexAttributes.TEXCOORDS[lightMapChannel]]); // Constants object.setTransformConstants(drawUnit, surface, program.vertexShader, camera); - drawUnit.setProjectionConstants(camera, program.vertexShader.getVariableIndex("cProjMatrix"), object.localToCameraTransform); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cThresholdAlpha"), alphaThreshold, 0, 0, alpha); + drawUnit.setProjectionConstants(camera, program.cProjMatrix, object.localToCameraTransform); + drawUnit.setFragmentConstantsFromNumbers(program.cThresholdAlpha, alphaThreshold, 0, 0, alpha); // Textures - drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sDiffuse"), diffuseMap._texture); - drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sLightMap"), lightMap._texture); + drawUnit.setTextureAt(program.sDiffuse, diffuseMap._texture); + drawUnit.setTextureAt(program.sLightMap, lightMap._texture); if (opacityMap != null) { - drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sOpacity"), opacityMap._texture); + drawUnit.setTextureAt(program.sOpacity, opacityMap._texture); } return drawUnit; @@ -208,13 +208,13 @@ package alternativa.engine3d.materials { } } - var optionsPrograms:Vector. = programsCache[object.transformProcedure]; + var optionsPrograms:Vector. = programsCache[object.transformProcedure]; if(optionsPrograms == null) { - optionsPrograms = new Vector.(6, true); + optionsPrograms = new Vector.(6, true); programsCache[object.transformProcedure] = optionsPrograms; } - var program:ShaderProgram; + var program:LightMapMaterialProgram; var drawUnit:DrawUnit; // Opaque pass if (opaquePass && alphaThreshold <= alpha) { @@ -252,3 +252,38 @@ package alternativa.engine3d.materials { } } + +import alternativa.engine3d.materials.ShaderProgram; +import alternativa.engine3d.materials.compiler.Linker; + +import flash.display3D.Context3D; + +class LightMapMaterialProgram extends ShaderProgram { + + public var aPosition:int = -1; + public var aUV:int = -1; + public var aUV1:int = -1; + public var cProjMatrix:int = -1; + public var cThresholdAlpha:int = -1; + public var sDiffuse:int = -1; + public var sLightMap:int = -1; + public var sOpacity:int = -1; + + public function LightMapMaterialProgram(vertex:Linker, fragment:Linker) { + super(vertex, fragment); + } + + override public function upload(context3D:Context3D):void { + super.upload(context3D); + + aPosition = vertexShader.findVariable("aPosition"); + aUV = vertexShader.findVariable("aUV"); + aUV1 = vertexShader.findVariable("aUV1"); + cProjMatrix = vertexShader.findVariable("cProjMatrix"); + cThresholdAlpha = fragmentShader.findVariable("cThresholdAlpha"); + sDiffuse = fragmentShader.findVariable("sDiffuse"); + sLightMap = fragmentShader.findVariable("sLightMap"); + sOpacity = fragmentShader.findVariable("sOpacity"); + } + +} From ac1e207114ed3ae65e18cb63c58bf5a5057bafb3 Mon Sep 17 00:00:00 2001 From: Yaski Date: Wed, 16 May 2012 14:23:02 +0600 Subject: [PATCH 5/7] VertexLightTextureMaterial:cache getVariableIndex() --- .../materials/VertexLightTextureMaterial.as | 62 +++++++++++++++---- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/src/alternativa/engine3d/materials/VertexLightTextureMaterial.as b/src/alternativa/engine3d/materials/VertexLightTextureMaterial.as index d75a601..009f231 100644 --- a/src/alternativa/engine3d/materials/VertexLightTextureMaterial.as +++ b/src/alternativa/engine3d/materials/VertexLightTextureMaterial.as @@ -126,9 +126,9 @@ package alternativa.engine3d.materials { * @param directionalLight * @param lightsLength */ - private function getProgram(object:Object3D, programs:Dictionary, camera:Camera3D, materialKey:String, opacityMap:TextureResource, alphaTest:int, lights:Vector., lightsLength:int):ShaderProgram { + private function getProgram(object:Object3D, programs:Dictionary, camera:Camera3D, materialKey:String, opacityMap:TextureResource, alphaTest:int, lights:Vector., lightsLength:int):VertexLightTextureMaterialProgram { var key:String = materialKey + (opacityMap != null ? "O" : "o") + alphaTest.toString(); - var program:ShaderProgram = programs[key]; + var program:VertexLightTextureMaterialProgram = programs[key]; if (program == null) { var vertexLinker:Linker = new Linker(Context3DProgramType.VERTEX); vertexLinker.declareVariable("tTotalLight"); @@ -200,7 +200,7 @@ package alternativa.engine3d.materials { fragmentLinker.addProcedure(_mulLightingProcedure, "tColor"); fragmentLinker.varyings = vertexLinker.varyings; - program = new ShaderProgram(vertexLinker, fragmentLinker); + program = new VertexLightTextureMaterialProgram(vertexLinker, fragmentLinker); program.upload(camera.context3D); programs[key] = program; @@ -208,7 +208,7 @@ package alternativa.engine3d.materials { return program; } - private function getDrawUnit(program:ShaderProgram, camera:Camera3D, surface:Surface, geometry:Geometry, opacityMap:TextureResource, lights:Vector., lightsLength:int):DrawUnit { + private function getDrawUnit(program:VertexLightTextureMaterialProgram, camera:Camera3D, surface:Surface, geometry:Geometry, opacityMap:TextureResource, lights:Vector., lightsLength:int):DrawUnit { // Buffers var object:Object3D = surface.object; @@ -220,17 +220,17 @@ package alternativa.engine3d.materials { var drawUnit:DrawUnit = camera.renderer.createDrawUnit(object, program.program, geometry._indexBuffer, surface.indexBegin, surface.numTriangles, program); // Streams - drawUnit.setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"), positionBuffer, geometry._attributesOffsets[VertexAttributes.POSITION], VertexAttributes.FORMATS[VertexAttributes.POSITION]); - drawUnit.setVertexBufferAt(program.vertexShader.getVariableIndex("aUV"), uvBuffer, geometry._attributesOffsets[VertexAttributes.TEXCOORDS[0]], VertexAttributes.FORMATS[VertexAttributes.TEXCOORDS[0]]); + drawUnit.setVertexBufferAt(program.aPosition, positionBuffer, geometry._attributesOffsets[VertexAttributes.POSITION], VertexAttributes.FORMATS[VertexAttributes.POSITION]); + drawUnit.setVertexBufferAt(program.aUV, uvBuffer, geometry._attributesOffsets[VertexAttributes.TEXCOORDS[0]], VertexAttributes.FORMATS[VertexAttributes.TEXCOORDS[0]]); // Constants object.setTransformConstants(drawUnit, surface, program.vertexShader, camera); - drawUnit.setProjectionConstants(camera, program.vertexShader.getVariableIndex("cProjMatrix"), object.localToCameraTransform); - drawUnit.setVertexConstantsFromVector(program.vertexShader.getVariableIndex("cAmbientColor"), camera.ambient, 1); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cThresholdAlpha"), alphaThreshold, 0, 0, alpha); + drawUnit.setProjectionConstants(camera, program.cProjMatrix, object.localToCameraTransform); + drawUnit.setVertexConstantsFromVector(program.cAmbientColor, camera.ambient, 1); + drawUnit.setFragmentConstantsFromNumbers(program.cThresholdAlpha, alphaThreshold, 0, 0, alpha); if (lightsLength > 0) { - drawUnit.setVertexBufferAt(program.vertexShader.getVariableIndex("aNormal"), normalsBuffer, geometry._attributesOffsets[VertexAttributes.NORMAL], VertexAttributes.FORMATS[VertexAttributes.NORMAL]); + drawUnit.setVertexBufferAt(program.aNormal, normalsBuffer, geometry._attributesOffsets[VertexAttributes.NORMAL], VertexAttributes.FORMATS[VertexAttributes.NORMAL]); var i:int; var light:Light3D; @@ -269,9 +269,9 @@ package alternativa.engine3d.materials { } // Textures - drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sDiffuse"), diffuseMap._texture); + drawUnit.setTextureAt(program.sDiffuse, diffuseMap._texture); if (opacityMap != null) { - drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sOpacity"), opacityMap._texture); + drawUnit.setTextureAt(program.sOpacity, opacityMap._texture); } return drawUnit; } @@ -294,6 +294,7 @@ package alternativa.engine3d.materials { // Program var light:Light3D; var materialKey:String = ""; + // TODO: Form key by each light types count, not id for (var i:int = 0; i < lightsLength; i++) { light = lights[i]; materialKey += light.lightID; @@ -315,7 +316,7 @@ package alternativa.engine3d.materials { programsCache[object.transformProcedure] = optionsPrograms; } - var program:ShaderProgram; + var program:VertexLightTextureMaterialProgram; var drawUnit:DrawUnit; // Opaque passOpaque pass if (opaquePass && alphaThreshold <= alpha) { @@ -353,3 +354,38 @@ package alternativa.engine3d.materials { } } + +import alternativa.engine3d.materials.ShaderProgram; +import alternativa.engine3d.materials.compiler.Linker; + +import flash.display3D.Context3D; + +class VertexLightTextureMaterialProgram extends ShaderProgram { + + public var aPosition:int = -1; + public var aUV:int = -1; + public var aNormal:int = -1; + public var cProjMatrix:int = -1; + public var cAmbientColor:int = -1; + public var cThresholdAlpha:int = -1; + public var sDiffuse:int = -1; + public var sOpacity:int = -1; + + public function VertexLightTextureMaterialProgram(vertex:Linker, fragment:Linker) { + super(vertex, fragment); + } + + override public function upload(context3D:Context3D):void { + super.upload(context3D); + + aPosition = vertexShader.findVariable("aPosition"); + aUV = vertexShader.findVariable("aUV"); + aNormal = vertexShader.findVariable("aNormal"); + cProjMatrix = vertexShader.findVariable("cProjMatrix"); + cAmbientColor = vertexShader.findVariable("cAmbientColor"); + cThresholdAlpha = fragmentShader.findVariable("cThresholdAlpha"); + sDiffuse = fragmentShader.findVariable("sDiffuse"); + sOpacity = fragmentShader.findVariable("sOpacity"); + } + +} From a90ce894ef8da801c6c0d19bb7dfd77478b6eb34 Mon Sep 17 00:00:00 2001 From: Yaski Date: Wed, 16 May 2012 14:41:11 +0600 Subject: [PATCH 6/7] StandardMaterial:cache getVariableIndex() --- .../engine3d/materials/StandardMaterial.as | 98 ++++++++++++++----- 1 file changed, 75 insertions(+), 23 deletions(-) diff --git a/src/alternativa/engine3d/materials/StandardMaterial.as b/src/alternativa/engine3d/materials/StandardMaterial.as index 87ab20a..59fd23e 100644 --- a/src/alternativa/engine3d/materials/StandardMaterial.as +++ b/src/alternativa/engine3d/materials/StandardMaterial.as @@ -515,9 +515,9 @@ package alternativa.engine3d.materials { * @param directionalLight * @param lightsLength */ - private function getProgram(object:Object3D, programs:Dictionary, camera:Camera3D, materialKey:String, opacityMap:TextureResource, alphaTest:int, lightsGroup:Vector., lightsLength:int, isFirstGroup:Boolean, shadowedLight:Light3D):ShaderProgram { + private function getProgram(object:Object3D, programs:Dictionary, camera:Camera3D, materialKey:String, opacityMap:TextureResource, alphaTest:int, lightsGroup:Vector., lightsLength:int, isFirstGroup:Boolean, shadowedLight:Light3D):StandardMaterialProgram { var key:String = materialKey + (opacityMap != null ? "O" : "o") + alphaTest.toString(); - var program:ShaderProgram = programs[key]; + var program:StandardMaterialProgram = programs[key]; if (program == null) { var vertexLinker:Linker = new Linker(Context3DProgramType.VERTEX); var fragmentLinker:Linker = new Linker(Context3DProgramType.FRAGMENT); @@ -737,7 +737,7 @@ package alternativa.engine3d.materials { // } fragmentLinker.varyings = vertexLinker.varyings; - program = new ShaderProgram(vertexLinker, fragmentLinker); + program = new StandardMaterialProgram(vertexLinker, fragmentLinker); program.upload(camera.context3D); programs[key] = program; @@ -746,7 +746,7 @@ package alternativa.engine3d.materials { } // TODO: return not neccessary more - private function getDrawUnit(program:ShaderProgram, camera:Camera3D, surface:Surface, geometry:Geometry, opacityMap:TextureResource, lights:Vector., lightsLength:int, isFirstGroup:Boolean, shadowedLight:Light3D, opaqueOption:Boolean, transparentOption:Boolean, objectRenderPriority:int):DrawUnit { + private function getDrawUnit(program:StandardMaterialProgram, camera:Camera3D, surface:Surface, geometry:Geometry, opacityMap:TextureResource, lights:Vector., lightsLength:int, isFirstGroup:Boolean, shadowedLight:Light3D, opaqueOption:Boolean, transparentOption:Boolean, objectRenderPriority:int):DrawUnit { // Buffers var positionBuffer:VertexBuffer3D = geometry.getVertexBuffer(VertexAttributes.POSITION); var uvBuffer:VertexBuffer3D = geometry.getVertexBuffer(VertexAttributes.TEXCOORDS[0]); @@ -759,15 +759,15 @@ package alternativa.engine3d.materials { var drawUnit:DrawUnit = camera.renderer.createDrawUnit(object, program.program, geometry._indexBuffer, surface.indexBegin, surface.numTriangles, program); // Streams - drawUnit.setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"), positionBuffer, geometry._attributesOffsets[VertexAttributes.POSITION], VertexAttributes.FORMATS[VertexAttributes.POSITION]); - drawUnit.setVertexBufferAt(program.vertexShader.getVariableIndex("aUV"), uvBuffer, geometry._attributesOffsets[VertexAttributes.TEXCOORDS[0]], VertexAttributes.FORMATS[VertexAttributes.TEXCOORDS[0]]); + drawUnit.setVertexBufferAt(program.aPosition, positionBuffer, geometry._attributesOffsets[VertexAttributes.POSITION], VertexAttributes.FORMATS[VertexAttributes.POSITION]); + drawUnit.setVertexBufferAt(program.aUV, uvBuffer, geometry._attributesOffsets[VertexAttributes.TEXCOORDS[0]], VertexAttributes.FORMATS[VertexAttributes.TEXCOORDS[0]]); // Constants object.setTransformConstants(drawUnit, surface, program.vertexShader, camera); - drawUnit.setProjectionConstants(camera, program.vertexShader.getVariableIndex("cProjMatrix"), object.localToCameraTransform); + drawUnit.setProjectionConstants(camera, program.cProjMatrix, object.localToCameraTransform); // Set options for a surface. X should be 0. - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cSurface"), 0, glossiness, specularPower, 1); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cThresholdAlpha"), alphaThreshold, 0, 0, alpha); + drawUnit.setFragmentConstantsFromNumbers(program.cSurface, 0, glossiness, specularPower, 1); + drawUnit.setFragmentConstantsFromNumbers(program.cThresholdAlpha, alphaThreshold, 0, 0, alpha); var light:Light3D; var len:Number; @@ -781,13 +781,13 @@ package alternativa.engine3d.materials { if (lightsLength > 0 || shadowedLight) { if (_normalMapSpace == NormalMapSpace.TANGENT_RIGHT_HANDED || _normalMapSpace == NormalMapSpace.TANGENT_LEFT_HANDED) { - drawUnit.setVertexBufferAt(program.vertexShader.getVariableIndex("aNormal"), normalsBuffer, geometry._attributesOffsets[VertexAttributes.NORMAL], VertexAttributes.FORMATS[VertexAttributes.NORMAL]); - drawUnit.setVertexBufferAt(program.vertexShader.getVariableIndex("aTangent"), tangentsBuffer, geometry._attributesOffsets[VertexAttributes.TANGENT4], VertexAttributes.FORMATS[VertexAttributes.TANGENT4]); + drawUnit.setVertexBufferAt(program.aNormal, normalsBuffer, geometry._attributesOffsets[VertexAttributes.NORMAL], VertexAttributes.FORMATS[VertexAttributes.NORMAL]); + drawUnit.setVertexBufferAt(program.aTangent, tangentsBuffer, geometry._attributesOffsets[VertexAttributes.TANGENT4], VertexAttributes.FORMATS[VertexAttributes.TANGENT4]); } - drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sBump"), normalMap._texture); + drawUnit.setTextureAt(program.sBump, normalMap._texture); var camTransform:Transform3D = object.cameraToLocalTransform; - drawUnit.setVertexConstantsFromNumbers(program.vertexShader.getVariableIndex("cCameraPosition"), camTransform.d, camTransform.h, camTransform.l); + drawUnit.setVertexConstantsFromNumbers(program.cCameraPosition, camTransform.d, camTransform.h, camTransform.l); for (var i:int = 0; i < lightsLength; i++) { light = lights[i]; @@ -861,32 +861,32 @@ package alternativa.engine3d.materials { } // Textures - drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sDiffuse"), diffuseMap._texture); + drawUnit.setTextureAt(program.sDiffuse, diffuseMap._texture); if (opacityMap != null) { - drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sOpacity"), opacityMap._texture); + drawUnit.setTextureAt(program.sOpacity, opacityMap._texture); } if (glossinessMap != null) { - drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sGlossiness"), glossinessMap._texture); + drawUnit.setTextureAt(program.sGlossiness, glossinessMap._texture); } if (specularMap != null) { - drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sSpecular"), specularMap._texture); + drawUnit.setTextureAt(program.sSpecular, specularMap._texture); } if (isFirstGroup){ if (lightMap != null) { - drawUnit.setVertexBufferAt(program.vertexShader.getVariableIndex("aUV1"), + drawUnit.setVertexBufferAt(program.aUV1, geometry.getVertexBuffer(VertexAttributes.TEXCOORDS[lightMapChannel]), geometry._attributesOffsets[VertexAttributes.TEXCOORDS[lightMapChannel]], Context3DVertexBufferFormat.FLOAT_2); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cAmbientColor"), 0,0,0, 1); - drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sLightMap"), lightMap._texture); + drawUnit.setFragmentConstantsFromNumbers(program.cAmbientColor, 0,0,0, 1); + drawUnit.setTextureAt(program.sLightMap, lightMap._texture); } else { - drawUnit.setFragmentConstantsFromVector(program.fragmentShader.getVariableIndex("cAmbientColor"), camera.ambient, 1); + drawUnit.setFragmentConstantsFromVector(program.cAmbientColor, camera.ambient, 1); } } else{ - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cAmbientColor"), 0,0,0, 1); + drawUnit.setFragmentConstantsFromNumbers(program.cAmbientColor, 0,0,0, 1); } setPassUVProcedureConstants(drawUnit, program.vertexShader); @@ -1034,7 +1034,7 @@ package alternativa.engine3d.materials { // Iterate groups var materialKey:String; - var program:ShaderProgram; + var program:StandardMaterialProgram; var drawUnit:DrawUnit; if (groupsCount==0 && shadowGroupLength==0){ @@ -1197,3 +1197,55 @@ package alternativa.engine3d.materials { } } + +import alternativa.engine3d.materials.ShaderProgram; +import alternativa.engine3d.materials.compiler.Linker; + +import flash.display3D.Context3D; + +class StandardMaterialProgram extends ShaderProgram { + + public var aPosition:int = -1; + public var aUV:int = -1; + public var aUV1:int = -1; + public var aNormal:int = -1; + public var aTangent:int = -1; + public var cProjMatrix:int = -1; + public var cCameraPosition:int = -1; + public var cAmbientColor:int = -1; + public var cSurface:int = -1; + public var cThresholdAlpha:int = -1; + public var sDiffuse:int = -1; + public var sOpacity:int = -1; + public var sBump:int = -1; + public var sGlossiness:int = -1; + public var sSpecular:int = -1; + public var sLightMap:int = -1; + + public function StandardMaterialProgram(vertex:Linker, fragment:Linker) { + super(vertex, fragment); + } + + override public function upload(context3D:Context3D):void { + super.upload(context3D); + + aPosition = vertexShader.findVariable("aPosition"); + aUV = vertexShader.findVariable("aUV"); + aUV1 = vertexShader.findVariable("aUV1"); + aNormal = vertexShader.findVariable("aNormal"); + aTangent = vertexShader.findVariable("aTangent"); + cProjMatrix = vertexShader.findVariable("cProjMatrix"); + cCameraPosition = vertexShader.findVariable("cCameraPosition"); + + cAmbientColor = fragmentShader.findVariable("cAmbientColor"); + cSurface = fragmentShader.findVariable("cSurface"); + cThresholdAlpha = fragmentShader.findVariable("cThresholdAlpha"); + sDiffuse = fragmentShader.findVariable("sDiffuse"); + sOpacity = fragmentShader.findVariable("sOpacity"); + sBump = fragmentShader.findVariable("sBump"); + sGlossiness = fragmentShader.findVariable("sGlossiness"); + sSpecular = fragmentShader.findVariable("sSpecular"); + sLightMap = fragmentShader.findVariable("sLightMap"); + } + +} From 2d989449c495cf745f2a311e30cc90aa4cd2c3ee Mon Sep 17 00:00:00 2001 From: Yaski Date: Wed, 16 May 2012 17:52:32 +0600 Subject: [PATCH 7/7] StandardMaterial: optimized vectors access --- .../engine3d/materials/StandardMaterial.as | 88 ++++++++----------- 1 file changed, 39 insertions(+), 49 deletions(-) diff --git a/src/alternativa/engine3d/materials/StandardMaterial.as b/src/alternativa/engine3d/materials/StandardMaterial.as index 59fd23e..7515caa 100644 --- a/src/alternativa/engine3d/materials/StandardMaterial.as +++ b/src/alternativa/engine3d/materials/StandardMaterial.as @@ -745,8 +745,7 @@ package alternativa.engine3d.materials { return program; } - // TODO: return not neccessary more - private function getDrawUnit(program:StandardMaterialProgram, camera:Camera3D, surface:Surface, geometry:Geometry, opacityMap:TextureResource, lights:Vector., lightsLength:int, isFirstGroup:Boolean, shadowedLight:Light3D, opaqueOption:Boolean, transparentOption:Boolean, objectRenderPriority:int):DrawUnit { + private function addDrawUnits(program:StandardMaterialProgram, camera:Camera3D, surface:Surface, geometry:Geometry, opacityMap:TextureResource, lights:Vector., lightsLength:int, isFirstGroup:Boolean, shadowedLight:Light3D, opaqueOption:Boolean, transparentOption:Boolean, objectRenderPriority:int):void { // Buffers var positionBuffer:VertexBuffer3D = geometry.getVertexBuffer(VertexAttributes.POSITION); var uvBuffer:VertexBuffer3D = geometry.getVertexBuffer(VertexAttributes.TEXCOORDS[0]); @@ -778,7 +777,6 @@ package alternativa.engine3d.materials { var falloff:Number; var hotspot:Number; - if (lightsLength > 0 || shadowedLight) { if (_normalMapSpace == NormalMapSpace.TANGENT_RIGHT_HANDED || _normalMapSpace == NormalMapSpace.TANGENT_LEFT_HANDED) { drawUnit.setVertexBufferAt(program.aNormal, normalsBuffer, geometry._attributesOffsets[VertexAttributes.NORMAL], VertexAttributes.FORMATS[VertexAttributes.NORMAL]); @@ -894,7 +892,6 @@ package alternativa.engine3d.materials { shadowedLight.shadow.setup(drawUnit, program.vertexShader, program.fragmentShader, surface); } - // Inititalizing render properties if (opaqueOption) // Use z-buffer within DrawCall, draws without blending @@ -963,9 +960,11 @@ package alternativa.engine3d.materials { // drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cFogConsts"), 0.5*uScale, 0.5 - uRight, 0); // drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sFogTexture"), fogTexture._texture); // } - return drawUnit; } + private static var lightGroup:Vector. = new Vector.(); + private static var shadowGroup:Vector. = new Vector.(); + /** * @private */ @@ -1007,37 +1006,32 @@ package alternativa.engine3d.materials { programsCache[object.transformProcedure] = optionsPrograms; } - - // Form groups - var groupsCount:int = groups.length = 0; - var firstGroup:Vector. = new Vector.(); - var shadowGroup:Vector. = new Vector.(); - var firstGroupLength:int = 0; + // Form groups of lights + var groupsCount:int = 0; + var lightGroupLength:int = 0; + var shadowGroupLength:int = 0; for (i = 0; i < lightsLength; i++) { light = lights[i]; - if (light.shadow!=null && useShadow){ - shadowGroup.push(light); - } - else{ - if (firstGroupLength==6){ - groups[groupsCount++] = firstGroup; - firstGroup = new Vector.(); - firstGroupLength = 0; + if (light.shadow != null && useShadow) { + shadowGroup[int(shadowGroupLength++)] = light; + } else { + if (lightGroupLength == 6) { + groups[int(groupsCount++)] = lightGroup; + lightGroup = new Vector.(); + lightGroupLength = 0; } - firstGroup[firstGroupLength++] = light; + lightGroup[int(lightGroupLength++)] = light; } } - if (firstGroupLength!=0){ - groups[groupsCount++] = firstGroup; + if (lightGroupLength != 0) { + groups[int(groupsCount++)] = lightGroup; } - var shadowGroupLength:int = shadowGroup.length; // Iterate groups var materialKey:String; var program:StandardMaterialProgram; - var drawUnit:DrawUnit; - if (groupsCount==0 && shadowGroupLength==0){ + if (groupsCount == 0 && shadowGroupLength == 0) { // There is only Ambient light on the scene // Form key materialKey = (lightMap != null) ? "L" : "l"+ @@ -1049,11 +1043,11 @@ package alternativa.engine3d.materials { // Alpha test // use opacityMap if it is presented program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 1, null, 0, true, null); - drawUnit = getDrawUnit(program, camera, surface, geometry, opacityMap, null, 0, true, null, true, false, objectRenderPriority); + addDrawUnits(program, camera, surface, geometry, opacityMap, null, 0, true, null, true, false, objectRenderPriority); } else { // do not use opacityMap at all program = getProgram(object, optionsPrograms, camera, materialKey, null, 0, null, 0, true, null); - drawUnit = getDrawUnit(program, camera, surface, geometry, null, null, 0, true, null, true, false, objectRenderPriority); + addDrawUnits(program, camera, surface, geometry, null, null, 0, true, null, true, false, objectRenderPriority); } } // Transparent pass @@ -1062,20 +1056,19 @@ package alternativa.engine3d.materials { if (alphaThreshold <= alpha && !opaquePass) { // Alpha threshold program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 2, null, 0, true, null); - drawUnit = getDrawUnit(program, camera, surface, geometry, opacityMap, null, 0, true, null, false, true, objectRenderPriority); + addDrawUnits(program, camera, surface, geometry, opacityMap, null, 0, true, null, false, true, objectRenderPriority); } else { // There is no Alpha threshold or check z-buffer by previous pass program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 0, null, 0, true, null); - drawUnit = getDrawUnit(program, camera, surface, geometry, opacityMap, null, 0, true, null, false, true, objectRenderPriority); + addDrawUnits(program, camera, surface, geometry, opacityMap, null, 0, true, null, false, true, objectRenderPriority); } } } else { var j:int; - var lightLengthInGroup:int; var isFirstGroup:Boolean = true; for (i = 0; i < groupsCount; i++) { - var lightGroup:Vector. = groups[i]; - lightLengthInGroup = lightGroup.length; + lightGroup = groups[i]; + lightGroupLength = lightGroup.length; // Group of lights without shadow // Form key @@ -1084,7 +1077,7 @@ package alternativa.engine3d.materials { (_normalMapSpace.toString()) + ((glossinessMap != null) ? "G" : "g") + ((specularMap != null) ? "S" : "s"); - for (j = 0; j < lightLengthInGroup; j++) { + for (j = 0; j < lightGroupLength; j++) { light = lightGroup[j]; materialKey += light.lightID; } @@ -1095,12 +1088,12 @@ package alternativa.engine3d.materials { if (alphaThreshold > 0) { // Alpha test // use opacityMap if it is presented - program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 1, lightGroup, lightLengthInGroup, isFirstGroup, null); - drawUnit = getDrawUnit(program, camera, surface, geometry, opacityMap, lightGroup, lightLengthInGroup, isFirstGroup, null, true, false, objectRenderPriority); + program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 1, lightGroup, lightGroupLength, isFirstGroup, null); + addDrawUnits(program, camera, surface, geometry, opacityMap, lightGroup, lightGroupLength, isFirstGroup, null, true, false, objectRenderPriority); } else { // do not use opacityMap at all - program = getProgram(object, optionsPrograms, camera, materialKey, null, 0, lightGroup, lightLengthInGroup, isFirstGroup, null); - drawUnit = getDrawUnit(program, camera, surface, geometry, null, lightGroup, lightLengthInGroup, isFirstGroup, null, true, false, objectRenderPriority); + program = getProgram(object, optionsPrograms, camera, materialKey, null, 0, lightGroup, lightGroupLength, isFirstGroup, null); + addDrawUnits(program, camera, surface, geometry, null, lightGroup, lightGroupLength, isFirstGroup, null, true, false, objectRenderPriority); } } // Transparent pass @@ -1108,19 +1101,19 @@ package alternativa.engine3d.materials { // use opacityMap if it is presented if (alphaThreshold <= alpha && !opaquePass) { // Alpha threshold - program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 2, lightGroup, lightLengthInGroup, isFirstGroup, null); - drawUnit = getDrawUnit(program, camera, surface, geometry, opacityMap, lightGroup, lightLengthInGroup, isFirstGroup, null, false, true, objectRenderPriority); + program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 2, lightGroup, lightGroupLength, isFirstGroup, null); + addDrawUnits(program, camera, surface, geometry, opacityMap, lightGroup, lightGroupLength, isFirstGroup, null, false, true, objectRenderPriority); } else { // There is no Alpha threshold or check z-buffer by previous pass - program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 0, lightGroup, lightLengthInGroup, isFirstGroup, null); - drawUnit = getDrawUnit(program, camera, surface, geometry, opacityMap, lightGroup, lightLengthInGroup, isFirstGroup, null, false, true, objectRenderPriority); + program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 0, lightGroup, lightGroupLength, isFirstGroup, null); + addDrawUnits(program, camera, surface, geometry, opacityMap, lightGroup, lightGroupLength, isFirstGroup, null, false, true, objectRenderPriority); } } isFirstGroup = false; lightGroup.length = 0; } - if (shadowGroupLength>0){ + if (shadowGroupLength > 0){ // Group of ligths with shadow // For each light we will create new drawUnit for (j = 0; j < shadowGroupLength; j++) { @@ -1142,15 +1135,12 @@ package alternativa.engine3d.materials { // Alpha test // use opacityMap if it is presented program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 1, null, 0, isFirstGroup, light); - drawUnit = getDrawUnit(program, camera, surface, geometry, opacityMap, null, 0, isFirstGroup, light, true, false, objectRenderPriority); + addDrawUnits(program, camera, surface, geometry, opacityMap, null, 0, isFirstGroup, light, true, false, objectRenderPriority); } else { // do not use opacityMap at all program = getProgram(object, optionsPrograms, camera, materialKey, null, 0, null, 0, isFirstGroup, light); - drawUnit = getDrawUnit(program, camera, surface, geometry, null, null, 0, isFirstGroup, light, true, false, objectRenderPriority); + addDrawUnits(program, camera, surface, geometry, null, null, 0, isFirstGroup, light, true, false, objectRenderPriority); } -// trace(program.vertexShader.describeLinkageInfo()); -// trace(program.fragmentShader.describeLinkageInfo()); - } // Transparent pass if (transparentPass && alphaThreshold > 0 && alpha > 0) { @@ -1158,11 +1148,11 @@ package alternativa.engine3d.materials { if (alphaThreshold <= alpha && !opaquePass) { // Alpha threshold program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 2, null, 0, isFirstGroup, light); - drawUnit = getDrawUnit(program, camera, surface, geometry, opacityMap, null, 0, isFirstGroup, light, false, true, objectRenderPriority); + addDrawUnits(program, camera, surface, geometry, opacityMap, null, 0, isFirstGroup, light, false, true, objectRenderPriority); } else { // There is no Alpha threshold or check z-buffer by previous pass program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 0, null, 0, isFirstGroup, light); - drawUnit = getDrawUnit(program, camera, surface, geometry, opacityMap, null, 0, isFirstGroup, light, false, true, objectRenderPriority); + addDrawUnits(program, camera, surface, geometry, opacityMap, null, 0, isFirstGroup, light, false, true, objectRenderPriority); } } isFirstGroup = false;