Subversion Repositories AndroidProjects

Rev

Rev 221 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.gebauz.Bauzoid.graphics.model;

import com.gebauz.Bauzoid.graphics.GraphicsObject;
import com.gebauz.Bauzoid.graphics.renderstates.RenderStatesConfiguration;
import com.gebauz.Bauzoid.graphics.shader.Effect;
import com.gebauz.Bauzoid.graphics.shader.Technique;

/** Bath render group of a mesh that manages the effect, techniques, and variables attached to this group. */
public class MeshGroup extends GraphicsObject
{
        public class TechniqueRef
        {
                private Technique mStaticTechnique = null;
                private Technique mSkinnedTechnique = null;
               
                public TechniqueRef(Technique staticTechnique, Technique skinnedTechnique)
                {
                        mStaticTechnique = staticTechnique;
                        mSkinnedTechnique = skinnedTechnique;
                }
               
                public void dispose()
                {
                        mStaticTechnique = null;
                        mSkinnedTechnique = null;
                }
               
                public Technique getSkinnedTechnique()
                {
                        return mSkinnedTechnique;
                }
               
                public Technique getStaticTechnique()
                {
                        return mStaticTechnique;
                }
        };
       
        private Mesh mParentMesh;
        private String mName;
       
        private int mFirstIndex = 0;
        private int mLastIndex = 0;
        private int mFirstVertex = 0;
        private int mLastVertex = 0;
       
        private Effect mEffect = null;
        private TechniqueRef[] mTechniques = null;
        private RenderStatesConfiguration mRenderStates = null;
       
        // references to techniques
       
        /** Constructor. */
        public MeshGroup(Mesh parentMesh, String name, int firstIndex, int lastIndex, int firstVertex, int lastVertex)
        {
                super(parentMesh.getGraphics());
               
                mParentMesh = parentMesh;
                mName = name;
               
                mFirstIndex = firstIndex;
                mLastIndex = lastIndex;
                mFirstVertex = firstVertex;
                mLastVertex = lastVertex;
        }
       
        /** Constructor. */
        public MeshGroup(Mesh parentMesh, String name)
        {
                super(parentMesh.getGraphics());
               
                mParentMesh = parentMesh;
                mName = name;
        }
       
        /** Destroy internal data. */
        public void dispose()
        {
                if (mTechniques != null)
                {
                        for (TechniqueRef tech : mTechniques)
                        {
                                tech.dispose();
                        }
                        mTechniques = null;
                }
               
                if (mEffect != null)
                {
                        mEffect.dispose();
                        mEffect = null;
                }
        }
       
        /** Set the associated effect. */
        public void setEffect(Effect effect)
        {
                mEffect = effect;
        }
       
        /** Render this group using a mesh's specified Geometry using the default technique. */
        public void render()
        {
                render(0);
        }
       
        /** Render this group using a mesh's specified Geometry using the specified static technique. */
        public void render(int technique)
        {
                render(technique, false);
        }
       
        /** Render this group using a mesh's specified Geometry using the specified skinned or static technique. */
        public void render(int technique, boolean skinned)
        {
                if (mTechniques == null)
                        return;
               
                Technique tech = null;
               
                if (technique < mTechniques.length)
                {
                        if (skinned && (mTechniques[technique] != null))
                        {
                                tech = mTechniques[technique].getSkinnedTechnique();
                        }
                        else
                        {
                                tech = mTechniques[technique].getStaticTechnique();
                        }
                }
               
                if (tech == null)
                        return;
               
                if (mRenderStates != null)
                {
                        mRenderStates.apply();
                }
               
                tech.activate();
                getRenderStates().activate();
                mParentMesh.getGeometry().render(mFirstIndex, mLastIndex, mFirstVertex, mLastVertex);
                getRenderStates().deactivate();
                tech.deactivate();
        }
       
        /** Get name. */
        public final String getName()
        {
                return mName;
        }
       
        /** Get technique references. */
        public final void setTechniqueRefs(TechniqueRef[] techs)
        {
                mTechniques = techs;
        }
       
        /** Set indices. */
        public final void setIndices(int firstIndex, int lastIndex, int firstVertex, int lastVertex)
        {
                mFirstIndex = firstIndex;
                mLastIndex = lastIndex;
                mFirstVertex = firstVertex;
                mLastVertex = lastVertex;
        }
       
        /** Set render states configuration. */
        public final void setRenderStates(RenderStatesConfiguration rs)
        {
                mRenderStates = rs;
        }

}