private static Bitmap GenerateIcon(Model3DNode model, GLControl glcontrol, Vector2 icon_size, M3D.Model.Utils.Vector3 orientation, Color4 bgColor) { ImageCapture.SetViewPoint(glcontrol); var rotation = new M3D.Model.Utils.Vector3(orientation); var translation = new M3D.Model.Utils.Vector3(0.0f, 0.0f, 0.0f); M3D.Model.Utils.Vector3 ext = model.CalculateMinMax().Ext; var num = ext.X <= (double)ext.Z ? ext.Z <= (double)ext.Y ? 100f / ext.Y : 100f / ext.Z : ext.Y <= (double)ext.X ? 100f / ext.X : 100f / ext.Y; var scale = new M3D.Model.Utils.Vector3(num, num, num); ImageCapture.SetupForIconRender(new OpenTK.Vector3(100f, 100f, 250f), new OpenTK.Vector3(0.0f, 0.0f, 0.0f), bgColor); ImageCapture.RenderModelGetScreenMinMax(model, rotation, translation, scale, out Rectangle screen_rec); return(ImageCapture.GrabIconFromRender(glcontrol, ref screen_rec, icon_size)); }
private static Rectangle GetScreenMinMax(Model3DNode model) { int[] numArray = new int[4]; double[] data1 = new double[16]; double[] data2 = new double[16]; GL.GetInteger(GetPName.Viewport, numArray); GL.GetDouble(GetPName.Modelview0MatrixExt, data1); GL.GetDouble(GetPName.ProjectionMatrix, data2); var right = new Matrix4((float)data2[0], (float)data2[1], (float)data2[2], (float)data2[3], (float)data2[4], (float)data2[5], (float)data2[6], (float)data2[7], (float)data2[8], (float)data2[9], (float)data2[10], (float)data2[11], (float)data2[12], (float)data2[13], (float)data2[14], (float)data2[15]); var left = new Matrix4((float)data1[0], (float)data1[1], (float)data1[2], (float)data1[3], (float)data1[4], (float)data1[5], (float)data1[6], (float)data1[7], (float)data1[8], (float)data1[9], (float)data1[10], (float)data1[11], (float)data1[12], (float)data1[13], (float)data1[14], (float)data1[15]); var screen_max = new M3D.Model.Utils.Vector3(float.MinValue, float.MinValue, float.MinValue); var screen_min = new M3D.Model.Utils.Vector3(float.MaxValue, float.MaxValue, float.MaxValue); ModelSize minMax = model.CalculateMinMax(); M3D.Model.Utils.Vector3 min = minMax.Min; M3D.Model.Utils.Vector3 max = minMax.Max; M3D.Model.Utils.Vector3 ext = minMax.Ext; var coord1 = new M3D.Model.Utils.Vector3(min); ImageCapture.UpdateScreenMinMax(coord1, ref screen_min, ref screen_max, Matrix4.Mult(left, right), numArray); coord1.X = max.X; ImageCapture.UpdateScreenMinMax(coord1, ref screen_min, ref screen_max, Matrix4.Mult(left, right), numArray); coord1.Z = max.Z; ImageCapture.UpdateScreenMinMax(coord1, ref screen_min, ref screen_max, Matrix4.Mult(left, right), numArray); coord1.X = min.X; ImageCapture.UpdateScreenMinMax(coord1, ref screen_min, ref screen_max, Matrix4.Mult(left, right), numArray); var coord2 = new M3D.Model.Utils.Vector3(max); ImageCapture.UpdateScreenMinMax(coord2, ref screen_min, ref screen_max, Matrix4.Mult(left, right), numArray); coord2.X = min.X; ImageCapture.UpdateScreenMinMax(coord2, ref screen_min, ref screen_max, Matrix4.Mult(left, right), numArray); coord2.Z = min.Z; ImageCapture.UpdateScreenMinMax(coord2, ref screen_min, ref screen_max, Matrix4.Mult(left, right), numArray); coord2.X = max.X; ImageCapture.UpdateScreenMinMax(coord2, ref screen_min, ref screen_max, Matrix4.Mult(left, right), numArray); return(new Rectangle((int)screen_min.X, (int)screen_min.Y, (int)(screen_max.X - (double)screen_min.X), (int)(screen_max.Y - (double)screen_min.Y))); }