123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- unit fFeedback;
- interface
- uses
- Winapi.OpenGL,
- Winapi.OpenGLExt,
- System.SysUtils,
- System.Classes,
- Vcl.Graphics,
- Vcl.Controls,
- Vcl.Forms,
- Vcl.Dialogs,
- Vcl.StdCtrls,
- GLS.Scene,
- GLS.SceneViewer,
- GLS.Feedback,
- GLS.GeomObjects,
- GLS.VectorFileObjects,
- GLS.Coordinates,
- GLS.BaseClasses,
- GLS.Objects;
- type
- TFormFeedback = class(TForm)
- GLScene1: TGLScene;
- GLSceneViewer1: TGLSceneViewer;
- GLCamera1: TGLCamera;
- GLDummyCube1: TGLDummyCube;
- GLLightSource1: TGLLightSource;
- GLCube1: TGLCube;
- GLFreeForm1: TGLFreeForm;
- Button1: TButton;
- GLFeedback1: TGLFeedback;
- GLDodecahedron1: TGLDodecahedron;
- MeshObject1: TGLDummyCube;
- MeshObject2: TGLDummyCube;
- GLSphere1: TGLSphere;
- procedure Button1Click(Sender: TObject);
- procedure GLSceneViewer1MouseDown(Sender: TObject;
- Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
- procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
- X, Y: Integer);
- public
- mx, my: Integer;
- end;
- var
- FormFeedback: TFormFeedback;
- implementation
- {$R *.dfm}
- procedure TFormFeedback.Button1Click(Sender: TObject);
- var
- mo: TMeshObject;
- fg: TFGIndexTexCoordList;
- begin
- // Clear our freeform of any meshes
- GLFreeForm1.MeshObjects.Clear;
- // Set feedback to active, will feedback render child
- // objects into it's buffer
- GLFeedback1.Active := True;
- // Process the first mesh object (GLCube and GLDodecahedron)
- // Make the objects visible that we want to buffer
- MeshObject1.Visible := True;
- // Render the feedback object to buffer it's child object
- // that are visible
- GLSceneViewer1.Buffer.Render(GLFeedback1);
- // Hide the child objects we rendered
- MeshObject1.Visible := False;
- // Create a new mesh object in our freeform
- mo := TMeshObject.CreateOwned(GLFreeForm1.MeshObjects);
- mo.Mode := momTriangles;
- // Process the feedback buffer for polygon data
- // and build a mesh (normals are recalculated
- // since feedback only yields position and
- // texcoords)
- GLFeedback1.BuildMeshFromBuffer(
- mo.Vertices, mo.Normals, mo.Colors, mo.TexCoords, nil);
- // Process the second mesh object (GLSphere)
- // (comments from first mesh object apply here also)
- MeshObject2.Visible := True;
- GLSceneViewer1.Buffer.Render(GLFeedback1);
- MeshObject2.Visible := False;
- // Vertex indices are required for smooth normals
- mo := TMeshObject.CreateOwned(GLFreeForm1.MeshObjects);
- mo.Mode := momFaceGroups;
- fg := TFGIndexTexCoordList.CreateOwned(mo.FaceGroups);
- fg.Mode := fgmmTriangles;
- GLFeedback1.BuildMeshFromBuffer(mo.Vertices, mo.Normals, nil, fg.TexCoords, fg.VertexIndices);
- // Deactivate the feedback object
- GLFeedback1.Active := False;
- GLFreeForm1.StructureChanged;
- end;
- procedure TFormFeedback.GLSceneViewer1MouseDown(Sender: TObject;
- Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
- begin
- mx := x;
- my := y;
- end;
- procedure TFormFeedback.GLSceneViewer1MouseMove(Sender: TObject;
- Shift: TShiftState; X, Y: Integer);
- begin
- if ssLeft in Shift then
- GLCamera1.MoveAroundTarget(my - y, mx - x);
- mx := x;
- my := y;
- end;
- end.
|