Non-maintained solution
The proposed solution is not natively supported and may not work in all scenarios or versions.
In case you need to create a colormap Mesh that shows a smooth (or sharp) color transition for two adjacent vertices, you can use a Texture1D object.
Here it is the code to create a custom mesh using Texture1D:
using System.Drawing;
using devDept.Eyeshot;
using devDept.Eyeshot.Entities;
using devDept.Geometry;
using devDept.Graphics;
class MyPoint : Point3D
{
public MyPoint(double x, double y, double z, double t) : base(x, y, z)
{
Temperature = t;
}
public double Temperature;
}
public class MyMeshTex1D : Mesh
{
private TextureBase tex;
public MyMeshTex1D() : base(natureType.RichPlain)
{
}
private void CreateTexture1D(RenderContextBase renderContext)
{
Color[] colors = new Color[] { Color.Salmon, Color.Red, Color.Yellow, Color.LimeGreen, Color.Blue };
tex = renderContext.CreateTexture1D(colors, textureFilteringFunctionType.Nearest, textureFilteringFunctionType.Nearest, true, false);
// Replace with this for smooth mode
// tex = renderContext.CreateTexture1D(colors, textureFilteringFunctionType.Linear, textureFilteringFunctionType.Linear, true, false);
}
public override void Dispose()
{
tex.Dispose();
base.Dispose();
}
public override void Compile(CompileParams data)
{
CreateTexture1D(data.RenderContext);
base.Compile(data);
}
private bool prevTex1D;
protected override void SetShader(DrawParams data)
{
// Tell the shader to set a Texture1D.
if (data.ShaderParams != null && !data.Selected)
{
prevTex1D = data.ShaderParams.Texture1D;
data.ShaderParams.Texture1D = true;
}
base.SetShader(data);
}
protected override void Render(RenderParams data)
{
if (data.ShaderParams != null && !data.Selected)
data.RenderContext.SetTexture(tex);
base.Render(data);
if (data.ShaderParams != null && !data.Selected)
{
data.RenderContext.CloseTexture();
data.ShaderParams.Texture1D = prevTex1D;
}
}
}
Declaration of the object:
Mesh m = new MyMeshTex1D();
Point3D[] pts = new Point3D[] { new MyPoint(0, 0, 0, 0), new MyPoint(20, 0, 0, 0), new MyPoint(20, 15, 0, 1), new MyPoint(0, 15, 0, 0) };
IndexTriangle[] triangles = new IndexTriangle[] { new RichTriangle(0, 1, 2, 0, 1, 2), new RichTriangle(0, 2, 3, 0, 2, 3) };
m.Vertices = pts;
m.Triangles = triangles;
// the second coordinate is unused because we are using Texture1D
m.TextureCoords = new PointF[m.Vertices.Length];
for (int i = 0; i < m.Vertices.Length; i++)
{
// The second coordinate is not used
// Multiply by 0.75 to use just the first 3 colors
m.TextureCoords[i] = new PointF((float)((MyPoint)m.Vertices[i]).Temperature, 0);
}
m.Color = Color.White;
m.ColorMethod = colorMethodType.byEntity;
design1.Entities.Add(m);
// sets rendered only display mode
design1.ActiveViewport.DisplayMode = displayType.Rendered;
// sets trimetric view
design1.SetView(viewType.Trimetric);
| Smooth color transition | Sharp color transition |
No lighting
If you prefer a display without lighting, please replace the SetShader() method above with the following one:
protected override void SetShader(DrawParams data)
{
// Tell the shader to set a Texture1D.
if (data.ShaderParams != null && !data.Selected)
{
prevTex1D = data.ShaderParams.Texture1D;
data.ShaderParams.Texture1D = true;
data.ShaderParams.Lighting = false;
}
base.SetShader(data);
}
Comments
L'algoritmo divide il range di valori in n parti uguali quanti sono i colori. E' possibile assegnare i colori impostando dei range diversi a ciascuno?
Please sign in to leave a comment.