From 094bbcd5b74ab76f34b3965d2ad97392a05b5e92 Mon Sep 17 00:00:00 2001 From: Yaski Date: Tue, 31 Jul 2012 00:28:22 +0600 Subject: [PATCH] Fallback materials to simpler --- src/alternativa/engine3d/core/Renderer.as | 9 +++-- .../engine3d/materials/EnvironmentMaterial.as | 34 +++++++++++++++++++ .../engine3d/materials/StandardMaterial.as | 33 ++++++++++++++++++ .../materials/VertexLightTextureMaterial.as | 17 ++++++++++ 4 files changed, 90 insertions(+), 3 deletions(-) diff --git a/src/alternativa/engine3d/core/Renderer.as b/src/alternativa/engine3d/core/Renderer.as index ad51b11..211bad2 100644 --- a/src/alternativa/engine3d/core/Renderer.as +++ b/src/alternativa/engine3d/core/Renderer.as @@ -4,8 +4,8 @@ * You may add additional accurate notices of copyright ownership. * * It is desirable to notify that Covered Software was "Powered by AlternativaPlatform" with link to http://www.alternativaplatform.com/ - * */ - + * + */ package alternativa.engine3d.core { import alternativa.engine3d.alternativa3d; @@ -46,7 +46,9 @@ package alternativa.engine3d.core { alternativa3d var camera:Camera3D; alternativa3d var drawUnits:Vector. = new Vector.(); - + + alternativa3d var isConstrainedMode:Boolean = false; + protected var _context3D:Context3D; protected var _contextProperties:RendererContext3DProperties; @@ -187,6 +189,7 @@ package alternativa.engine3d.core { properties[value] = _contextProperties; } _context3D = value; + isConstrainedMode = _context3D.driverInfo.lastIndexOf("(Baseline Constrained)") >= 0; } } diff --git a/src/alternativa/engine3d/materials/EnvironmentMaterial.as b/src/alternativa/engine3d/materials/EnvironmentMaterial.as index d1e8478..276044d 100644 --- a/src/alternativa/engine3d/materials/EnvironmentMaterial.as +++ b/src/alternativa/engine3d/materials/EnvironmentMaterial.as @@ -310,6 +310,15 @@ package alternativa.engine3d.materials { "mov v0, a0" ], "passLightMapUVProcedure"); + /** + * @private + */ + alternativa3d static var fallbackTextureMaterial:TextureMaterial = new TextureMaterial(); + /** + * @private + */ + alternativa3d static var fallbackLightMapMaterial:LightMapMaterial = new LightMapMaterial(); + private var _normalMapSpace:int = NormalMapSpace.TANGENT_RIGHT_HANDED; /** @@ -815,6 +824,31 @@ package alternativa.engine3d.materials { if (_normalMap != null && _normalMap._texture == null) return; if (_reflectionMap != null && _reflectionMap._texture == null) return; if (_lightMap != null && _lightMap._texture == null) return; + + if (camera.renderer.isConstrainedMode) { + // fallback to simpler material + if (lightMap == null) { + fallbackTextureMaterial.diffuseMap = diffuseMap; + fallbackTextureMaterial.opacityMap = opacityMap; + fallbackTextureMaterial.alphaThreshold = alphaThreshold; + fallbackTextureMaterial.alpha = alpha; + fallbackTextureMaterial.opaquePass = opaquePass; + fallbackTextureMaterial.transparentPass = transparentPass; + fallbackTextureMaterial.collectDraws(camera, surface, geometry, lights, lightsLength, useShadow, objectRenderPriority); + } else { + fallbackLightMapMaterial.diffuseMap = diffuseMap; + fallbackLightMapMaterial.lightMap = lightMap; + fallbackLightMapMaterial.lightMapChannel = lightMapChannel; + fallbackLightMapMaterial.opacityMap = opacityMap; + fallbackLightMapMaterial.alphaThreshold = alphaThreshold; + fallbackLightMapMaterial.alpha = alpha; + fallbackLightMapMaterial.opaquePass = opaquePass; + fallbackLightMapMaterial.transparentPass = transparentPass; + fallbackLightMapMaterial.collectDraws(camera, surface, geometry, lights, lightsLength, useShadow, objectRenderPriority); + } + return; + } + var object:Object3D = surface.object; // Program diff --git a/src/alternativa/engine3d/materials/StandardMaterial.as b/src/alternativa/engine3d/materials/StandardMaterial.as index 7ce0217..3cb1022 100644 --- a/src/alternativa/engine3d/materials/StandardMaterial.as +++ b/src/alternativa/engine3d/materials/StandardMaterial.as @@ -307,6 +307,15 @@ package alternativa.engine3d.materials { "mov v0, a0" ], "passLightMapUVProcedure"); + /** + * @private + */ + alternativa3d static var fallbackTextureMaterial:TextureMaterial = new TextureMaterial(); + /** + * @private + */ + alternativa3d static var fallbackLightMapMaterial:LightMapMaterial = new LightMapMaterial(); + /** * Normal map. */ @@ -986,6 +995,30 @@ package alternativa.engine3d.materials { // Check if textures uploaded in to the context. if (opacityMap != null && opacityMap._texture == null || glossinessMap != null && glossinessMap._texture == null || specularMap != null && specularMap._texture == null || lightMap != null && lightMap._texture == null) return; + if (camera.renderer.isConstrainedMode) { + // fallback to simpler material + if (lightMap == null) { + fallbackTextureMaterial.diffuseMap = diffuseMap; + fallbackTextureMaterial.opacityMap = opacityMap; + fallbackTextureMaterial.alphaThreshold = alphaThreshold; + fallbackTextureMaterial.alpha = alpha; + fallbackTextureMaterial.opaquePass = opaquePass; + fallbackTextureMaterial.transparentPass = transparentPass; + fallbackTextureMaterial.collectDraws(camera, surface, geometry, lights, lightsLength, useShadow, objectRenderPriority); + } else { + fallbackLightMapMaterial.diffuseMap = diffuseMap; + fallbackLightMapMaterial.lightMap = lightMap; + fallbackLightMapMaterial.lightMapChannel = lightMapChannel; + fallbackLightMapMaterial.opacityMap = opacityMap; + fallbackLightMapMaterial.alphaThreshold = alphaThreshold; + fallbackLightMapMaterial.alpha = alpha; + fallbackLightMapMaterial.opaquePass = opaquePass; + fallbackLightMapMaterial.transparentPass = transparentPass; + fallbackLightMapMaterial.collectDraws(camera, surface, geometry, lights, lightsLength, useShadow, objectRenderPriority); + } + return; + } + var object:Object3D = surface.object; // Buffers diff --git a/src/alternativa/engine3d/materials/VertexLightTextureMaterial.as b/src/alternativa/engine3d/materials/VertexLightTextureMaterial.as index 009f231..57efd3f 100644 --- a/src/alternativa/engine3d/materials/VertexLightTextureMaterial.as +++ b/src/alternativa/engine3d/materials/VertexLightTextureMaterial.as @@ -98,6 +98,11 @@ package alternativa.engine3d.materials { private static const _lightsProcedures:Dictionary = new Dictionary(true); + /** + * @private + */ + alternativa3d static var fallbackMaterial:TextureMaterial = new TextureMaterial(); + /** * Creates a new VertexLightTextureMaterial instance. * @@ -282,6 +287,18 @@ package alternativa.engine3d.materials { override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, useShadow:Boolean, objectRenderPriority:int = -1):void { if (diffuseMap == null || diffuseMap._texture == null || opacityMap != null && opacityMap._texture == null) return; + if (camera.renderer.isConstrainedMode) { + // fallback to texture material + fallbackMaterial.diffuseMap = diffuseMap; + fallbackMaterial.opacityMap = opacityMap; + fallbackMaterial.alphaThreshold = alphaThreshold; + fallbackMaterial.alpha = alpha; + fallbackMaterial.opaquePass = opaquePass; + fallbackMaterial.transparentPass = transparentPass; + fallbackMaterial.collectDraws(camera, surface, geometry, lights, lightsLength, useShadow, objectRenderPriority); + return; + } + var object:Object3D = surface.object; // Buffers