| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 |
- //--------------------------------------------------------------
- #include <sysutils.hpp>
- #include <math.h>
- #include <vcl.h>
- #pragma hdrstop
- #include "fSimpleShaderC.h"
- #include "GLS.Keyboard.hpp"
- #include "GLS.Context.hpp"
- #include "GLS.File3DS.hpp"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- #pragma link "GLS.OpenGLAdapter"
- #pragma link "GLS.BitmapFont"
- #pragma link "GLS.Cadencer"
- #pragma link "GLS.GeomObjects"
- #pragma link "GLS.HUDObjects"
- #pragma link "GLS.Objects"
- #pragma link "GLS.Scene"
- #pragma link "GLS.Texture"
- #pragma link "GLSL.UserShader"
- #pragma link "GLS.OpenGLTokens"
- #pragma link "GLS.VectorFileObjects"
- #pragma link "GLS.SceneViewer"
- #pragma link "GLS.WindowsFont"
- #pragma link "GLS.Keyboard"
- #pragma link "GLS.Context"
- #pragma link "GLS.File3DS"
- #pragma link "GLS.BaseClasses"
- #pragma link "GLS.Coordinates"
- #pragma link "GLS.Material"
- #pragma link "GLS.SimpleNavigation"
- #pragma resource "*.dfm"
- TForm1* Form1;
- int CurrShader = 0;
- AnsiString CurrShaderName = "Blinn";
- //---------------------------------------------------------------------------
- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {}
- //---------------------------------------------------------------------------
- void __fastcall TForm1::FormCreate(TObject* Sender)
- {
- Path = GetCurrentAssetPath();
- // Loading static models
- SetCurrentDir(Path + "\\model");
- GLFreeForm1->LoadFromFile("teapot.3ds");
- // Then loading textures.
- SetCurrentDir(Path + "\\texture");
- MatLib->LibMaterialByName("Brick01")
- ->Material->Texture->Image->LoadFromFile("mur_NormalMap.bmp");
- MatLib->LibMaterialByName("Brick02")
- ->Material->Texture->Image->LoadFromFile("mur_Ambiant.bmp");
- MatLib->LibMaterialByName("Brick03")
- ->Material->Texture->Image->LoadFromFile("mur_Hauteur.bmp");
- ShaderActived = false;
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::GLCadencer1Progress(
- TObject* Sender, const double deltaTime, const double newTime)
- {
- if (IsKeyDown('1')) {
- CurrShaderName = "Blinn";
- CurrShader = 0;
- } else if (IsKeyDown('2')) {
- CurrShaderName = "Lambert";
- CurrShader = 1;
- } else if (IsKeyDown('3')) {
- CurrShaderName = "Phong";
- CurrShader = 2;
- } else if (IsKeyDown('4')) {
- CurrShaderName = "Rim";
- CurrShader = 3;
- } else if (IsKeyDown('5')) {
- CurrShaderName = "SharpSpecular";
- CurrShader = 4;
- } else if (IsKeyDown('6')) {
- CurrShaderName = "Sheen";
- CurrShader = 5;
- } else if (IsKeyDown('7')) {
- CurrShaderName = "ThinPlastic";
- CurrShader = 6;
- } else if (IsKeyDown('8')) {
- CurrShaderName = "Velvet";
- CurrShader = 7;
- }
- if (IsKeyDown('9')) {
- CurrShaderName = "TEST TEXTURE BUMP";
- CurrShader = 8;
- }
- if (IsKeyDown('0')) {
- CurrShaderName = "TEST Toon";
- CurrShader = 9;
- }
- if (CurrShader != 8) {
- DummyLight->Position->X = sin(DegToRad(newTime * 15)) * 65;
- DummyLight->Position->Z = sin(DegToRad(newTime * 15)) * 65;
- }
- GLSceneViewer1->Invalidate();
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::GLUserShader1DoApply(
- TObject* Sender, TGLRenderContextInfo &rci)
- {
- TVector3f vec, VecCol1, VecCol2;
- TGLLibMaterial* libMat;
- GLSLProg[CurrShader]->UseProgramObject();
- if ((CurrShader != 8) && (CurrShader != 9))
- GLSLProg[CurrShader]->Uniform4f["light"] = Light->AbsolutePosition;
- if ((CurrShader == 8)) {
- // initialize the heightmap
- libMat = MatLib->LibMaterialByName("Brick01");
- {
- libMat->PrepareBuildList();
- glActiveTextureARB(GL_TEXTURE0_ARB);
- glBindTexture(GL_TEXTURE_2D, libMat->Material->Texture->Handle);
- GLSLProg[CurrShader]->Uniform1i["Normal"] = 0;
- glActiveTextureARB(GL_TEXTURE0_ARB);
- }
- libMat = MatLib->LibMaterialByName("Brick02");
- {
- libMat->PrepareBuildList();
- glActiveTextureARB(GL_TEXTURE1_ARB);
- glBindTexture(GL_TEXTURE_2D, libMat->Material->Texture->Handle);
- GLSLProg[CurrShader]->Uniform1i["base_tex"] = 1;
- glActiveTextureARB(GL_TEXTURE0_ARB);
- }
- libMat = MatLib->LibMaterialByName("Brick03");
- {
- libMat->PrepareBuildList();
- glActiveTextureARB(GL_TEXTURE2_ARB);
- glBindTexture(GL_TEXTURE_2D, libMat->Material->Texture->Handle);
- GLSLProg[CurrShader]->Uniform1i["Base_Height"] = 2;
- glActiveTextureARB(GL_TEXTURE0_ARB);
- }
- GLSLProg[CurrShader]->Uniform1f["u_invRad"] = 0.001;
- vec.X = 0.42200005;
- vec.Y = -0.04999996;
- vec.Z = 0;
- GLSLProg[CurrShader]->Uniform3f["cBumpSize"] = vec;
- }
- if ((CurrShader == 9)) {
- VecCol1.X = 0.5;
- VecCol1.Y = 0.25;
- VecCol1.Z = 0.2;
- GLSLProg[CurrShader]->Uniform3f["DiffuseColor"] = VecCol1;
- VecCol2.X = 0.95;
- VecCol2.Y = 0.45;
- VecCol2.Z = 0.3;
- GLSLProg[CurrShader]->Uniform3f["PhongColor"] = VecCol2;
- GLSLProg[CurrShader]->Uniform1f["Edge"] = 0.25;
- GLSLProg[CurrShader]->Uniform1f["Phong"] = 0.5540001;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::GLUserShader1DoUnApply(
- TObject* Sender, int Pass, TGLRenderContextInfo &rci, bool &Continue)
- {
- GLSLProg[CurrShader]->EndUseProgramObject();
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::Timer1Timer(TObject* Sender)
- {
- Caption = Format("Simple GLSL Shader [%.2f FPS]",
- ARRAYOFCONST((GLSceneViewer1->FramesPerSecond())));
- GLHUDText1->Text =
- "GLS.Keyboard [1,2,3,4,5,6,7,8,9,0 ] Current Shader: " + CurrShaderName;
- GLSceneViewer1->ResetPerformanceMonitor();
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::GLSceneViewer1MouseDown(
- TObject* Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
- {
- mx = X;
- my = Y;
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::GLSceneViewer1MouseMove(
- TObject* Sender, TShiftState Shift, int X, int Y)
- {
- if (Shift.Contains(ssRight))
- Cam->MoveAroundTarget(my - Y, mx - X);
- mx = X;
- my = Y;
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::FormClose(TObject* Sender, TCloseAction &Action)
- {
- GLCadencer1->Enabled = false;
- Timer1->Enabled = false;
- ShaderActived = false;
- for (int i = 0; i < MAXSHADERS; i++) {
- GLSLProg[i]->Free();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::FormMouseWheel(TObject* Sender, TShiftState Shift,
- int WheelDelta, TPoint &MousePos, bool &Handled)
- {
- Cam->AdjustDistanceToTarget(Power(1.1, WheelDelta / 120));
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::GLDOInitializeRender(
- TObject* Sender, TGLRenderContextInfo &rci)
- {
- bool Continue;
- if (!ShaderActived) /// Should be (! ShaderActived)
- {
- if (!((GL_SHADER_OBJECT_ARB) && (GL_VERTEX_PROGRAM_ARB) &&
- (GL_VERTEX_SHADER_ARB) && (GL_FRAGMENT_SHADER_ARB)))
- {
- ShowMessage(
- "Your hardware does not support GLSL to execute this demo!");
- // return (void) NULL; <- It's not necessary
- }
- // Loading shaders
- SetCurrentDir(Path + "\\shader");
- //Blinn Shader
- GLSLProg[0] = new TGLProgramHandle(true);
- GLSLProg[0]->AddShader(__classid(TGLVertexShaderHandle),
- LoadAnsiStringFromFile("vertex.glsl"), true);
- GLSLProg[0]->AddShader(__classid(TGLFragmentShaderHandle),
- LoadAnsiStringFromFile("blinn.glsl"), true);
- //Lambert Shader
- GLSLProg[1] = new TGLProgramHandle(true);
- GLSLProg[1]->AddShader(__classid(TGLVertexShaderHandle),
- LoadAnsiStringFromFile("vertex.glsl"), true);
- GLSLProg[1]->AddShader(__classid(TGLFragmentShaderHandle),
- LoadAnsiStringFromFile("lambert.glsl"), true);
- //Phong Shader
- GLSLProg[2] = new TGLProgramHandle(true);
- GLSLProg[2]->AddShader(__classid(TGLVertexShaderHandle),
- LoadAnsiStringFromFile("vertex.glsl"), true);
- GLSLProg[2]->AddShader(__classid(TGLFragmentShaderHandle),
- LoadAnsiStringFromFile("phong.glsl"), true);
- //Rim Shader
- GLSLProg[3] = new TGLProgramHandle(true);
- GLSLProg[3]->AddShader(__classid(TGLVertexShaderHandle),
- LoadAnsiStringFromFile("vertex.glsl"), true);
- GLSLProg[3]->AddShader(__classid(TGLFragmentShaderHandle),
- LoadAnsiStringFromFile("rim.glsl"), true);
- //SharpSpecular Shader
- GLSLProg[4] = new TGLProgramHandle(true);
- GLSLProg[4]->AddShader(__classid(TGLVertexShaderHandle),
- LoadAnsiStringFromFile("vertex.glsl"), true);
- GLSLProg[4]->AddShader(__classid(TGLFragmentShaderHandle),
- LoadAnsiStringFromFile("sharpspecular.glsl"), true);
- //Sheen Shader
- GLSLProg[5] = new TGLProgramHandle(true);
- GLSLProg[5]->AddShader(__classid(TGLVertexShaderHandle),
- LoadAnsiStringFromFile("vertex.glsl"), true);
- GLSLProg[5]->AddShader(__classid(TGLFragmentShaderHandle),
- LoadAnsiStringFromFile("sheen.glsl"), true);
- //ThinPlastic Shader
- GLSLProg[6] = new TGLProgramHandle(true);
- GLSLProg[6]->AddShader(__classid(TGLVertexShaderHandle),
- LoadAnsiStringFromFile("vertex.glsl"), true);
- GLSLProg[6]->AddShader(__classid(TGLFragmentShaderHandle),
- LoadAnsiStringFromFile("thinplastic.glsl"), true);
- //Velvet Shader
- GLSLProg[7] = new TGLProgramHandle(true);
- GLSLProg[7]->AddShader(__classid(TGLVertexShaderHandle),
- LoadAnsiStringFromFile("vertex.glsl"), true);
- GLSLProg[7]->AddShader(__classid(TGLFragmentShaderHandle),
- LoadAnsiStringFromFile("velvet.glsl"), true);
- //TEST Texture Bump
- GLSLProg[8] = new TGLProgramHandle(true);
- GLSLProg[8]->AddShader(__classid(TGLVertexShaderHandle),
- LoadAnsiStringFromFile("bump2.vert"), true);
- GLSLProg[8]->AddShader(__classid(TGLFragmentShaderHandle),
- LoadAnsiStringFromFile("bump2.frag"), true);
- //TEST Toon
- GLSLProg[9] = new TGLProgramHandle(true);
- GLSLProg[9]->AddShader(__classid(TGLVertexShaderHandle),
- LoadAnsiStringFromFile("toon.vert"), true);
- GLSLProg[9]->AddShader(__classid(TGLFragmentShaderHandle),
- LoadAnsiStringFromFile("toon.frag"), true);
- for (int i = 0; i < MAXSHADERS; i++) {
- if (!GLSLProg[i]->LinkProgram())
- throw Exception(GLSLProg[i]->InfoLog());
- if (!GLSLProg[i]->ValidateProgram())
- throw Exception(GLSLProg[i]->InfoLog());
- }
- glGetError();
- ShaderActived = true;
- } else if (ShaderActived) {
- GLUserShader1DoApply(this, rci);
- if (CurrShader != 8) {
- glPushMatrix();
- glColor4fv(
- GLSphere1->Material->FrontProperties->Diffuse->AsAddress());
- GLSphere1->DoRender(rci, true, false);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(1, 0, 0);
- glColor4fv(
- GLCone1->Material->FrontProperties->Diffuse->AsAddress());
- GLCone1->DoRender(rci, true, false);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0, -1, 0);
- glScalef(0.015, 0.015, 0.015);
- glRotatef(90, -1, 0, 0);
- glColor4fv(
- GLFreeForm1->Material->FrontProperties->Diffuse->AsAddress());
- GLFreeForm1->DoRender(rci, true, false);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(-1, 0, 0);
- glColor4fv(
- GLCube1->Material->FrontProperties->Diffuse->AsAddress());
- GLCube1->DoRender(rci, true, false);
- glPopMatrix();
- } else {
- glPushMatrix();
- GLCube1->DoRender(rci, true, false);
- glPopMatrix();
- }
- }
- GLUserShader1DoUnApply(this, 0, rci, Continue);
- }
- //---------------------------------------------------------------------------
|