The proposed solution is not natively supported and may not work in all scenarios or versions.
You can have a Mesh entity displayed always as Rendered, regardless of the active display mode, by using the following class derived from Mesh:
public class MyShadedMesh : Mesh
{
public MyShadedMesh(Point3D[] vertices, IndexTriangle[] triangles) : base(vertices, triangles)
{
}
public override void DrawWireframe(DrawParams data)
{
Pre(data);
SetRenderedShader(data);
Color col = Color;
if (data.Selected)
{
col = Color.Gold; // sets the selection color
}
data.RenderContext.SetColorDiffuse(col, col);
Draw(data);
Post(data);
}
void SetRenderedShader(DrawParams data)
{
if (data.ShaderParams != null)
{
bool prevLighting = data.ShaderParams.Lighting;
var prevPrimitiveType = data.ShaderParams.PrimitiveType;
data.ShaderParams.Lighting = true;
data.ShaderParams.PrimitiveType = shaderPrimitiveType.Polygon;
base.SetShader(data);
data.ShaderParams.Lighting = prevLighting;
data.ShaderParams.PrimitiveType = prevPrimitiveType;
}
}
public override void DrawIsocurves(DrawParams data)
{
// intentionally left blank
}
public override void DrawForSelection(DrawForSelectionParams data)
{
Pre(data);
base.DrawForSelection(data);
Post(data);
}
private void Pre(DrawParams data)
{
data.RenderContext.PushRasterizerState();
data.RenderContext.SetState(rasterizerStateType.CCW_PolygonFill_CullFaceBack_PolygonOffset_1_1);
}
private static void Post(DrawParams data)
{
data.RenderContext.PopRasterizerState();
}
}
Usage:
design1.ActiveViewport.DisplayMode = displayType.Wireframe;
Mesh sphere = Mesh.CreateSphere(10, 24, 12);
design1.Entities.Add(new MyShadedMesh(sphere.Vertices, sphere.Triangles), Color.Red);
Mesh cone = Mesh.CreateCone(10, 0, new Point3D(20, 0, 0), new Point3D(20, 0, 20), 16);
design1.Entities.Add(cone, Color.Green);
Comments
Please sign in to leave a comment.