NaskelClass.cpp
上传用户:sz83729876
上传日期:2013-03-07
资源大小:4140k
文件大小:44k
源码类别:

OpenGL

开发平台:

Windows_Unix

  1. #include "../main.h"
  2. #include "water/water.cpp"
  3. #include "cyl.cpp"
  4. //**************************//
  5. // Defines                  //
  6. //**************************//
  7. #define CAMERASPEED 0.001f
  8. #define __WITH_SOUND
  9. #ifndef __FINAL
  10. // Only debug if non final..
  11. #define __DEBUG
  12. #endif
  13. #define Error(x)  if (::MessageBox(NULL, x, "Error", MB_ICONHAND|MB_OK|MB_DEFBUTTON1)==IDOK) exit(1);
  14. NIMG texture0, texstar, texwater, texwater1, texwater2, texwater3;
  15. NIMG texwater6, Sliding,Moving,Chrome;
  16. NIMG FireTex, TunnelTex,Img_Slide_BackGround, Img_Slide_ForeGround;
  17. NIMG FlyTextFore,FlyWhiteTex,skydome, amiga_girl, mouse_amiga,amiga_clic,amiga_bg,amiga_woops;
  18. NIMG Lava, Night,TubeTex,F0sT,LogoN;
  19. NSCENE NScene[NUM_SCENE];
  20. extern CCamera objCamera; 
  21. extern int key_move[4];
  22. int w_height = SCREEN_HEIGHT;
  23. int  w_width = SCREEN_WIDTH;
  24. int move[4];
  25. extern HWND g_hWnd;
  26. extern  int num_water;
  27. float LaunchTime;
  28. float  m_fAngle, m_smallc;
  29. //#ifdef __DEBUG
  30. extern float m_Z;
  31. extern bool GotNextScene;
  32. //#endif
  33. bool WaterResetPers = true;
  34. bool TimeFly = false;
  35. float FlySlide =  101;
  36. int FlyText = 0;
  37. bool FlyRotate = true;
  38. bool sliding_init = true;
  39. bool OglInit = true;
  40. bool SkyDomeInit = true;
  41. bool RotateOgl1 = true, RotateOgl2 = false, RotateOgl3 = false;
  42. bool SkyRotate = true;
  43. bool CylInit = true;
  44. //******************************************//
  45. // Sky Plane                                //
  46. //******************************************//
  47. DOME SkyPlane1, SkyPlane2;
  48. // Cyl
  49. float CylAngle = 0.0;
  50. int CylElapsedTime;
  51. DWORD CylStart, CylLastTime;
  52. float pos_rubber=+30.0f;
  53. float CylX=0.0f;
  54. Cylindre *cyl,*tunnel,*tunnel2;
  55. float  AdvanceCube = 0.0f;
  56. float deform_cyl=0.0f,deform_cyl_val=0.005f,deform_cyl_maxval=1.5f;
  57. float deform_cyl2=0.0f,deform_cyl_val2=0.008f,deform_cyl_maxval2=4.0f;
  58. float deform_cyl3=0.0f,deform_cyl_val3=0.005f,deform_cyl_maxval3=4.0f;
  59. // Scroll Text
  60. float ScrollText = w_height;
  61. bool scrollt = true;
  62. bool fostdone = false;
  63. bool InitFost = true;
  64. float rotateFost = 10.0f;
  65. bool directfost = true;
  66. float FostWait = 0.0;
  67. bool PauseText = false;
  68. float PauseWait = 0.0;
  69. // the end..
  70. bool AllIsStoped = false;
  71. //**************************//
  72. // Fonction                 //
  73. //**************************//
  74. //#include "matrice.cpp"
  75. // ************************ //
  76. // SOUND DEVICE             //
  77. // ************************ //
  78. Naskel3D::Naskel3D() 
  79. {
  80. cyl=new Cylindre(22,50,40.0f,4.0f);
  81. tunnel=new Cylindre(22,50,100.0f,6.0f);
  82. tunnel2=new Cylindre(22,50,100.0f,5.5f);
  83. TotalF = 0;
  84. Scene1Blend = 0;
  85. g_RotateX = 0;
  86. g_RotateY = 0;
  87. g_RotateZ = 0;
  88. g_Viewport = 512;
  89. n3dhWnd = g_hWnd;
  90. TotalCube = 0;
  91. tf = 0;
  92. nf = 0;
  93. showFps = 0;
  94. speed = 40; /* speed is in frame/second */
  95. WaterMove = 0;
  96. WaterX = 0;
  97. WaterY = 0;
  98. WaterCubeX = -150.0f,
  99. WaterCubeY = -150.0f,
  100. WaterCubeZ = -150.0f;
  101. //WaterWait = (timeGetTime()*0.001f) - StartTime;
  102. //LaunchTime = WaterWait;
  103. WaterDone = false;
  104. BGalaxieMove1 = true;
  105. BGalaxieMove2 = false;
  106. TimeToExplode = false;
  107. ExplodeSpeed = 0.0;
  108. ExplodeRotate = 0;
  109. BExplode = true;
  110. //ThisScene0 = true; ThisScene1 = false; ThisScene2 = false; ThisScene3 = false;
  111. //ThisScene4 = false; ThisScene5 = false; ThisScene6 = false; ThisScene7 = false;
  112.  
  113. NScene[0].ThisScene = 1; NScene[0].FirstTimeScene = 1;
  114. for (int i=1;i<8;i++) {
  115. NScene[i].FirstTimeScene = 1;
  116. NScene[i].ThisScene = 0;
  117. }
  118. }
  119. Naskel3D::~Naskel3D() 
  120. {
  121. }
  122. void Naskel3D::DrawAllScene()
  123. {
  124. /* OK*/
  125. if (!AllIsStoped) {
  126. // Final Call for Render
  127. if (NScene[0].ThisScene) NextScene(0);
  128. else if (NScene[1].ThisScene) NextScene(1);
  129. else if (NScene[2].ThisScene) NextScene(2);
  130. else if (NScene[3].ThisScene) NextScene(3);
  131. else if (NScene[4].ThisScene) NextScene(4);
  132. else if (NScene[5].ThisScene) NextScene(5);
  133. else if (NScene[6].ThisScene) NextScene(6);
  134. else if (NScene[7].ThisScene) NextScene(7);
  135. else {
  136. mods2::Stop();
  137. mods2::Free();
  138. AllIsStoped= true;
  139. //SendMessage(g_hWnd,WM_DESTROY,NULL,NULL); // all is finished ready to stop..
  140. }
  141. } else {
  142. RenderScene(7);
  143. }
  144. /*
  145. OK */
  146. //RenderScene(7); // Unique Call For DEBUG ;)
  147. #ifdef __DEBUG
  148. glPushMatrix();
  149. //Reset();
  150. glColor3f(1, 1, 1);
  151. glDrawText(15, 45, "m_Z:%f",m_Z);
  152. glPopMatrix();
  153. #endif
  154. // Draw Naskel3D Logo
  155. glPushMatrix();
  156. Reset();
  157. glColor3f(1, 1, 1);
  158. DrawLogo();
  159. glPopMatrix();
  160. }
  161. void Naskel3D::InitAllScene()
  162. {
  163. glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
  164. glShadeModel(GL_SMOOTH); // Enable Smooth Shading
  165. glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background
  166. glClearDepth(1.0f); // Depth Buffer Setup
  167. glDepthFunc (GL_LEQUAL); // The Type Of Depth Testing (Less Or Equal)
  168. // glEnable(GL_DEPTH_TEST); // Enables Depth Testing
  169. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
  170. glBlendFunc(GL_SRC_ALPHA,GL_ONE); // Enable Blending
  171. // Shed.InitClock(); // Start the clock
  172. // Sky Plane
  173. InitSkyPlane(16, 100.0f, 250.0f, 3.0f, 3.0f, &SkyPlane1);
  174. InitSkyPlane(16, 100.0f, 150.0f, 3.0f, 3.0f, &SkyPlane2);
  175. // Load All Textures Here FIRST
  176. if (!ImageLoad(&texture0, "textures/sky3.jpg", NIMG_JPG, GL_LINEAR, GL_LINEAR)) Error("Cant load sky3.jpg, Exiting now.");
  177. if (!ImageLoad(&texstar, "textures/nebula.jpg", NIMG_JPG, GL_LINEAR, GL_LINEAR)) Error("Cant load star.jpg, Exiting now.");
  178. if (!ImageLoad(&texwater6, "textures/water006.jpg", NIMG_JPG, GL_LINEAR, GL_LINEAR)) Error("Cant water006 star.jpg, Exiting now.");
  179. if (!ImageLoad(&Sliding, "textures/Font.jpg", NIMG_JPG, GL_LINEAR, GL_LINEAR)) Error("Cant load Font.jpg, Exiting now.");
  180. if (!ImageLoad(&Moving, "textures/moving.jpg", NIMG_JPG, GL_LINEAR, GL_LINEAR)) Error("Cant load moving.jpg, Exiting now.");
  181. if (!ImageLoad(&Chrome, "textures/Reflect.jpg", NIMG_JPG, GL_LINEAR, GL_LINEAR)) Error("Cant load Reflect.jpg, Exiting now.");
  182. if (!ImageLoad(&FlyWhiteTex, "textures/white.jpg", NIMG_JPG, GL_LINEAR, GL_LINEAR)) Error("Cant load White.jpg, Exiting now.");
  183. if (!ImageLoad(&skydome, "textures/girl-clair.jpg", NIMG_JPG, GL_LINEAR, GL_LINEAR)) Error("Cant load skydome, Exiting now.");
  184. if (!ImageLoad(&Night, "textures/bluetunnel.jpg", NIMG_JPG, GL_LINEAR, GL_LINEAR)) Error("Cant load Night.jpg, Exiting now.");
  185. if (!ImageLoad(&Lava, "textures/firetunnel.jpg", NIMG_JPG, GL_LINEAR, GL_LINEAR)) Error("Cant load lava, Exiting now.");
  186. if (!ImageLoad(&LogoN, "textures/naskel.jpg", NIMG_JPG, GL_LINEAR, GL_LINEAR)) Error("Cant load TubeTex, Exiting now.");
  187. if (!ImageLoad(&F0sT, "textures/fost.jpg", NIMG_JPG, GL_LINEAR, GL_LINEAR)) Error("Cant load TubeTex, Exiting now.");
  188. if (!ImageLoad(&FlyTextFore, "textures/girl-clair.jpg", NIMG_JPG, GL_LINEAR, GL_LINEAR)) Error("Cant load FlyTextFore, Exiting now.");
  189. // First Font Creator (store the old font..)
  190. g_FontList3DID = CreateOpenGL3DFont("Arial", FONT_EXTRUDE, n3dhWnd);
  191. g_FontListSimpleID = CreateSimpleFont("Arial", FONT_HEIGHT, n3dhWnd);
  192. g_FontNaskel3DID = CreateSimpleFont("Impact", FONT_HEIGHT, n3dhWnd);
  193. InitScene(9);
  194. InitScene(8);
  195. InitScene(7);
  196. InitScene(6);
  197. InitScene(5);
  198. InitScene(4);
  199. InitScene(3); // Star
  200. InitScene(2);
  201. InitScene(1);
  202. #ifdef __WITH_SOUND // Ne DOIT ETRE CALL QUAND DERNIER !!
  203. // CylStart = GetTickCount(); 
  204. StartTime = timeGetTime()*0.001f;
  205. InitScene(0);
  206. // LaunchTime = Shed.GetTime();
  207. #endif
  208. }
  209. GLvoid Naskel3D::Enable_Fog() { glEnable(GL_FOG); }
  210. GLvoid Naskel3D::Disable_Fog() { glDisable(GL_FOG); }
  211. /*********************************************************************/
  212. // FOG END
  213. /*********************************************************************/
  214. // Loads:  BMP, EMF, GIF, ICO, JPG, WMF   
  215. int Naskel3D::BuildTexture(char *szPathName, NIMG_PTR image,GLfloat minfilter,GLfloat maxfilter) // Load Image And Convert To A Texture
  216. {
  217. HDC hdcTemp; // The DC To Hold Our Bitmap
  218. HBITMAP hbmpTemp; // Holds The Bitmap Temporarily
  219. IPicture *pPicture; // IPicture Interface
  220. OLECHAR wszPath[MAX_PATH+1]; // Full Path To Picture (WCHAR)
  221. char szPath[MAX_PATH+1]; // Full Path To Picture
  222. long lWidth; // Width In Logical Units
  223. long lHeight; // Height In Logical Units
  224. long lWidthPixels; // Width In Pixels
  225. long lHeightPixels; // Height In Pixels
  226. GLint glMaxTexDim ; // Holds Maximum Texture Size
  227. if (strstr(szPathName, "http://")) // If PathName Contains http:// Then...
  228. {
  229. strcpy(szPath, szPathName); // Append The PathName To szPath
  230. }
  231. else // Otherwise... We Are Loading From A File
  232. {
  233. GetCurrentDirectory(MAX_PATH, szPath); // Get Our Working Directory
  234. strcat(szPath, "\"); // Append "" After The Working Directory
  235. strcat(szPath, szPathName); // Append The PathName
  236. }
  237. MultiByteToWideChar(CP_ACP, 0, szPath, -1, wszPath, MAX_PATH); // Convert From ASCII To Unicode
  238. HRESULT hr = OleLoadPicturePath(wszPath, 0, 0, 0, IID_IPicture, (void**)&pPicture);
  239. if(FAILED(hr)) // If Loading Failed
  240. return FALSE; // Return False
  241. hdcTemp = CreateCompatibleDC(GetDC(0)); // Create The Windows Compatible Device Context
  242. if(!hdcTemp) // Did Creation Fail?
  243. {
  244. pPicture->Release(); // Decrements IPicture Reference Count
  245. return FALSE; // Return False (Failure)
  246. }
  247. glGetIntegerv(GL_MAX_TEXTURE_SIZE, &glMaxTexDim); // Get Maximum Texture Size Supported
  248. pPicture->get_Width(&lWidth); // Get IPicture Width (Convert To Pixels)
  249. lWidthPixels = MulDiv(lWidth, GetDeviceCaps(hdcTemp, LOGPIXELSX), 2540);
  250. pPicture->get_Height(&lHeight); // Get IPicture Height (Convert To Pixels)
  251. lHeightPixels = MulDiv(lHeight, GetDeviceCaps(hdcTemp, LOGPIXELSY), 2540);
  252. // Resize Image To Closest Power Of Two
  253. if (lWidthPixels <= glMaxTexDim) // Is Image Width Less Than Or Equal To Cards Limit
  254. lWidthPixels = 1 << (int)floor((log((double)lWidthPixels)/log(2.0f)) + 0.5f); 
  255. else  // Otherwise  Set Width To "Max Power Of Two" That The Card Can Handle
  256. lWidthPixels = 1 << (int)floor((log((double)glMaxTexDim)/log(2.0f)) + 0.5f);
  257.  
  258. if (lHeightPixels <= glMaxTexDim) // Is Image Height Greater Than Cards Limit
  259. lHeightPixels = 1 << (int)floor((log((double)lHeightPixels)/log(2.0f)) + 0.5f);
  260. else  // Otherwise  Set Height To "Max Power Of Two" That The Card Can Handle
  261. lHeightPixels = 1 << (int)floor((log((double)glMaxTexDim)/log(2.0f)) + 0.5f);
  262. // Create A Temporary Bitmap
  263. BITMAPINFO bi = {0}; // The Type Of Bitmap We Request
  264. //DWORD *pBits = 0;
  265. image->data = 0; // Pointer To The Bitmap Bits
  266. bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); // Set Structure Size
  267. bi.bmiHeader.biBitCount = 32; // 32 Bit
  268. bi.bmiHeader.biWidth = lWidthPixels; // Power Of Two Width
  269. bi.bmiHeader.biHeight = lHeightPixels; // Make Image Top Up (Positive Y-Axis)
  270. bi.bmiHeader.biCompression = BI_RGB; // RGB Encoding
  271. bi.bmiHeader.biPlanes = 1; // 1 Bitplane
  272. // Creating A Bitmap This Way Allows Us To Specify Color Depth And Gives Us Imediate Access To The Bits
  273. hbmpTemp = CreateDIBSection(hdcTemp, &bi, DIB_RGB_COLORS, (void**)&image->data, 0, 0);
  274. if(!hbmpTemp) // Did Creation Fail?
  275. {
  276. DeleteDC(hdcTemp); // Delete The Device Context
  277. pPicture->Release(); // Decrements IPicture Reference Count
  278. return FALSE; // Return False (Failure)
  279. }
  280. SelectObject(hdcTemp, hbmpTemp); // Select Handle To Our Temp DC And Our Temp Bitmap Object
  281. // Render The IPicture On To The Bitmap
  282. pPicture->Render(hdcTemp, 0, 0, lWidthPixels, lHeightPixels, 0, lHeight, lWidth, -lHeight, 0);
  283. // Convert From BGR To RGB Format And Add An Alpha Value Of 255
  284. for(long i = 0; i < lWidthPixels * lHeightPixels; i++)
  285. // Loop Through All Of The Pixels
  286. {
  287. BYTE* pPixel = (BYTE*)(&image->data[i]); // Grab The Current Pixel
  288. BYTE  temp = pPixel[0]; // Store 1st Color In Temp Variable (Blue)
  289. pPixel[0] = pPixel[2]; // Move Red Value To Correct Position (1st)
  290. pPixel[2] = temp; // Move Temp Value To Correct Blue Position (3rd)
  291. pPixel[3] = 255; // Set The Alpha Value To 255
  292. }
  293. glGenTextures(1, &image->ID); // Create The Texture
  294.  
  295.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  296.  
  297. // Typical Texture Generation Using Data From The Bitmap
  298. glBindTexture(GL_TEXTURE_2D, image->ID);
  299. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,minfilter);
  300. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,maxfilter);
  301. // gluBuild2DMipmaps(GL_TEXTURE_2D, 3, lWidthPixels, lHeightPixels, GL_RGB, GL_UNSIGNED_BYTE, image->data);
  302. glTexImage2D(GL_TEXTURE_2D, 0, 3, lWidthPixels, lHeightPixels, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->data);
  303. DeleteObject(hbmpTemp); // Delete The Object
  304. DeleteDC(hdcTemp); // Delete The Device Context
  305. pPicture->Release();
  306. free(image->data);
  307. return TRUE; // Return True (All Good)
  308. }
  309. bool Naskel3D::ImageLoad(NIMG_PTR image, char* filename,int type,GLfloat minfilter,GLfloat maxfilter)
  310. {
  311. unsigned  int zip_size;
  312. unsigned  char *zip_buf;
  313. char tmp[] = "data/t.ntmp";
  314. unsigned char *pJpeg = NULL;
  315. bool Stat = false;
  316. // PAK_FILE *************************************** PAK_FILE
  317. zip_buf = unzip::open("data/data.npk", filename, &zip_size);
  318. FILE *f = fopen(tmp, "wb");
  319. fwrite( zip_buf, sizeof(char), zip_size, f );
  320. fflush(f);
  321. fclose(f);
  322. #ifndef _DEBUG
  323. // dbgdel.cpp error ? 
  324. delete [] zip_buf;// Memory leeeeeeeeekkkkkkk :o)
  325. #endif
  326. // PAK_FILE *************************************** PAK_FILE End
  327. if (BuildTexture(tmp, image, minfilter, maxfilter)) Stat = true;
  328. remove (tmp);
  329. return Stat;
  330. }
  331. //******************************************//
  332. // Sky Plane                                //
  333. //******************************************//
  334. void Naskel3D::InitSkyPlane(int divisions, float PlanetRadius, float AtmosphereRadius, 
  335.   float hTile, float vTile, DOME_PTR dome)
  336. {
  337. // Make sure our vertex array is clear
  338. if (dome->PlaneVertices) 
  339. {
  340. #ifndef _DEBUG
  341. delete dome->PlaneVertices;
  342. dome->PlaneVertices = NULL;
  343. #endif
  344. }
  345. // Make sure our index array is clear
  346. if (dome->Indices)
  347. {
  348. #ifndef _DEBUG
  349. delete dome->Indices;
  350. dome->Indices = NULL;
  351. #endif
  352. }
  353. // Set the number of divisions into a valid range
  354. int divs = divisions;
  355. if (divisions < 1) 
  356. divs = 1;
  357. if (divisions > 512) 
  358. divs = 512; 
  359. dome->pRadius = PlanetRadius;
  360. // Initialize the Vertex and Indices arrays
  361. dome->NumPlaneVertices = (divs + 1) * (divs + 1);   // 1 division would give 4 verts
  362. dome->NumIndices  = divs * divs * 2 * 3;       // 1 division would give 6 indices for 2 tris
  363. dome->PlaneVertices = new VERTEX[dome->NumPlaneVertices];
  364. ZeroMemory(dome->PlaneVertices, sizeof(VERTEX));
  365. dome->Indices = new WORD[dome->NumIndices];
  366. ZeroMemory(dome->Indices, sizeof(WORD)*dome->NumIndices);
  367. // Calculate some values we will need
  368. float plane_size = 2.0f * (float)sqrt((SQR(AtmosphereRadius)-SQR(PlanetRadius)));
  369. float delta = plane_size/(float)divs;
  370. float tex_delta = 2.0f/(float)divs;
  371. // Variables we'll use during the dome's generation
  372. float x_dist   = 0.0f;
  373. float z_dist   = 0.0f;
  374. float x_height = 0.0f;
  375. float z_height = 0.0f;
  376. float height = 0.0f;
  377. int count = 0;
  378. VERTEX SV; // temporary vertex
  379. for (int i=0;i <= divs;i++)
  380. {
  381.     for (int j=0; j <= divs; j++)
  382. {
  383. x_dist = (-0.5f * plane_size) + ((float)j*delta);
  384. z_dist = (-0.5f * plane_size) + ((float)i*delta);
  385.     x_height = (x_dist*x_dist) / AtmosphereRadius;
  386. z_height = (z_dist*z_dist) / AtmosphereRadius;
  387. height = x_height + z_height;
  388. SV.x = x_dist;
  389. SV.y = 0.0f - height;
  390. SV.z = z_dist;
  391. // Calculate the texture coordinates
  392. SV.u = hTile*((float)j * tex_delta*0.5f);
  393. SV.v = vTile*(1.0f - (float)i * tex_delta*0.5f);
  394. dome->PlaneVertices[i*(divs+1)+j] = SV;
  395. }
  396. }
  397. // Calculate the indices
  398. int index = 0;
  399. for (i=0; i < divs;i++)
  400. {
  401. for (int j=0; j < divs; j++)
  402. {
  403. int startvert = (i*(divs+1) + j);
  404.     // tri 1
  405. dome->Indices[index++] = startvert;
  406. dome->Indices[index++] = startvert+1;
  407. dome->Indices[index++] = startvert+divs+1;
  408. // tri 2
  409. dome->Indices[index++] = startvert+1;
  410. dome->Indices[index++] = startvert+divs+2;
  411. dome->Indices[index++] = startvert+divs+1;
  412. }
  413. }
  414. }
  415. void Naskel3D::RenderSkyPlane(DOME dome)
  416. {
  417. glBegin(GL_TRIANGLES);
  418. for (int i=0; i < dome.NumIndices; i++)
  419. {
  420. glColor3f(1.0f, 1.0f, 1.0f);
  421. glTexCoord2f(dome.PlaneVertices[dome.Indices[i]].u, dome.PlaneVertices[dome.Indices[i]].v);
  422. glVertex3f(dome.PlaneVertices[dome.Indices[i]].x, dome.PlaneVertices[dome.Indices[i]].y, dome.PlaneVertices[dome.Indices[i]].z);
  423. }
  424. glEnd();
  425. }
  426. void Naskel3D::ReleaseSkyPlane(DOME dome)
  427. {
  428. if (dome.PlaneVertices) 
  429. {
  430. #ifndef _DEBUG
  431. delete dome.PlaneVertices;
  432. dome.PlaneVertices = NULL;
  433. #endif
  434. }
  435. if (dome.Indices)
  436. {
  437. #ifndef _DEBUG
  438. // dbgdel.cpp error ? 
  439. delete dome.Indices; // Memory leeeeeeeeekkkkkkk :o)
  440. #endif
  441. dome.Indices = NULL;
  442. }
  443. }
  444. void Naskel3D::DrawBackgrnd(NIMG image)
  445. {
  446. glPushMatrix();
  447. glTranslatef(0.0f,0.0f,-10.0f);
  448. glEnable (GL_TEXTURE_2D);
  449. glBindTexture(GL_TEXTURE_2D, image.ID);
  450. glBegin(GL_QUADS); // Front Face
  451. glTexCoord2f(0.0f, 0.0f); glVertex3f(-9.0f, -8.0f,  -1.0f); // Bottom Left Of The Texture and Quad
  452. glTexCoord2f(1.0f, 0.0f); glVertex3f( 9.0f, -8.0f,  -1.0f); // Bottom Right Of The Texture and Quad
  453. glTexCoord2f(1.0f, 1.0f); glVertex3f( 9.0f,  8.0f,  -1.0f); // Top Right Of The Texture and Quad
  454. glTexCoord2f(0.0f, 1.0f); glVertex3f(-9.0f,  8.0f,  -1.0f); // Top Left Of The Texture and Quad
  455. glEnd();
  456. glDisable (GL_TEXTURE_2D);
  457. glPopMatrix();
  458. }
  459. // Create a cube with nice color...
  460. void Naskel3D::CreateCube(float x, float y, float z, float radius)
  461. {
  462. // Here we create 6 QUADS (Rectangles) to form a cube
  463. // With the passed in radius, we determine the width and height of the cube
  464. // You will notice, I add some color at each vertice to make it more interesting
  465. glPushMatrix();
  466. glBegin(GL_QUADS);
  467. // These vertices create the Back Side
  468. glColor3ub(0, 0, 255);   glVertex3f(x, y, z);
  469. glColor3ub(255, 0, 255); glVertex3f(x, y + radius, z);
  470. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z); 
  471. glColor3ub(0, 255, 255); glVertex3f(x + radius, y, z);
  472. // These vertices create the Front Side
  473. glColor3ub(0, 0, 255);   glVertex3f(x, y, z + radius);
  474. glColor3ub(255, 0, 255); glVertex3f(x, y + radius, z + radius);
  475. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z + radius); 
  476. glColor3ub(0, 255, 255); glVertex3f(x + radius, y, z + radius);
  477. // These vertices create the Bottom Face
  478. glColor3ub(0, 0, 255);   glVertex3f(x, y, z);
  479. glColor3ub(255, 0, 255); glVertex3f(x, y, z + radius);
  480. glColor3ub(0, 255, 255); glVertex3f(x + radius, y, z + radius); 
  481. glColor3ub(0, 255, 255); glVertex3f(x + radius, y, z);
  482. // These vertices create the Top Face
  483. glColor3ub(0, 0, 255);   glVertex3f(x, y + radius, z);
  484. glColor3ub(255, 0, 255); glVertex3f(x, y + radius, z + radius);
  485. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z + radius); 
  486. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z);
  487. // These vertices create the Left Face
  488. glColor3ub(0, 0, 255);   glVertex3f(x, y, z);
  489. glColor3ub(255, 0, 255); glVertex3f(x, y, z + radius);
  490. glColor3ub(0, 255, 255); glVertex3f(x, y + radius, z + radius); 
  491. glColor3ub(0, 255, 255); glVertex3f(x, y + radius, z);
  492. // These vertices create the Right Face
  493. glColor3ub(0, 0, 255);   glVertex3f(x + radius, y, z);
  494. glColor3ub(255, 0, 255); glVertex3f(x + radius, y, z + radius);
  495. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z + radius); 
  496. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z);
  497. glEnd();
  498. glPopMatrix();
  499. }
  500. void Naskel3D::RotateMultiCube(int list, int rotate)
  501. {
  502. glPushMatrix();
  503. float x = PosCube[list][0], y = PosCube[list][1], z =PosCube[list][2];
  504. if (rotate == 0) {
  505. glRotatef(m_fAngle, x, y, z);
  506. glRotatef(m_fAngle, x, y, z);
  507. glRotatef(m_fAngle, x, y, z);
  508. } else {
  509. glRotatef(-m_fAngle, x, y, z);
  510. glRotatef(-m_fAngle, x, y, z);
  511. glRotatef(-m_fAngle, x, y, z);
  512. }
  513. glCallList(ListSceneCube[list]);
  514. glPopMatrix();
  515. }
  516. void Naskel3D::ExplodeMultiCube(int list)
  517. {
  518. glPushMatrix();
  519.             
  520. switch(ExplodeRotate) {
  521. case 0: glTranslatef(ExplodeSpeed,0.0f,0.0f); break;
  522. case 1: glTranslatef(0.0f,ExplodeSpeed*2,0.0f); break;
  523. case 2: glTranslatef(0.0f,0.0f,ExplodeSpeed*3); break;
  524. case 3: glTranslatef(-ExplodeSpeed,0.0f,0.0f); break;
  525. case 4: glTranslatef(0.0f,-ExplodeSpeed*2,0.0f); break;
  526. case 5: glTranslatef(0.0f,0.0f,-ExplodeSpeed*3); break;
  527. }
  528. if (BExplode)  {
  529. ExplodeRotate++;
  530. if (ExplodeRotate==5)
  531. BExplode = false; 
  532. } else {
  533. ExplodeRotate--;
  534. if (ExplodeRotate==0)
  535. BExplode = true; 
  536. }
  537. ExplodeSpeed+=0.00001f;
  538. glCallList(ListSceneCube[list]);
  539. glPopMatrix();
  540. }
  541. void Naskel3D::CreateMultiCube(float x, float y, float z, int list)
  542. {
  543. ListSceneCube[list] = glGenLists(list);
  544. glNewList(ListSceneCube[list],GL_COMPILE);
  545. glBegin(GL_QUADS);
  546. float radius = 0.04f;
  547. TotalCube++;
  548. // These vertices create the Back Side
  549. glColor3ub(0, 0, 255);   glVertex3f(x, y, z);
  550. glColor3ub(255, 0, 255); glVertex3f(x, y + radius, z);
  551. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z); 
  552. glColor3ub(0, 255, 255); glVertex3f(x + radius, y, z);
  553. // These vertices create the Front Side
  554. glColor3ub(0, 0, 255);   glVertex3f(x, y, z + radius);
  555. glColor3ub(255, 0, 255); glVertex3f(x, y + radius, z + radius);
  556. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z + radius); 
  557. glColor3ub(0, 255, 255); glVertex3f(x + radius, y, z + radius);
  558. // These vertices create the Bottom Face
  559. glColor3ub(0, 0, 255);   glVertex3f(x, y, z);
  560. glColor3ub(255, 0, 255); glVertex3f(x, y, z + radius);
  561. glColor3ub(0, 255, 255); glVertex3f(x + radius, y, z + radius); 
  562. glColor3ub(0, 255, 255); glVertex3f(x + radius, y, z);
  563. // These vertices create the Top Face
  564. glColor3ub(0, 0, 255);   glVertex3f(x, y + radius, z);
  565. glColor3ub(255, 0, 255); glVertex3f(x, y + radius, z + radius);
  566. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z + radius); 
  567. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z);
  568. // These vertices create the Left Face
  569. glColor3ub(0, 0, 255);   glVertex3f(x, y, z);
  570. glColor3ub(255, 0, 255); glVertex3f(x, y, z + radius);
  571. glColor3ub(0, 255, 255); glVertex3f(x, y + radius, z + radius); 
  572. glColor3ub(0, 255, 255); glVertex3f(x, y + radius, z);
  573. // These vertices create the Right Face
  574. glColor3ub(0, 0, 255);   glVertex3f(x + radius, y, z);
  575. glColor3ub(255, 0, 255); glVertex3f(x + radius, y, z + radius);
  576. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z + radius); 
  577. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z);
  578. glEnd();
  579. glEndList();
  580. }
  581. UINT Naskel3D::CreateOpenGL3DFont(LPSTR strFontName, float extrude, HWND m_hWnd)
  582. {
  583. UINT fontListID = 0;
  584. HFONT hFont;
  585. fontListID = glGenLists(MAX_CHARS);
  586. hFont = CreateFont( 0, 0, 0, 0, FW_BOLD, FALSE, FALSE,
  587. FALSE, ANSI_CHARSET, OUT_TT_PRECIS,
  588. CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
  589. FF_DONTCARE|DEFAULT_PITCH,  strFontName);
  590. g_hDC = ::GetDC(m_hWnd);
  591. hOldFont = (HFONT)SelectObject(g_hDC, hFont);
  592. wglUseFontOutlines( g_hDC, 0, MAX_CHARS - 1,
  593. fontListID, 0, 0.4f, WGL_FONT_POLYGONS,
  594. g_GlyphInfo);
  595. return fontListID;
  596. }
  597. UINT Naskel3D::CreateSimpleFont(LPSTR strFontName, int height, HWND m_hWnd) // Build Our Bitmap Font
  598. {
  599. UINT fontListID = 1; // This will hold the base ID for our display list
  600. HFONT hFont; // This will store the handle to our font
  601. fontListID = glGenLists(MAX_CHARS); // Generate the list for the font
  602. g_hDC = ::GetDC(m_hWnd);
  603. hFont = CreateFont(height, 0, 0, 0, FW_BOLD, FALSE,
  604. FALSE, FALSE, ANSI_CHARSET, OUT_TT_PRECIS,
  605. CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
  606. FF_DONTCARE|DEFAULT_PITCH, strFontName);
  607. wglUseFontBitmaps(g_hDC, 0, MAX_CHARS - 1, fontListID);
  608. return fontListID;
  609. }
  610. void Naskel3D::PositionText( int x, int y )
  611. {
  612. glPushAttrib( GL_TRANSFORM_BIT | GL_VIEWPORT_BIT );
  613. glMatrixMode( GL_PROJECTION );
  614. glPushMatrix();
  615. glLoadIdentity();
  616. glMatrixMode( GL_MODELVIEW );
  617. glPushMatrix();
  618. glLoadIdentity();
  619. y = w_height - FONT_HEIGHT - y;
  620. glViewport( x - 1, y - 1, 0, 0 );
  621. glRasterPos4f( 0, 0, 0, 1 );
  622. glPopMatrix();
  623. glMatrixMode( GL_PROJECTION );
  624. glPopMatrix();
  625. glPopAttrib();
  626. }
  627. void Naskel3D::glDrawText(int x, int y, const char *strString, ...)
  628. {
  629. char strText[256];
  630. va_list argumentPtr;
  631. if (strString == NULL) return;
  632. va_start(argumentPtr, strString);
  633. vsprintf(strText, strString, argumentPtr);
  634. va_end(argumentPtr);
  635. PositionText(x, y);
  636. glPushAttrib(GL_LIST_BIT);
  637. glListBase(g_FontListSimpleID);
  638. glCallLists(strlen(strText), GL_UNSIGNED_BYTE, strText);
  639. glPopAttrib();
  640. }
  641. void Naskel3D::DrawLogo()
  642. {
  643. char Text[]="Naskel3D";
  644. int len = strlen(Text);
  645. PositionText(20, w_height-50);
  646. glPushAttrib(GL_LIST_BIT);
  647. glListBase(g_FontNaskel3DID);
  648. glCallLists(len, GL_UNSIGNED_BYTE, Text);
  649. glPopAttrib();
  650. }
  651. void Naskel3D::glDraw3DText(const char *strString, ...)
  652. {
  653. char strText[256];
  654. va_list argumentPtr;
  655. float unitLength=0.0f;
  656. if (strString == NULL)
  657. return;
  658. va_start(argumentPtr, strString);
  659. vsprintf(strText, strString, argumentPtr);
  660. va_end(argumentPtr);
  661. for (int i=0; i < (int)strlen(strText); i++)
  662. unitLength += g_GlyphInfo[strText[i]].gmfCellIncX;
  663. glTranslatef(0.0f - (unitLength / 2), 0.0f, 0.0f);
  664. glPushAttrib(GL_LIST_BIT);
  665. glListBase(g_FontList3DID);
  666. glCallLists(strlen(strText), GL_UNSIGNED_BYTE, strText);
  667. glPopAttrib();
  668. }
  669. void Naskel3D::Destroy3DFont()
  670. {
  671. glDeleteLists(g_FontList3DID, MAX_CHARS);
  672. glDeleteLists(g_FontListSimpleID, MAX_CHARS);
  673. SelectObject(g_hDC, hOldFont);
  674. }
  675. void Naskel3D::InitScene(int part)
  676. {
  677. switch(part) {
  678. case 0: {
  679. // Sound...
  680. unsigned  char *file;
  681. unsigned  int size;
  682. file = unzip::open("data/data.npk", "sounds/REXLIL.XM", &size);
  683. // storing to an scratch file..... CHANGE ME
  684. FILE *f = fopen("data/s.ntmp", "wb");
  685. fwrite( file, sizeof(char), size, f );
  686. fflush(f);
  687. fclose(f); 
  688. #ifndef _DEBUG
  689. // dbgdel.cpp error ? 
  690. delete [] file; delete [] f; // Memory leeeeeeeeekkkkkkk :o)
  691. #endif
  692. if (!mods2::Init()) Error("Cant load the sound, Exiting now."); // Load and play the song...
  693. if (!mods2::load("data/s.ntmp")) Error("Cant load the sound, Exiting now.");
  694. remove ("data/s.ntmp"); // All is in memory i can remove the temp file now..
  695. // ModPlayer End
  696. }
  697. break;
  698. case 1: {  // Init SceneCube
  699. int i = 0; float x,y,z;
  700. for (z=-0.5f;z<0.5f;z+=0.1f) {
  701.  for (y=-0.5f;y<0.5f;y+=0.1f)
  702.   for (x=-0.5f;x<0.5f;x+=0.08) {
  703.    CreateMultiCube(x,y,z,i);
  704.     // store the x,y,z pos of the cube
  705.    PosCube[i][0]=x; PosCube[i][1]=y; PosCube[i][2]=z;
  706.    i++;
  707.   }
  708. }
  709. }
  710. break;
  711. case 2: Star::InitStars(); sliding::Init(); ogl::Init(); break;
  712. }
  713. }
  714. void Naskel3D::NextScene(int n)
  715. {
  716. float ActuTime = (timeGetTime()*0.001f) - StartTime; // get the actual time
  717. if (NScene[n].FirstTimeScene) { // launch the timer
  718. NScene[n].FirstTimeScene = 0;
  719. NScene[n].SceneTime = (TIMEPERSCENE+ActuTime)-0.15;// = TIMEPERSCENE;
  720. }
  721. if (ActuTime<=NScene[n].SceneTime) { // do the current anim
  722. RenderScene(n);
  723. } else { // ready to change the scene
  724. NScene[n+1].ThisScene=1;
  725. NScene[n].ThisScene=0;
  726. }
  727. #ifdef __DEBUG
  728. char tmp[255],tmp1[255],tmp2[255],tmp3[255];
  729. sprintf(tmp, "GL_BLEND: %d - GL_CULL_FACE: %d - GL_DEPTH_TEST: %d - GL_TEXTURE_2D: %d - GL_NORMALIZE: %d",
  730. (glIsEnabled(GL_BLEND)) ? 1 : 0,
  731. (glIsEnabled(GL_CULL_FACE)) ? 1 : 0,
  732. (glIsEnabled(GL_DEPTH_TEST)) ? 1 : 0,
  733. (glIsEnabled(GL_TEXTURE_2D)) ? 1 : 0,
  734. (glIsEnabled(GL_NORMALIZE)) ? 1 : 0);
  735. sprintf(tmp1, "GL_TEXTURE_GEN_S: %d - GL_TEXTURE_GEN_T: %d - GL_STENCIL_TEST: %d - GL_POLYGON_SMOOTH: %d",
  736. (glIsEnabled(GL_TEXTURE_GEN_S)) ? 1 : 0,
  737. (glIsEnabled(GL_TEXTURE_GEN_T)) ? 1 : 0,
  738. (glIsEnabled(GL_STENCIL_TEST)) ? 1 : 0,
  739. (glIsEnabled(GL_POLYGON_SMOOTH))? 1 : 0);
  740. sprintf(tmp2, "GL_SMOOTH: %d - GL_LIGHTING: %d - GL_LIGHT0: %d - GL_LIGHT1: %d - GL_COLOR_MATERIAL: %d",
  741. (glIsEnabled(GL_SMOOTH)) ? 1 : 0,
  742. (glIsEnabled(GL_LIGHTING)) ? 1 : 0,
  743. (glIsEnabled(GL_LIGHT0)) ? 1 : 0,
  744. (glIsEnabled(GL_LIGHT1)) ? 1 : 0,
  745. (glIsEnabled(GL_COLOR_MATERIAL)) ? 1 : 0);
  746. sprintf(tmp3, "GL_ALPHA_TEST: %d - GL_SCISSOR_TEST: %d - GL_LINE_SMOOTH: %d",
  747. (glIsEnabled(GL_ALPHA_TEST)) ? 1 : 0,
  748. (glIsEnabled(GL_SCISSOR_TEST)) ? 1 : 0,
  749. (glIsEnabled(GL_LINE_SMOOTH)) ? 1 : 0
  750. );
  751. glDisable(GL_TEXTURE_2D);
  752. // Avance de la scene ... pratique pour le debug... :)
  753. // le timer n'est pas mis a jour !
  754. if (GotNextScene) {
  755. GotNextScene = false;
  756. NScene[n+1].ThisScene=1;
  757. NScene[n].ThisScene=0;
  758. }
  759. glColor3f(1, 1, 1);
  760. glDrawText(15, 25, "Scene %d  -  SceneTime: %f  -  ActuTime: %f", n+1, NScene[n].SceneTime, ActuTime);
  761. // On regarde les option d'ogl.. j'en ai marre d'avoir des probleme avec ca ;)
  762. glDrawText(15, 60, tmp);
  763. glDrawText(15, 76, tmp1);
  764. glDrawText(15, 88, tmp2);
  765. glDrawText(15, 100, tmp3);
  766. #endif
  767. }
  768. void Naskel3D::RenderScene(int part)
  769. {
  770. float ActuTime = (timeGetTime()*0.001f) - StartTime;
  771. switch(part) {
  772. case 0: {
  773. glPushMatrix();
  774. Reset();
  775. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  776. glLoadIdentity();
  777. glTranslatef(0.0f,0.0f,m_Z-FGalaxieMove);
  778. // First All scene move
  779. if (BGalaxieMove1) 
  780. if ((m_Z-FGalaxieMove)>= -5.29)
  781. FGalaxieMove+=0.005;
  782. // Draw the background
  783. DrawBackgrnd(texture0);
  784. // draw the star
  785. Star::vDraw();
  786. // call the multicube
  787. // first rotate...
  788. glRotatef(-m_fAngle, 0.0f, 1.0f, 0.0f);
  789. glRotatef(-m_fAngle, 0.0f, 0.0f, 1.0f);
  790. glRotatef(-m_fAngle+0.3f, 0.0f, 0.0f, 1.0f);
  791. int rotate = 0;
  792. // Si c le temps de finir, on explose tout ! ;)
  793. if (TimeToExplode!=true && ActuTime>23) {
  794. TimeToExplode=true;
  795. }
  796. if (ActuTime>28) // NScene[0].SceneTime)
  797. ExplodeSpeed*=ExplodeSpeed;// lol :)
  798. for (int i=0;i<=TotalCube;i++) {
  799. if (TimeToExplode) { 
  800. ExplodeMultiCube(i);
  801. } else {
  802. RotateMultiCube(i,rotate);
  803. if (rotate) rotate=0;
  804. else rotate=1;
  805. }
  806. }
  807. // call the normal cube and rotate a bit too ;)
  808. glRotatef(m_fAngle, 0.0f, 1.0f, 0.0f);
  809. glRotatef(m_fAngle, 0.0f, 0.0f, 1.0f);
  810. glRotatef(m_fAngle+0.3f, 0.0f, 0.0f, 1.0f);
  811. glEnable(GL_BLEND);
  812. glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  813. CreateCube(-0.9f, -0.9f, -0.9f, 1.9f);
  814. m_fAngle+= 0.8f;
  815. glPopMatrix();
  816. }
  817. break;
  818. case 4: {
  819. glPushMatrix();
  820. Reset();
  821. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  822. glLoadIdentity();
  823. glTranslatef(0.0f,0.0f,-12.6f);
  824. fly::Draw();
  825. if (TimeFly!=true && ActuTime>NScene[1].SceneTime-28) TimeFly=true;
  826. if (TimeFly) {
  827.    switch (FlyText) {
  828.       case 0: glDrawText(FlySlide, w_height-50,"a Demo"); if (FlySlide>=w_width-50) {FlyRotate=false; FlyText++;} break;
  829.       case 1: glDrawText(FlySlide, w_height-50,"Without a"); if (FlySlide>=w_width-50) {FlyRotate=false; FlyText++;} break;
  830.       case 2: glDrawText(FlySlide, w_height-50,"Girl is"); if (FlySlide>=w_width-50) {FlyRotate=false; FlyText++;} break;
  831.       case 3: {
  832.        // Rotate...
  833.        glPushMatrix();
  834. glRotatef(m_fAngle, 0.0f, 1.0f, 0.0f);
  835. glRotatef(m_fAngle, 0.0f, 0.0f, 1.0f);
  836. glRotatef(m_fAngle+0.3f, 0.0f, 0.0f, 1.0f);
  837. glDisable(GL_TEXTURE_2D);
  838. glDisable(GL_BLEND);
  839. glColor3f(255, 0, 0);
  840.        glDraw3DText("NOT a Demo ! :o)");
  841.        glEnable(GL_TEXTURE_2D);
  842.        glEnable(GL_BLEND);
  843.        m_fAngle+=0.3f;
  844.        glPopMatrix();
  845.       
  846.        // fade to white
  847. if (ActuTime>57.0) {
  848. glPushMatrix();
  849. float C; // color...
  850. glTranslatef(0.0, 0.0, 13.2);
  851. glBindTexture(GL_TEXTURE_2D, FlyWhiteTex.ID);
  852. C =(ActuTime -10.8)/100;
  853. if (C>1) C =1;
  854. if (ActuTime>57.7)
  855.          C = 10.8 - ActuTime/100;
  856. glBegin(GL_QUADS);
  857.     glTexCoord2f(0, 0);  glVertex3f(-2, -2, 0);
  858.     glTexCoord2f(1, 0);  glVertex3f( 2, -2, 0);
  859.     glTexCoord2f(1, 1);  glVertex3f( 2,  2, 0);
  860.     glTexCoord2f(0, 1);  glVertex3f(-2,  2, 0);
  861. glEnd();
  862. glPopMatrix();
  863. }//58.082588
  864.       }
  865.       break;
  866.       }
  867.    if (FlySlide<=100) {FlyRotate=true;}
  868.    if (FlyRotate) FlySlide+= 4.0f;
  869.    else FlySlide-= 4.0f;
  870. }
  871. glPopMatrix();
  872. }
  873. break;
  874. case 2: { // Water
  875. glPushMatrix();
  876. Reset();
  877. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  878. glLoadIdentity();
  879. if (WaterResetPers) {
  880. water::Init(texwater);
  881. WaterResetPers = false;
  882. }
  883. float X=WaterCubeX, Y=WaterCubeY, Z=WaterCubeZ;
  884. glPushMatrix();
  885. // Only one time per 2 sec.
  886. if (!WaterDone) {
  887. WaterWait = ActuTime;
  888. if (WaterMove==0) {
  889. water::Move(WaterX,w_width/2);
  890. WaterMove = WATER_SPEED;
  891. if (WaterX>=w_height+20) { WaterX=0; WaterY=0;WaterDone = true;}
  892. WaterX+=20;
  893. } else WaterMove--;
  894. }
  895. if (WaterDone) { // Sleep 4 sec before relaunching anim
  896. if (ActuTime>=(WaterWait+1)) {
  897. WaterWait = ActuTime;
  898. WaterDone = false;
  899. }
  900. }
  901. water::Display();
  902. glPopMatrix();
  903. m_fAngle+=0.8f;
  904. glPopMatrix();
  905. }
  906. break;
  907. case 3: {
  908. glPushMatrix();
  909. Reset();
  910. // Moving
  911. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  912. glLoadIdentity();
  913. glTranslatef(0.0f,0.0f,0.7);
  914. moving::Draw();
  915. glPopMatrix();
  916. }
  917. break;
  918. case 1: { // Matrix
  919. glPushMatrix();
  920. Reset();
  921. glEnable(GL_NORMALIZE);
  922. sliding::ProcessLevel();
  923. // in memory of my Amiga ;o)
  924. glPopMatrix();
  925. }
  926. break;
  927. case 5: {
  928. glPushMatrix();
  929. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  930. glLoadIdentity();
  931. if (OglInit) {
  932. OglInit = false;
  933. Reset();
  934. ogl::Init();
  935. }
  936. glPushMatrix(); // Scene time: 
  937. glEnable(GL_LIGHTING);
  938. glEnable(GL_LIGHT0);
  939. glShadeModel(GL_SMOOTH);
  940. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  941. glEnable(GL_STENCIL_TEST);
  942. glLineWidth(1);
  943. if (RotateOgl1==true && ActuTime>148.01) {
  944. ogl::Reset();
  945. RotateOgl1 = false;
  946. RotateOgl2 = true;
  947. }
  948. if (RotateOgl2==true && ActuTime>152.06) {
  949. ogl::Reset();
  950. RotateOgl2 = false;
  951. RotateOgl3 = true;
  952. }
  953. if (RotateOgl3==true && ActuTime>156.09) {
  954. ogl::Reset();
  955. RotateOgl3 = false;
  956. }
  957. if ( RotateOgl3==false&& ActuTime>161) {
  958. // reset the last time
  959. ogl::Reset();
  960. glRotatef(m_fAngle, 0.0f, 1.0f, 0.0f);
  961. glRotatef(m_fAngle, 0.0f, 0.0f, 1.0f);
  962. glRotatef(m_fAngle+0.3f, 0.0f, 0.0f, 1.0f);
  963. }
  964. ogl::Draw();
  965. ogl::Animate();
  966. m_fAngle+=0.8f;
  967. Reset();
  968. glColor3f(1, 1, 1);
  969. glDrawText(60, 50," . - = M A d E  w I T h = - .");
  970. glPopMatrix();
  971. glPopMatrix();
  972. }
  973. break;
  974. case 6: {
  975. glPushMatrix();
  976. //Reset();
  977. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  978. glLoadIdentity();
  979. // Init
  980. if (CylInit)
  981. {
  982. glDisable(GL_LIGHTING);
  983. glDisable(GL_LIGHT0);
  984. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  985. glFogi(GL_FOG_MODE, GL_EXP); // Fog Mode
  986. glFogf(GL_FOG_DENSITY, 0.040f);
  987. glHint(GL_FOG_HINT, GL_DONT_CARE);
  988. glFogf(GL_FOG_START, 0.0f);
  989. glFogf(GL_FOG_END, 85.0f);
  990. CylInit = false;
  991. }
  992. //*** Le Cylindre ***//
  993. tunnel->Cylindre_Deforme(deform_cyl,deform_cyl2,deform_cyl3);
  994. tunnel2->Cylindre_Deforme(deform_cyl,deform_cyl2,deform_cyl3);
  995. CylX=CylX+0.3f;
  996. deform_cyl2+=(float)(0.5*deform_cyl_val2);
  997. deform_cyl3+=(float)(0.5*deform_cyl_val3);
  998. Enable_Fog();
  999. glPushMatrix();
  1000. glEnable(GL_TEXTURE_2D);
  1001. glDisable(GL_CULL_FACE);
  1002. glTranslatef(0.0f,0.0f,-25); //-30
  1003. glRotatef(CylX,0.0f,0.0f,1.0f);
  1004. glBindTexture(GL_TEXTURE_2D, Night.ID);
  1005. tunnel->Cylindre_affiche();
  1006. glPopMatrix();
  1007. glPushMatrix();
  1008. glEnable(GL_TEXTURE_2D);
  1009. glEnable(GL_BLEND);
  1010. glBindTexture(GL_TEXTURE_2D, Lava.ID);
  1011. glRotatef(-CylX,0.0f,0.0f,1.0f);
  1012. tunnel2->Cylindre_affiche();
  1013. glDisable(GL_BLEND);
  1014. glPopMatrix();
  1015. //*** Le Cylindre ***//
  1016. // Les ptits cube :)
  1017. glPushMatrix();
  1018. glDisable(GL_BLEND);
  1019. glDisable(GL_TEXTURE_2D);
  1020. glTranslatef(0.0f,0.0f,-AdvanceCube); //-30
  1021. glRotatef(-CylX*2,1.0f,0.0f,0.0f);
  1022. glRotatef(-CylX*2,0.0f,1.0f,0.0f);
  1023. glRotatef(-CylX*2,0.0f,0.0f,1.0f);
  1024. CreateCube(1.0,0.0,0.0,0.5);
  1025. glPushMatrix();
  1026. glTranslatef(1.0,0.0f,AdvanceCube/4); //-30
  1027. CreateCube(AdvanceCube/4,1.0,1.0,0.5);
  1028. glPopMatrix();
  1029. glPushMatrix();
  1030. glTranslatef(2.0,0.5f,AdvanceCube/4); //-30
  1031. CreateCube(0.0,1.0,0.0,0.5);
  1032. glPopMatrix();
  1033. glPopMatrix();
  1034. if (AdvanceCube>=64) AdvanceCube =0.0;
  1035. AdvanceCube +=0.5;
  1036. Disable_Fog();
  1037. glPopMatrix();
  1038. }
  1039. break;
  1040. case 7: { // Yeah Its the fianl :)
  1041. glPushMatrix();
  1042. Reset();
  1043. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  1044. glLoadIdentity();
  1045. if (SkyDomeInit) {
  1046. glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); 
  1047. glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); 
  1048. // Camera Pos
  1049. objCamera.PositionCamera(15.88, 8.20,87.90, 103.01, 25.61, 103.01, 0.00, 1.00, 0.00); 
  1050. SkyDomeInit = false;
  1051. }
  1052. SetMouse();
  1053. // Render the sky plane, that was a nice effect :)
  1054. glEnable(GL_TEXTURE_2D);
  1055. glBindTexture(GL_TEXTURE_2D, Night.ID);
  1056. glTranslatef(0.0f,SkyPlane1.pRadius,0);
  1057. glRotatef(-m_fAngle,0.0f, 1.0f, 0.0f);
  1058. RenderSkyPlane(SkyPlane1);
  1059. m_fAngle+=0.05f;
  1060. // -----
  1061. glPushMatrix();
  1062. Reset();
  1063. glDisable(GL_TEXTURE_2D);
  1064. int Espace = 20;
  1065. int H = ScrollText-100;
  1066. int W = 500;
  1067. glColor3f(1, 1, 1);
  1068. float s = (H+(Espace*11)); // la base a suivre :)
  1069. glDrawText(W, H+(Espace),"Elle est pour toi cette demo Kain ;)"); 
  1070. glDrawText(W, H+(Espace*2),"           --");
  1071. glDrawText(W, H+(Espace*3),"Thanx to :");
  1072. glDrawText(W, H+(Espace*4),"My small brain ;)");
  1073. glDrawText(W, H+(Espace*5),"All the coder over the world...");
  1074. glDrawText(W, H+(Espace*6),"Fmod for your nice lib");
  1075. glDrawText(W, H+(Espace*7),"Nvidia for your card, and your code");
  1076. glDrawText(W, H+(Espace*8),"Nehe, for your tutorial");
  1077. glDrawText(W, H+(Espace*9),"Jan Horn, We will never forget you...");
  1078. glDrawText(W, H+(Espace*11),"Big Greets to:");
  1079. if (scrollt == true && s<300) { // Affiche le logo de F0sT
  1080. LogoF0sT();
  1081. }
  1082. glDrawText(W, H+(Espace*25),"To all my friends");
  1083. glDrawText(W, H+(Espace*26),"Kikoo jeff ! :p");
  1084. glDrawText(W, H+(Espace*27),"My gf, kiss babe :p");
  1085. glDrawText(W, H+(Espace*28),"My son, you're the best baby on this world :o)");
  1086. glDrawText(W, H+(Espace*29),"----------------------------------------------");
  1087. glDrawText(W, H+(Espace*35),"And thank you for watching !");
  1088. // wait 7 sec and slide down...
  1089. if (PauseText) {
  1090. if (ActuTime>=(PauseWait+7))
  1091. LogoNaskel();
  1092. return;
  1093. }
  1094. if (s<-150) {
  1095. PauseWait = ActuTime;
  1096. PauseText = true;
  1097. }
  1098. glPopMatrix();
  1099. if (!fostdone) ScrollText-=2.0f;
  1100. glPopMatrix();
  1101. }
  1102. break;
  1103. }
  1104. }
  1105. void Naskel3D::LogoF0sT()
  1106. {
  1107. float ActuTime = (timeGetTime()*0.001f) - StartTime;
  1108. if (InitFost) {
  1109. rotateFost = -20.0;
  1110. InitFost = false;
  1111. fostdone = true;
  1112. }
  1113. glPushMatrix();
  1114. glLoadIdentity(); // reset..
  1115. glTranslatef(1.5,rotateFost+10.5f,-5.0f);
  1116. glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND);
  1117. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  1118. glColor3f(197/255.0f, 197/255.0f, 197/255.0f);
  1119. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  1120. glDraw3DText("F0sT");
  1121. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  1122. glColor3f(1, 1, 1);
  1123. glPopMatrix();
  1124. glPushMatrix();
  1125. glLoadIdentity(); // reset..
  1126. glTranslatef(rotateFost,0.0f,-50.0f);
  1127. glEnable (GL_TEXTURE_2D);
  1128. glBindTexture(GL_TEXTURE_2D, F0sT.ID);
  1129. glBegin(GL_QUADS); // Front Face
  1130. glTexCoord2f(0.0f, 0.0f); glVertex3f(-9.0f, -8.0f,  -1.0f); // Bottom Left Of The Texture and Quad
  1131. glTexCoord2f(1.0f, 0.0f); glVertex3f( 9.0f, -8.0f,  -1.0f); // Bottom Right Of The Texture and Quad
  1132. glTexCoord2f(1.0f, 1.0f); glVertex3f( 9.0f,  8.0f,  -1.0f); // Top Right Of The Texture and Quad
  1133. glTexCoord2f(0.0f, 1.0f); glVertex3f(-9.0f,  8.0f,  -1.0f); // Top Left Of The Texture and Quad
  1134. glEnd();
  1135. glDisable (GL_TEXTURE_2D);
  1136. glPopMatrix();
  1137. if (directfost) {
  1138. rotateFost +=0.05f;
  1139. if (rotateFost >-12) { FostWait = ActuTime; directfost =false; }
  1140. } else {
  1141. // wait 7 sec and slide down...
  1142. if (ActuTime>=(FostWait+7)) {
  1143. rotateFost -=0.05f;
  1144. if (rotateFost<-40) {
  1145. scrollt = false;
  1146. fostdone = false;
  1147. }
  1148. }
  1149. }
  1150. }
  1151. void Naskel3D::LogoNaskel()
  1152. {
  1153. float ActuTime = (timeGetTime()*0.001f) - StartTime;
  1154. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  1155. m_fAngle+=0.8;
  1156. glPushMatrix();
  1157. glLoadIdentity(); // reset..
  1158. glTranslatef(-4.0,0.0f,-30.0f);
  1159. glEnable (GL_TEXTURE_2D);
  1160. glBindTexture(GL_TEXTURE_2D, LogoN.ID);
  1161. glBegin(GL_QUADS); // Front Face
  1162. glTexCoord2f(0.0f, 0.0f); glVertex3f(-13.0f, -5.0f,  -1.0f); // Bottom Left Of The Texture and Quad
  1163. glTexCoord2f(1.0f, 0.0f); glVertex3f( 13.0f, -5.0f,  -1.0f); // Bottom Right Of The Texture and Quad
  1164. glTexCoord2f(1.0f, 1.0f); glVertex3f( 13.0f,  5.0f,  -1.0f); // Top Right Of The Texture and Quad
  1165. glTexCoord2f(0.0f, 1.0f); glVertex3f(-13.0f,  5.0f,  -1.0f); // Top Left Of The Texture and Quad
  1166. glEnd();
  1167. glDisable (GL_TEXTURE_2D);
  1168. glPopMatrix();
  1169. glPushMatrix();
  1170. glLoadIdentity(); // reset..
  1171. glTranslatef(1.8f,-0.5f,-4.5f);
  1172. glRotatef(-m_fAngle,0.0f, 1.0f, 0.0f);
  1173. glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND);
  1174. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  1175. glColor3f(68/255.0f, 30/255.0f, 235/255.0f);
  1176. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  1177. glDraw3DText("3D");
  1178. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  1179. glColor3f(1, 1, 1);
  1180. glPopMatrix();
  1181. glDrawText(w_width/2, w_height-150,"-( The End )-");
  1182. }
  1183. void Naskel3D::Reset()
  1184. {
  1185. glDisable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST);
  1186. glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_GEN_S);
  1187. glDisable(GL_TEXTURE_GEN_T); glDisable(GL_CULL_FACE);
  1188. Disable_Fog(); glDisable(GL_BLEND);
  1189. //glDisable(GL_NORMALIZE);
  1190. glDisable(GL_COLOR_MATERIAL); glDisable(GL_STENCIL_TEST);
  1191. glDisable(GL_LIGHT1); glDisable(GL_LIGHT0);
  1192. glDisable(GL_ALPHA_TEST); glDisable(GL_SCISSOR_TEST);
  1193. glDisable(GL_LINE_SMOOTH);
  1194. glClearColor(0.0,0.0,0.0,0.0); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  1195. }
  1196. void Naskel3D::SetMouse()
  1197. {
  1198. // look la pos.
  1199. objCamera.Update();
  1200. objCamera.Look();
  1201. }