fcCgSimple.cpp 6.9 KB

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