From ce0ebaa8f29358b1b8c5b3aedc83d05587dc9c29 Mon Sep 17 00:00:00 2001 From: Leonid Gaev Date: Fri, 8 Jun 2012 18:38:14 +0600 Subject: [PATCH] qqq --- .../engine3d/materials/ShaderProgram.as | 3 +- .../engine3d/materials/StandardMaterial.as | 54 +++++++++++-------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/alternativa/engine3d/materials/ShaderProgram.as b/src/alternativa/engine3d/materials/ShaderProgram.as index 339c2c0..edef8f8 100644 --- a/src/alternativa/engine3d/materials/ShaderProgram.as +++ b/src/alternativa/engine3d/materials/ShaderProgram.as @@ -19,7 +19,8 @@ package alternativa.engine3d.materials { * @private */ public class ShaderProgram { - + + public var key:String; public var program:Program3D; public var vertexShader:Linker; diff --git a/src/alternativa/engine3d/materials/StandardMaterial.as b/src/alternativa/engine3d/materials/StandardMaterial.as index 73f462d..c1018cc 100644 --- a/src/alternativa/engine3d/materials/StandardMaterial.as +++ b/src/alternativa/engine3d/materials/StandardMaterial.as @@ -53,7 +53,7 @@ package alternativa.engine3d.materials { private static var caches:Dictionary = new Dictionary(true); private var cachedContext3D:Context3D; - private var programsCache:Dictionary; + private var programsCache:Vector.; private var groups:Vector.> = new Vector.>(); /** @@ -515,9 +515,16 @@ 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):StandardMaterialProgram { + private function getProgram(object:Object3D, programs:Vector., 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:StandardMaterialProgram = programs[key]; + var program:StandardMaterialProgram = null;//programs[key]; + + for (var i:int = 0; i(); caches[cachedContext3D] = programsCache; } } - var optionsPrograms:Dictionary = programsCache[object.transformProcedure]; - if (optionsPrograms == null) { - optionsPrograms = new Dictionary(false); - programsCache[object.transformProcedure] = optionsPrograms; - } +// var optionsPrograms:Dictionary = programsCache[object.transformProcedure]; +// if (optionsPrograms == null) { +// optionsPrograms = new Dictionary(false); +// programsCache[object.transformProcedure] = optionsPrograms; +// } // Form groups of lights var groupsCount:int = 0; @@ -1040,11 +1048,11 @@ package alternativa.engine3d.materials { if (alphaThreshold > 0) { // Alpha test // use opacityMap if it is presented - program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 1, null, 0, true, null); + program = getProgram(object, programsCache, camera, materialKey, opacityMap, 1, null, 0, true, null); 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); + program = getProgram(object, programsCache, camera, materialKey, null, 0, null, 0, true, null); addDrawUnits(program, camera, surface, geometry, null, null, 0, true, null, true, false, objectRenderPriority); } } @@ -1053,11 +1061,11 @@ package alternativa.engine3d.materials { // use opacityMap if it is presented if (alphaThreshold <= alpha && !opaquePass) { // Alpha threshold - program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 2, null, 0, true, null); + program = getProgram(object, programsCache, camera, materialKey, opacityMap, 2, null, 0, true, null); 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); + program = getProgram(object, programsCache, camera, materialKey, opacityMap, 0, null, 0, true, null); addDrawUnits(program, camera, surface, geometry, opacityMap, null, 0, true, null, false, true, objectRenderPriority); } } @@ -1086,11 +1094,11 @@ package alternativa.engine3d.materials { if (alphaThreshold > 0) { // Alpha test // use opacityMap if it is presented - program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 1, lightGroup, lightGroupLength, isFirstGroup, null); + program = getProgram(object, programsCache, 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, lightGroupLength, isFirstGroup, null); + program = getProgram(object, programsCache, camera, materialKey, null, 0, lightGroup, lightGroupLength, isFirstGroup, null); addDrawUnits(program, camera, surface, geometry, null, lightGroup, lightGroupLength, isFirstGroup, null, true, false, objectRenderPriority); } } @@ -1099,11 +1107,11 @@ 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, lightGroupLength, isFirstGroup, null); + program = getProgram(object, programsCache, 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, lightGroupLength, isFirstGroup, null); + program = getProgram(object, programsCache, camera, materialKey, opacityMap, 0, lightGroup, lightGroupLength, isFirstGroup, null); addDrawUnits(program, camera, surface, geometry, opacityMap, lightGroup, lightGroupLength, isFirstGroup, null, false, true, objectRenderPriority); } } @@ -1132,11 +1140,11 @@ package alternativa.engine3d.materials { if (alphaThreshold > 0) { // Alpha test // use opacityMap if it is presented - program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 1, null, 0, isFirstGroup, light); + program = getProgram(object, programsCache, camera, materialKey, opacityMap, 1, null, 0, isFirstGroup, light); 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); + program = getProgram(object, programsCache, camera, materialKey, null, 0, null, 0, isFirstGroup, light); addDrawUnits(program, camera, surface, geometry, null, null, 0, isFirstGroup, light, true, false, objectRenderPriority); } } @@ -1145,11 +1153,11 @@ package alternativa.engine3d.materials { // use opacityMap if it is presented if (alphaThreshold <= alpha && !opaquePass) { // Alpha threshold - program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 2, null, 0, isFirstGroup, light); + program = getProgram(object, programsCache, camera, materialKey, opacityMap, 2, null, 0, isFirstGroup, light); 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); + program = getProgram(object, programsCache, camera, materialKey, opacityMap, 0, null, 0, isFirstGroup, light); addDrawUnits(program, camera, surface, geometry, opacityMap, null, 0, isFirstGroup, light, false, true, objectRenderPriority); } }