fCgSimpleC.cpp 7.0 KB

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