From c0fae48feafaeef5baa304912a22bb75d5e114ab Mon Sep 17 00:00:00 2001 From: Yaski Date: Wed, 16 May 2012 13:33:11 +0600 Subject: [PATCH] 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"); + } + +}