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
;
}
}