package org.papervision3d.core.render.material { import flash.utils.Dictionary; import org.papervision3d.core.proto.MaterialObject3D; import org.papervision3d.core.render.data.RenderSessionData; /** * @Author Ralph Hauwert * * student_ar_org_papervision3d_core_render_material_MaterialManager (used internally) is a singleton that tracks * all materials. Each time a material is created, the student_ar_org_papervision3d_core_render_material_MaterialManager * registers the material for access in the render engine. */ public class student_ar_org_papervision3d_core_render_material_MaterialManager { private static var instance:student_ar_org_papervision3d_core_render_material_MaterialManager; private var materials:Dictionary; /** * student_ar_org_papervision3d_core_render_material_MaterialManager singleton constructor */ public function student_ar_org_papervision3d_core_render_material_MaterialManager():void { if(instance){ throw new Error("Only 1 instance of materialmanager allowed"); } init(); } /** @private */ private function init():void { materials = new Dictionary(true); } /** @private */ private function _registerMaterial(material:MaterialObject3D):void { materials[material] = material; } /** @private */ private function _unRegisterMaterial(material:MaterialObject3D):void { delete materials[material]; } /** * Allows for materials that animate or change (e.g., MovieMaterial) to * be updated prior to the render * * @param renderSessionData the data used in updating the material */ public function updateMaterialsBeforeRender(renderSessionData:RenderSessionData):void { var um:IUpdateBeforeMaterial; var m:MaterialObject3D; for each(m in materials){ if(m is IUpdateBeforeMaterial){ um = m as IUpdateBeforeMaterial; um.updateBeforeRender(renderSessionData); } } } /** * Allows for materials that animate or change (e.g., MovieMaterial) to * be updated after the render * * @param renderSessionData the data used in updating the material */ public function updateMaterialsAfterRender(renderSessionData:RenderSessionData):void { var um:IUpdateAfterMaterial; var m:MaterialObject3D; for each(m in materials){ if(m is IUpdateAfterMaterial){ um = m as IUpdateAfterMaterial; um.updateAfterRender(renderSessionData); } } } /** * Registers a material */ public static function registerMaterial(material:MaterialObject3D):void { getInstance()._registerMaterial(material); } /** * Unregisters a material */ public static function unRegisterMaterial(material:MaterialObject3D):void { getInstance()._unRegisterMaterial(material); } /** * Returns a singleton instance of the student_ar_org_papervision3d_core_render_material_MaterialManager */ public static function getInstance():student_ar_org_papervision3d_core_render_material_MaterialManager { if(!instance){ instance = new student_ar_org_papervision3d_core_render_material_MaterialManager; } return instance; } } }