Unit1.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include <tchar.h>
  4. #pragma hdrstop
  5. #include "Unit1.h"
  6. //---------------------------------------------------------------------------
  7. #pragma package(smart_init)
  8. #pragma link "GLS.BaseClasses"
  9. #pragma link "GLSL.CgShader"
  10. #pragma link "GLS.Material"
  11. #pragma link "GLS.Scene"
  12. #pragma link "GLS.SceneViewer"
  13. #pragma link "GLS.Cadencer"
  14. #pragma link "GLS.Coordinates"
  15. #pragma link "GLS.Graph"
  16. #pragma link "GLS.Objects"
  17. #pragma link "GLS.VectorFileObjects"
  18. #pragma link "GLS.File3DS"
  19. #pragma resource "*.dfm"
  20. TForm1 *Form1;
  21. //---------------------------------------------------------------------------
  22. __fastcall TForm1::TForm1(TComponent* Owner)
  23. : TForm(Owner)
  24. {
  25. }
  26. //---------------------------------------------------------------------------
  27. void __fastcall TForm1::FormCreate(TObject *Sender)
  28. {
  29. // Load Cg proggy from project directory
  30. SetCurrentDir(ExtractFilePath(Application->ExeName));
  31. CgShader1->VertexProgram->LoadFromFile("simple_vp.cg");
  32. MemoVertCode->Lines->Assign(CgShader1->VertexProgram->Code);
  33. CgShader1->FragmentProgram->LoadFromFile("simple_fp.cg");
  34. MemoFragCode->Lines->Assign(CgShader1->FragmentProgram->Code);
  35. CgShader1->VertexProgram->Enabled = false;
  36. CgShader1->FragmentProgram->Enabled = false;
  37. ButtonApplyFP->Enabled = false;
  38. ButtonApplyVP->Enabled = false;
  39. // Bind shader to the material
  40. GLMaterialLibrary1->Materials->Items[0]->Shader = CgShader1;
  41. // Load the teapot model from media directory.
  42. SetGLSceneMediaDir();
  43. // Note that GLScene will alter the ModelView matrix
  44. // internally for GLScene objects like TGLCylinder & TGLSphere, and Cg shader
  45. // is not aware of that. If you apply a vertex shader on those objects, they
  46. // would appear scaled and/or rotated.
  47. GLFreeForm1->LoadFromFile("Teapot.3ds");
  48. }
  49. //---------------------------------------------------------------------------
  50. void __fastcall TForm1::CgShader1ApplyVP(TCgProgram *CgProgram, TObject *Sender)
  51. {
  52. Gls::Vectorgeometry::TVector v;
  53. TCgParameter *Param;
  54. // rotate light vector for the "simple lighting" vertex program
  55. v = ZHmgVector;
  56. RotateVector(v, YVector, GLCadencer1->CurrentTime);
  57. Param = CgProgram->ParamByName("LightVec");
  58. Param->AsVector = v;
  59. // or using plain Cg API: cgGLSetParameter4fv(Param.Handle, @v);
  60. // set uniform parameters that change every frame
  61. CgProgram->ParamByName("ModelViewProj")->SetAsStateMatrix(CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
  62. CgProgram->ParamByName("ModelViewIT")->SetAsStateMatrix(CG_GL_MODELVIEW_MATRIX, CG_GL_MATRIX_INVERSE_TRANSPOSE);
  63. // Or, using plain Cg API:
  64. // Param = CgProgram->ParamByName("ModelViewIT");
  65. // cgGLSetStateMatrixParameter(Param->Handle, CG_GL_MODELVIEW_MATRIX, CG_GL_MATRIX_INVERSE_TRANSPOSE);
  66. }
  67. //---------------------------------------------------------------------------
  68. void __fastcall TForm1::CgShader1Initialize(TCustomCgShader *CgShader)
  69. {
  70. // Shows the profiles to be used. The latest support profiles would be detected
  71. // if you have CgShader1.VertexProgram.Profile set to vpDetectLatest (similarly
  72. // for the fragment program).
  73. LabelVertProfile->Caption = "Using profile: " + CgShader1->VertexProgram->GetProfileStringA();
  74. LabelFragProfile->Caption = "Using profile: " + CgShader1->FragmentProgram->GetProfileStringA();
  75. }
  76. //---------------------------------------------------------------------------
  77. void __fastcall TForm1::CBVertexProgramClick(TObject *Sender)
  78. {
  79. CgShader1->VertexProgram->Enabled = CBVertexProgram->Checked;
  80. }
  81. //---------------------------------------------------------------------------
  82. void __fastcall TForm1::CBFragmentProgramClick(TObject *Sender)
  83. {
  84. CgShader1->FragmentProgram->Enabled = CBFragmentProgram->Checked;
  85. }
  86. //---------------------------------------------------------------------------
  87. void __fastcall TForm1::ButtonApplyFPClick(TObject *Sender)
  88. {
  89. CgShader1->FragmentProgram->Code = MemoFragCode->Lines;
  90. ButtonApplyFP->Enabled = false;
  91. }
  92. //---------------------------------------------------------------------------
  93. void __fastcall TForm1::ButtonApplyVPClick(TObject *Sender)
  94. {
  95. CgShader1->VertexProgram->Code = MemoVertCode->Lines;
  96. ButtonApplyVP->Enabled = false;
  97. }
  98. //---------------------------------------------------------------------------
  99. void __fastcall TForm1::MemoFragCodeChange(TObject *Sender)
  100. {
  101. ButtonApplyFP->Enabled = true;
  102. }
  103. //---------------------------------------------------------------------------
  104. void __fastcall TForm1::MemoVertCodeChange(TObject *Sender)
  105. {
  106. ButtonApplyVP->Enabled = true;
  107. }
  108. //---------------------------------------------------------------------------
  109. void __fastcall TForm1::Button1Click(TObject *Sender)
  110. {
  111. CgShader1->VertexProgram->ListParameters(Memo1->Lines);
  112. }
  113. //---------------------------------------------------------------------------
  114. void __fastcall TForm1::Button2Click(TObject *Sender)
  115. {
  116. CgShader1->FragmentProgram->ListParameters(Memo3->Lines);
  117. }
  118. //---------------------------------------------------------------------------
  119. void __fastcall TForm1::Button3Click(TObject *Sender)
  120. {
  121. CgShader1->FragmentProgram->ListCompilation(Memo3->Lines);
  122. }
  123. //---------------------------------------------------------------------------
  124. void __fastcall TForm1::Button4Click(TObject *Sender)
  125. {
  126. CgShader1->VertexProgram->ListCompilation(Memo1->Lines);
  127. }
  128. //---------------------------------------------------------------------------
  129. void __fastcall TForm1::GLSceneViewer1MouseDown(TObject *Sender, TMouseButton Button,
  130. TShiftState Shift, int X, int Y)
  131. {
  132. mx = X; my = Y;
  133. }
  134. //---------------------------------------------------------------------------
  135. void __fastcall TForm1::GLSceneViewer1MouseMove(TObject *Sender, TShiftState Shift,
  136. int X, int Y)
  137. {
  138. if (Shift.Contains(ssLeft) || Shift.Contains(ssRight))
  139. {
  140. GLCamera1->MoveAroundTarget(my-Y, mx-X);
  141. mx = X;
  142. my = Y;
  143. }
  144. }
  145. //---------------------------------------------------------------------------
  146. void __fastcall TForm1::GLCadencer1Progress(TObject *Sender, const double deltaTime,
  147. const double newTime)
  148. {
  149. GLSceneViewer1->Invalidate();
  150. }
  151. //---------------------------------------------------------------------------
  152. void __fastcall TForm1::FormMouseWheel(TObject *Sender, TShiftState Shift, int WheelDelta,
  153. TPoint &MousePos, bool &Handled)
  154. {
  155. if (PtInRect(ClientRect, ScreenToClient(MousePos)))
  156. {
  157. GLCamera1->SceneScale = GLCamera1->SceneScale * (1000 - WheelDelta) / 1000;
  158. Handled = true;
  159. }
  160. }
  161. //---------------------------------------------------------------------------
  162. void __fastcall TForm1::Timer1Timer(TObject *Sender)
  163. {
  164. PanelFPS->Caption = Format("%.1f fps",
  165. ARRAYOFCONST ((GLSceneViewer1->FramesPerSecond())));
  166. GLSceneViewer1->ResetPerformanceMonitor();
  167. }
  168. //---------------------------------------------------------------------------
  169. void __fastcall TForm1::FormKeyPress(TObject *Sender, System::WideChar &Key)
  170. {
  171. if (Key == 0x27) Close();
  172. }
  173. //---------------------------------------------------------------------------