public void DrawHeadObject(GraphicsDevice device, Effect effect)
{
//0: high reflective
//1: light reflective
//2: outline
if (effect.Techniques[1] == effect.CurrentTechnique)
{
return;
}
var headObj = HeadObject;
if (headObj == null)
{
return;
}
var oldTech = effect.CurrentTechnique;
effect.CurrentTechnique = effect.Techniques[6];
device.RasterizerState = RasterizerState.CullClockwise;
var trans = Matrix.Invert(effect.Parameters["View"].GetValueMatrix()).Translation;
effect.Parameters["HOCameraPosition"].SetValue(trans);
effect.Parameters["World"].SetValue(Matrix.CreateScale(1.33f) * Matrix.CreateRotationY(HeadObjectRotation) * Matrix.CreateTranslation(Skeleton.GetBone("HEAD").AbsoluteMatrix.Translation + new Vector3(0, 3.25f, 0)) * effect.Parameters["World"].GetValueMatrix());
for (int i = 0; i < headObj.Geoms.Count; i++)
{
var multi = 0.5f / (headObj.Geoms.Count - 1);
var geom = headObj.Geoms[i];
foreach (var item in geom)
{
effect.Parameters["MeshTex"].SetValue(item.Key);
effect.Parameters["HOToonSpecThresh"].SetValue(0.5f);
effect.Parameters["HOToonSpecColor"].SetValue(new Vector3(multi * ((headObj.Geoms.Count - 1) - i)));
effect.CurrentTechnique.Passes[0].Apply();
//if (i != 1) device.RasterizerState = RasterizerState.CullClockwise;
device.SetVertexBuffer(item.Value.Verts);
device.Indices = item.Value.Indices;
device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, item.Value.PrimCount);
//if (i != 1) device.RasterizerState = RasterizerState.CullCounterClockwise;
}
}
device.RasterizerState = RasterizerState.CullCounterClockwise;
effect.CurrentTechnique = oldTech;
}