diff --git a/.gitignore b/.gitignore index 9aa9d49..6f31bda 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .idea/**/* .settings/* *.iml +pom.xml *.svn* *.DS_store* diff --git a/pom.xml b/pom.xml index 618d7c3..a8c15ac 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ platform.clients.fp11.libraries Alternativa3D swc - 8.31.0-SNAPSHOT + 8.32.0-SNAPSHOT platform.clients.fp11.tools.maven BasePom diff --git a/src/alternativa/Alternativa3D.as b/src/alternativa/Alternativa3D.as index d9ae176..06ca898 100644 --- a/src/alternativa/Alternativa3D.as +++ b/src/alternativa/Alternativa3D.as @@ -17,6 +17,6 @@ package alternativa { /** * Library version in the format: generation.feature-version.fix-version. */ - public static const version:String = "8.30.0"; + public static const version:String = "8.31.0"; } } diff --git a/src/alternativa/engine3d/materials/StandardMaterial.as b/src/alternativa/engine3d/materials/StandardMaterial.as index 9cf3dcc..f0691c8 100644 --- a/src/alternativa/engine3d/materials/StandardMaterial.as +++ b/src/alternativa/engine3d/materials/StandardMaterial.as @@ -65,7 +65,7 @@ package alternativa.engine3d.materials { private static var caches:Dictionary = new Dictionary(true); private var cachedContext3D:Context3D; - private var programsCache:Array; + private var programsCache:Dictionary; private var groups:Vector.> = new Vector.>(); /** @@ -417,10 +417,11 @@ package alternativa.engine3d.materials { // inputs: tNormal", "tViewVector", "shadow", "cAmbientColor" // outputs : light, hightlight - private function formDirectionalProcedure(procedure:Procedure, light:Light3D, useShadow:Boolean):void { + private function formDirectionalProcedure(procedure:Procedure, index:int, useShadow:Boolean):void { var source:Array = [ - "#c0=c" + light.lightID + "Direction", - "#c1=c" + light.lightID + "Color", + // Position - dirction vector of light + "#c0=c" + index + "Position", + "#c1=c" + index + "Color", // Calculate half-way vector "add t0.xyz, i1.xyz, c0.xyz", "mov t0.w, c0.w", @@ -430,7 +431,7 @@ package alternativa.engine3d.materials { "pow t0.w, t0.w, o1.w", // Calculate light "dp3 t0.x, i0.xyz, c0.xyz", - "sat t0.x, t0.x", + "sat t0.x, t0.x" ]; if (useShadow) { source.push("mul t0.xw, t0.xw, i2.x"); @@ -447,12 +448,12 @@ package alternativa.engine3d.materials { procedure.compileFromArray(source); } - private function formOmniProcedure(procedure:Procedure, light:Light3D, useShadow:Boolean):void { + private function formOmniProcedure(procedure:Procedure, index:int, useShadow:Boolean):void { // fragmentLinker.setInputParams(omniMulShadowProcedure, "tNormal", "tViewVector", "tTotalLight", "cAmbientColor"); var source:Array = [ - "#c0=c" + light.lightID + "Position", - "#c1=c" + light.lightID + "Color", - "#c2=c" + light.lightID + "Radius", + "#c0=c" + index + "Position", + "#c1=c" + index + "Color", + "#c2=c" + index + "Radius", "#v0=vPosition" ]; if (useShadow) { @@ -633,11 +634,8 @@ package alternativa.engine3d.materials { fragmentLinker.addProcedure(shadowProc); fragmentLinker.setOutputParams(shadowProc, "tTotalLight"); - var dirMulShadowProcedure:Procedure = _lightFragmentProcedures[shadowedLight.shadow]; - if (dirMulShadowProcedure == null) { - dirMulShadowProcedure = new Procedure(); - formDirectionalProcedure(dirMulShadowProcedure, shadowedLight, true); - } + var dirMulShadowProcedure:Procedure = new Procedure(null, "lightShadowDirectional"); + formDirectionalProcedure(dirMulShadowProcedure, 0, true); fragmentLinker.addProcedure(dirMulShadowProcedure); fragmentLinker.setInputParams(dirMulShadowProcedure, "tNormal", "tViewVector", "tTotalLight", "cAmbientColor"); fragmentLinker.setOutputParams(dirMulShadowProcedure, "tTotalLight", "tTotalHighLight"); @@ -649,11 +647,8 @@ package alternativa.engine3d.materials { fragmentLinker.addProcedure(shadowProc); fragmentLinker.setOutputParams(shadowProc, "tTotalLight"); - var omniMulShadowProcedure:Procedure = _lightFragmentProcedures[shadowedLight.shadow]; - if (omniMulShadowProcedure == null) { - omniMulShadowProcedure= new Procedure(); - formOmniProcedure(omniMulShadowProcedure, shadowedLight, true); - } + var omniMulShadowProcedure:Procedure = new Procedure(null, "lightShadowDirectional"); + formOmniProcedure(omniMulShadowProcedure, 0, true); fragmentLinker.addProcedure(omniMulShadowProcedure); fragmentLinker.setInputParams(omniMulShadowProcedure, "tNormal", "tViewVector", "tTotalLight", "cAmbientColor"); fragmentLinker.setOutputParams(omniMulShadowProcedure, "tTotalLight", "tTotalHighLight"); @@ -663,52 +658,49 @@ package alternativa.engine3d.materials { for (i = 0; i < lightsLength; i++) { var light:Light3D = lightsGroup[i]; if (light == shadowedLight && (shadowedLight is DirectionalLight || shadowedLight is OmniLight)) continue; - var lightFragmentProcedure:Procedure = _lightFragmentProcedures[light]; - if (lightFragmentProcedure == null) { - lightFragmentProcedure = new Procedure(); - lightFragmentProcedure.name = "light" + i.toString(); - if (light is DirectionalLight) { - formDirectionalProcedure(lightFragmentProcedure, light, false); - lightFragmentProcedure.name += "Directional"; - } else if (light is OmniLight) { - formOmniProcedure(lightFragmentProcedure, light, false); - lightFragmentProcedure.name += "Omni"; - } else if (light is SpotLight) { - lightFragmentProcedure.compileFromArray([ - "#c0=c" + light.lightID + "Position", - "#c1=c" + light.lightID + "Color", - "#c2=c" + light.lightID + "Radius", - "#c3=c" + light.lightID + "Axis", - "#v0=vPosition", - // Calculate vector from the point to light - "sub t0, c0, v0",// L = pos - lightPos - "dp3 t0.w, t0, t0",// lenSqr - "nrm t0.xyz,t0.xyz",// L = normalize(L) - // Calculate half-way vector - "add t2.xyz, i1.xyz, t0.xyz", - "nrm t2.xyz, t2.xyz", - //Calculate a flare - "dp3 t2.x, t2.xyz, i0.xyz", - "pow t2.x, t2.x, o1.w", - "dp3 t1.x, t0.xyz, c3.xyz", //axisDirDot - "dp3 t0.x, t0, i0.xyz",// dot = dot(normal, L) - "sqt t0.w, t0.w",// len = sqt(lensqr) - "sub t0.w, t0.w, c2.y",// len = len - atenuationBegin - "div t0.y, t0.w, c2.x",// att = len/radius - "sub t0.w, c0.w, t0.y",// att = 1 - len/radius - "sub t0.y, t1.x, c2.w", - "div t0.y, t0.y, c2.z", - "sat t0.xyw,t0.xyw",// t = sat(t) - "mul t1.xyz,c1.xyz,t0.yyy",// t = color*t - "mul t1.xyz,t1.xyz,t0.www",// - "mul t2.xyz, t2.x, t1.xyz", - "add o1.xyz, o1.xyz, t2.xyz", - "mul t1.xyz, t1.xyz, t0.xxx", + var lightFragmentProcedure:Procedure = new Procedure(); + lightFragmentProcedure.name = "light" + i.toString(); + if (light is DirectionalLight) { + formDirectionalProcedure(lightFragmentProcedure, i, false); + lightFragmentProcedure.name += "Directional"; + } else if (light is OmniLight) { + formOmniProcedure(lightFragmentProcedure, i, false); + lightFragmentProcedure.name += "Omni"; + } else if (light is SpotLight) { + lightFragmentProcedure.compileFromArray([ + "#c0=c" + i + "Position", + "#c1=c" + i + "Color", + "#c2=c" + i + "Radius", + "#c3=c" + i + "Axis", + "#v0=vPosition", + // Calculate vector from the point to light + "sub t0, c0, v0",// L = pos - lightPos + "dp3 t0.w, t0, t0",// lenSqr + "nrm t0.xyz,t0.xyz",// L = normalize(L) + // Calculate half-way vector + "add t2.xyz, i1.xyz, t0.xyz", + "nrm t2.xyz, t2.xyz", + //Calculate a flare + "dp3 t2.x, t2.xyz, i0.xyz", + "pow t2.x, t2.x, o1.w", + "dp3 t1.x, t0.xyz, c3.xyz", //axisDirDot + "dp3 t0.x, t0, i0.xyz",// dot = dot(normal, L) + "sqt t0.w, t0.w",// len = sqt(lensqr) + "sub t0.w, t0.w, c2.y",// len = len - atenuationBegin + "div t0.y, t0.w, c2.x",// att = len/radius + "sub t0.w, c0.w, t0.y",// att = 1 - len/radius + "sub t0.y, t1.x, c2.w", + "div t0.y, t0.y, c2.z", + "sat t0.xyw,t0.xyw",// t = sat(t) + "mul t1.xyz,c1.xyz,t0.yyy",// t = color*t + "mul t1.xyz,t1.xyz,t0.www",// + "mul t2.xyz, t2.x, t1.xyz", + "add o1.xyz, o1.xyz, t2.xyz", + "mul t1.xyz, t1.xyz, t0.xxx", - "add o0.xyz, o0.xyz, t1.xyz" - ]); - lightFragmentProcedure.name += "Spot"; - } + "add o0.xyz, o0.xyz, t1.xyz" + ]); + lightFragmentProcedure.name += "Spot"; } fragmentLinker.addProcedure(lightFragmentProcedure); fragmentLinker.setInputParams(lightFragmentProcedure, "tNormal", "tViewVector"); @@ -757,10 +749,9 @@ package alternativa.engine3d.materials { // } fragmentLinker.varyings = vertexLinker.varyings; - program = new StandardMaterialProgram(vertexLinker, fragmentLinker); - program.upload(camera.context3D); + program = new StandardMaterialProgram(vertexLinker, fragmentLinker, (shadowedLight != null) ? 1 : lightsLength); -// program.key = key; + program.upload(camera.context3D); programs[key] = program; } return program; @@ -817,8 +808,8 @@ package alternativa.engine3d.materials { transform = light.lightToObjectTransform; len = Math.sqrt(transform.c*transform.c + transform.g*transform.g + transform.k*transform.k); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Direction"), -transform.c/len, -transform.g/len, -transform.k/len, 1); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Color"), light.red, light.green, light.blue); + drawUnit.setFragmentConstantsFromNumbers(program.cPosition[i], -transform.c/len, -transform.g/len, -transform.k/len, 1); + drawUnit.setFragmentConstantsFromNumbers(program.cColor[i], light.red, light.green, light.blue); } else if (light is OmniLight) { omni = light as OmniLight; transform = light.lightToObjectTransform; @@ -827,9 +818,9 @@ package alternativa.engine3d.materials { rScale += Math.sqrt(transform.c*transform.c + transform.g*transform.g + transform.k*transform.k); rScale /= 3; - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Position"), transform.d, transform.h, transform.l); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Radius"), 1, omni.attenuationEnd*rScale - omni.attenuationBegin*rScale, omni.attenuationBegin*rScale); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Color"), light.red, light.green, light.blue); + drawUnit.setFragmentConstantsFromNumbers(program.cPosition[i], transform.d, transform.h, transform.l); + drawUnit.setFragmentConstantsFromNumbers(program.cRadius[i], 1, omni.attenuationEnd*rScale - omni.attenuationBegin*rScale, omni.attenuationBegin*rScale); + drawUnit.setFragmentConstantsFromNumbers(program.cColor[i], light.red, light.green, light.blue); } else if (light is SpotLight) { spot = light as SpotLight; transform = light.lightToObjectTransform; @@ -840,10 +831,10 @@ package alternativa.engine3d.materials { falloff = Math.cos(spot.falloff*0.5); hotspot = Math.cos(spot.hotspot*0.5); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Position"), transform.d, transform.h, transform.l); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Axis"), -transform.c/len, -transform.g/len, -transform.k/len); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Radius"), spot.attenuationEnd*rScale - spot.attenuationBegin*rScale, spot.attenuationBegin*rScale, hotspot == falloff ? 0.000001 : hotspot - falloff, falloff); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Color"), light.red, light.green, light.blue); + drawUnit.setFragmentConstantsFromNumbers(program.cPosition[i], transform.d, transform.h, transform.l); + drawUnit.setFragmentConstantsFromNumbers(program.cAxis[i], -transform.c/len, -transform.g/len, -transform.k/len); + drawUnit.setFragmentConstantsFromNumbers(program.cRadius[i], spot.attenuationEnd*rScale - spot.attenuationBegin*rScale, spot.attenuationBegin*rScale, hotspot == falloff ? 0.000001 : hotspot - falloff, falloff); + drawUnit.setFragmentConstantsFromNumbers(program.cColor[i], light.red, light.green, light.blue); } } } @@ -853,8 +844,8 @@ package alternativa.engine3d.materials { if (light is DirectionalLight) { transform = light.lightToObjectTransform; len = Math.sqrt(transform.c*transform.c + transform.g*transform.g + transform.k*transform.k); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Direction"), -transform.c/len, -transform.g/len, -transform.k/len, 1); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Color"), light.red, light.green, light.blue); + drawUnit.setFragmentConstantsFromNumbers(program.cPosition[0], -transform.c/len, -transform.g/len, -transform.k/len, 1); + drawUnit.setFragmentConstantsFromNumbers(program.cColor[0], light.red, light.green, light.blue); } else if (light is OmniLight) { omni = light as OmniLight; transform = light.lightToObjectTransform; @@ -862,9 +853,9 @@ package alternativa.engine3d.materials { rScale += Math.sqrt(transform.b*transform.b + transform.f*transform.f + transform.j*transform.j); rScale += Math.sqrt(transform.c*transform.c + transform.g*transform.g + transform.k*transform.k); rScale /= 3; - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Position"), transform.d, transform.h, transform.l); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Radius"), 1, omni.attenuationEnd*rScale - omni.attenuationBegin*rScale, omni.attenuationBegin*rScale); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Color"), light.red, light.green, light.blue); + drawUnit.setFragmentConstantsFromNumbers(program.cPosition[0], transform.d, transform.h, transform.l); + drawUnit.setFragmentConstantsFromNumbers(program.cRadius[0], 1, omni.attenuationEnd*rScale - omni.attenuationBegin*rScale, omni.attenuationBegin*rScale); + drawUnit.setFragmentConstantsFromNumbers(program.cColor[0], light.red, light.green, light.blue); } else if (light is SpotLight) { spot = light as SpotLight; transform = light.lightToObjectTransform; @@ -875,10 +866,10 @@ package alternativa.engine3d.materials { falloff = Math.cos(spot.falloff*0.5); hotspot = Math.cos(spot.hotspot*0.5); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Position"), transform.d, transform.h, transform.l); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Axis"), -transform.c/len, -transform.g/len, -transform.k/len); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Radius"), spot.attenuationEnd*rScale - spot.attenuationBegin*rScale, spot.attenuationBegin*rScale, hotspot == falloff ? 0.000001 : hotspot - falloff, falloff); - drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Color"), light.red, light.green, light.blue); + drawUnit.setFragmentConstantsFromNumbers(program.cPosition[0], transform.d, transform.h, transform.l); + drawUnit.setFragmentConstantsFromNumbers(program.cAxis[0], -transform.c/len, -transform.g/len, -transform.k/len); + drawUnit.setFragmentConstantsFromNumbers(program.cRadius[0], spot.attenuationEnd*rScale - spot.attenuationBegin*rScale, spot.attenuationBegin*rScale, hotspot == falloff ? 0.000001 : hotspot - falloff, falloff); + drawUnit.setFragmentConstantsFromNumbers(program.cColor[0], light.red, light.green, light.blue); } } @@ -1014,16 +1005,16 @@ package alternativa.engine3d.materials { cachedContext3D = camera.context3D; programsCache = caches[cachedContext3D]; if (programsCache == null) { - programsCache = new Array(); + programsCache = new Dictionary(true); caches[cachedContext3D] = programsCache; } } -// var optionsPrograms:Dictionary = programsCache[object.transformProcedure]; -// if (optionsPrograms == null) { -// optionsPrograms = new Dictionary(false); -// programsCache[object.transformProcedure] = optionsPrograms; -// } + var optionsPrograms:Array = programsCache[object.transformProcedure]; + if (optionsPrograms == null) { + optionsPrograms = new Array(); + programsCache[object.transformProcedure] = optionsPrograms; + } // Form groups of lights var groupsCount:int = 0; @@ -1064,11 +1055,11 @@ package alternativa.engine3d.materials { if (alphaThreshold > 0) { // Alpha test // use opacityMap if it is presented - program = getProgram(object, programsCache, camera, materialKey, opacityMap, 1, null, 0, true, null); + program = getProgram(object, optionsPrograms, 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, programsCache, camera, materialKey, null, 0, null, 0, true, null); + program = getProgram(object, optionsPrograms, camera, materialKey, null, 0, null, 0, true, null); addDrawUnits(program, camera, surface, geometry, null, null, 0, true, null, true, false, objectRenderPriority); } } @@ -1077,11 +1068,11 @@ package alternativa.engine3d.materials { // use opacityMap if it is presented if (alphaThreshold <= alpha && !opaquePass) { // Alpha threshold - program = getProgram(object, programsCache, camera, materialKey, opacityMap, 2, null, 0, true, null); + program = getProgram(object, optionsPrograms, 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, programsCache, camera, materialKey, opacityMap, 0, null, 0, true, null); + program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 0, null, 0, true, null); addDrawUnits(program, camera, surface, geometry, opacityMap, null, 0, true, null, false, true, objectRenderPriority); } } @@ -1116,11 +1107,11 @@ package alternativa.engine3d.materials { if (alphaThreshold > 0) { // Alpha test // use opacityMap if it is presented - program = getProgram(object, programsCache, camera, materialKey, opacityMap, 1, lightGroup, lightGroupLength, isFirstGroup, null); + 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, programsCache, camera, materialKey, null, 0, lightGroup, lightGroupLength, isFirstGroup, null); + 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); } } @@ -1129,11 +1120,11 @@ package alternativa.engine3d.materials { // use opacityMap if it is presented if (alphaThreshold <= alpha && !opaquePass) { // Alpha threshold - program = getProgram(object, programsCache, camera, materialKey, opacityMap, 2, lightGroup, lightGroupLength, isFirstGroup, null); + 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, programsCache, camera, materialKey, opacityMap, 0, lightGroup, lightGroupLength, isFirstGroup, null); + 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); } } @@ -1141,7 +1132,7 @@ package alternativa.engine3d.materials { 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++) { @@ -1184,11 +1175,11 @@ package alternativa.engine3d.materials { if (alphaThreshold > 0) { // Alpha test // use opacityMap if it is presented - program = getProgram(object, programsCache, camera, materialKey, opacityMap, 1, null, 0, isFirstGroup, light); + program = getProgram(object, optionsPrograms, 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, programsCache, camera, materialKey, null, 0, null, 0, isFirstGroup, light); + program = getProgram(object, optionsPrograms, camera, materialKey, null, 0, null, 0, isFirstGroup, light); addDrawUnits(program, camera, surface, geometry, null, null, 0, isFirstGroup, light, true, false, objectRenderPriority); } } @@ -1197,11 +1188,11 @@ package alternativa.engine3d.materials { // use opacityMap if it is presented if (alphaThreshold <= alpha && !opaquePass) { // Alpha threshold - program = getProgram(object, programsCache, camera, materialKey, opacityMap, 2, null, 0, isFirstGroup, light); + program = getProgram(object, optionsPrograms, 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, programsCache, camera, materialKey, opacityMap, 0, null, 0, isFirstGroup, light); + program = getProgram(object, optionsPrograms, camera, materialKey, opacityMap, 0, null, 0, isFirstGroup, light); addDrawUnits(program, camera, surface, geometry, opacityMap, null, 0, isFirstGroup, light, false, true, objectRenderPriority); } } @@ -1262,8 +1253,18 @@ class StandardMaterialProgram extends ShaderProgram { public var sSpecular:int = -1; public var sLightMap:int = -1; - public function StandardMaterialProgram(vertex:Linker, fragment:Linker) { + public var cPosition:Vector.; + public var cRadius:Vector.; + public var cAxis:Vector.; + public var cColor:Vector.; + + public function StandardMaterialProgram(vertex:Linker, fragment:Linker, numLigths:int) { super(vertex, fragment); + + cPosition = new Vector.(numLigths); + cRadius = new Vector.(numLigths); + cAxis = new Vector.(numLigths); + cColor = new Vector.(numLigths); } override public function upload(context3D:Context3D):void { @@ -1286,6 +1287,14 @@ class StandardMaterialProgram extends ShaderProgram { sGlossiness = fragmentShader.findVariable("sGlossiness"); sSpecular = fragmentShader.findVariable("sSpecular"); sLightMap = fragmentShader.findVariable("sLightMap"); - } + var count:int = cPosition.length; + for (var i:int = 0; i < count; i++) { + cPosition[i] = fragmentShader.findVariable("c" + i + "Position"); + cRadius[i] = fragmentShader.findVariable("c" + i + "Radius"); + cAxis[i] = fragmentShader.findVariable("c" + i + "Axis"); + cColor[i] = fragmentShader.findVariable("c" + i + "Color"); + } + + } }