fFeedback.pas 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. unit fFeedback;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. Winapi.OpenGLExt,
  6. System.SysUtils,
  7. System.Classes,
  8. Vcl.Graphics,
  9. Vcl.Controls,
  10. Vcl.Forms,
  11. Vcl.Dialogs,
  12. Vcl.StdCtrls,
  13. GLS.Scene,
  14. GLS.SceneViewer,
  15. GLS.Feedback,
  16. GLS.GeomObjects,
  17. GLS.VectorFileObjects,
  18. GLS.Coordinates,
  19. GLS.BaseClasses,
  20. GLS.Objects;
  21. type
  22. TFormFeedback = class(TForm)
  23. GLScene1: TGLScene;
  24. GLSceneViewer1: TGLSceneViewer;
  25. GLCamera1: TGLCamera;
  26. GLDummyCube1: TGLDummyCube;
  27. GLLightSource1: TGLLightSource;
  28. GLCube1: TGLCube;
  29. GLFreeForm1: TGLFreeForm;
  30. Button1: TButton;
  31. GLFeedback1: TGLFeedback;
  32. GLDodecahedron1: TGLDodecahedron;
  33. MeshObject1: TGLDummyCube;
  34. MeshObject2: TGLDummyCube;
  35. GLSphere1: TGLSphere;
  36. procedure Button1Click(Sender: TObject);
  37. procedure GLSceneViewer1MouseDown(Sender: TObject;
  38. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  39. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  40. X, Y: Integer);
  41. public
  42. mx, my: Integer;
  43. end;
  44. var
  45. FormFeedback: TFormFeedback;
  46. implementation
  47. {$R *.dfm}
  48. procedure TFormFeedback.Button1Click(Sender: TObject);
  49. var
  50. mo: TMeshObject;
  51. fg: TFGIndexTexCoordList;
  52. begin
  53. // Clear our freeform of any meshes
  54. GLFreeForm1.MeshObjects.Clear;
  55. // Set feedback to active, will feedback render child
  56. // objects into it's buffer
  57. GLFeedback1.Active := True;
  58. // Process the first mesh object (GLCube and GLDodecahedron)
  59. // Make the objects visible that we want to buffer
  60. MeshObject1.Visible := True;
  61. // Render the feedback object to buffer it's child object
  62. // that are visible
  63. GLSceneViewer1.Buffer.Render(GLFeedback1);
  64. // Hide the child objects we rendered
  65. MeshObject1.Visible := False;
  66. // Create a new mesh object in our freeform
  67. mo := TMeshObject.CreateOwned(GLFreeForm1.MeshObjects);
  68. mo.Mode := momTriangles;
  69. // Process the feedback buffer for polygon data
  70. // and build a mesh (normals are recalculated
  71. // since feedback only yields position and
  72. // texcoords)
  73. GLFeedback1.BuildMeshFromBuffer(
  74. mo.Vertices, mo.Normals, mo.Colors, mo.TexCoords, nil);
  75. // Process the second mesh object (GLSphere)
  76. // (comments from first mesh object apply here also)
  77. MeshObject2.Visible := True;
  78. GLSceneViewer1.Buffer.Render(GLFeedback1);
  79. MeshObject2.Visible := False;
  80. // Vertex indices are required for smooth normals
  81. mo := TMeshObject.CreateOwned(GLFreeForm1.MeshObjects);
  82. mo.Mode := momFaceGroups;
  83. fg := TFGIndexTexCoordList.CreateOwned(mo.FaceGroups);
  84. fg.Mode := fgmmTriangles;
  85. GLFeedback1.BuildMeshFromBuffer(mo.Vertices, mo.Normals, nil, fg.TexCoords, fg.VertexIndices);
  86. // Deactivate the feedback object
  87. GLFeedback1.Active := False;
  88. GLFreeForm1.StructureChanged;
  89. end;
  90. procedure TFormFeedback.GLSceneViewer1MouseDown(Sender: TObject;
  91. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  92. begin
  93. mx := x;
  94. my := y;
  95. end;
  96. procedure TFormFeedback.GLSceneViewer1MouseMove(Sender: TObject;
  97. Shift: TShiftState; X, Y: Integer);
  98. begin
  99. if ssLeft in Shift then
  100. GLCamera1.MoveAroundTarget(my - y, mx - x);
  101. mx := x;
  102. my := y;
  103. end;
  104. end.