vertexprog.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:15k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // vertexprog.cpp
  2. //
  3. // Copyright (C) 2001 Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #include <iostream>
  10. #include <fstream>
  11. #include <string>
  12. #include <celutil/util.h>
  13. #include "gl.h"
  14. #include "glext.h"
  15. #include "vertexprog.h"
  16. using namespace std;
  17. unsigned int vp::diffuse = 0;
  18. unsigned int vp::specular = 0;
  19. unsigned int vp::diffuseHaze = 0;
  20. unsigned int vp::diffuseBump = 0;
  21. unsigned int vp::diffuseBumpHaze = 0;
  22. unsigned int vp::shadowTexture = 0;
  23. unsigned int vp::multiShadow = 0;
  24. unsigned int vp::everything = 0;
  25. unsigned int vp::diffuseTexOffset = 0;
  26. unsigned int vp::ringIllum = 0;
  27. unsigned int vp::ringShadow = 0;
  28. unsigned int vp::cometTail = 0;
  29. unsigned int vp::nightLights = 0;
  30. unsigned int vp::glossMap = 0;
  31. unsigned int vp::perFragmentSpecular = 0;
  32. unsigned int vp::perFragmentSpecularAlpha = 0;
  33. unsigned int vp::diffuse_2light = 0;
  34. unsigned int vp::diffuseHaze_2light = 0;
  35. unsigned int vp::diffuseTexOffset_2light = 0;
  36. unsigned int vp::specular_2light = 0;
  37. unsigned int vp::nightLights_2light = 0;
  38. unsigned int vp::ellipticalGalaxy = 0;
  39. unsigned int vp::starDisc = 0;
  40. #ifdef HDR_COMPRESS
  41. unsigned int vp::diffuseBumpHDR = 0;
  42. unsigned int vp::diffuseBumpHazeHDR = 0;
  43. unsigned int vp::nightLightsHDR = 0;
  44. unsigned int vp::nightLights_2lightHDR = 0;
  45. #endif
  46. class VertexProcessorNV : public VertexProcessor
  47. {
  48.  public:
  49.     VertexProcessorNV();
  50.     virtual ~VertexProcessorNV();
  51.     virtual void enable();
  52.     virtual void disable();
  53.     virtual void use(unsigned int);
  54.     virtual void parameter(vp::Parameter, float, float, float, float);
  55.     virtual void parameter(vp::Parameter, const float*);
  56.     virtual void enableAttribArray(unsigned int);
  57.     virtual void disableAttribArray(unsigned int);
  58.     virtual void attribArray(unsigned int index,
  59.                              int size,
  60.                              GLenum type,
  61.                              unsigned int stride,
  62.                              const void* pointer);
  63. };
  64. class VertexProcessorARB : public VertexProcessor
  65. {
  66.  public:
  67.     VertexProcessorARB();
  68.     virtual ~VertexProcessorARB();
  69.     virtual void enable();
  70.     virtual void disable();
  71.     virtual void use(unsigned int);
  72.     virtual void parameter(vp::Parameter, float, float, float, float);
  73.     virtual void parameter(vp::Parameter, const float*);
  74.     virtual void enableAttribArray(unsigned int);
  75.     virtual void disableAttribArray(unsigned int);
  76.     virtual void attribArray(unsigned int index,
  77.                              int size,
  78.                              GLenum type,
  79.                              unsigned int stride,
  80.                              const void* pointer);
  81. };
  82. static string* ReadTextFromFile(const string& filename)
  83. {
  84.     ifstream textFile(filename.c_str(), ios::in);
  85.     if (!textFile.good())
  86.         return NULL;
  87.     string* s = new string();
  88.     char c;
  89.     while (textFile.get(c))
  90.         *s += c;
  91.     return s;
  92. }
  93. static bool LoadNvVertexProgram(const string& filename, unsigned int& id)
  94. {
  95.     cout << _("Loading NV vertex program: ") << filename << 'n';
  96.     string* source = ReadTextFromFile(filename);
  97.     if (source == NULL)
  98.     {
  99.         cout << _("Error loading NV vertex program: ") << filename << 'n';
  100.         return false;
  101.     }
  102.     glx::glGenProgramsNV(1, (GLuint*) &id);
  103.     glx::glLoadProgramNV(GL_VERTEX_PROGRAM_NV,
  104.                          id,
  105.                          source->length(),
  106.                          reinterpret_cast<const GLubyte*>(source->c_str()));
  107.     delete source;
  108.     GLenum err = glGetError();
  109.     if (err != GL_NO_ERROR)
  110.     {
  111.         GLint errPos = 0;
  112.         glGetIntegerv(GL_PROGRAM_ERROR_POSITION_NV, &errPos);
  113.         cout << _("Error in vertex program ") << filename <<
  114.             " @ " << errPos << 'n';
  115.         return false;
  116.     }
  117.     return true;
  118. }
  119. static int findLineNumber(const string& s, int index)
  120. {
  121.     if (index >= (int)s.length())
  122.         return -1;
  123.     int lineno = 1;
  124.     for (int i = 0; i < index; i++)
  125.     {
  126.         if (s[i] == 'n')
  127.             lineno++;
  128.     }
  129.     return lineno;
  130. }
  131. static bool LoadARBVertexProgram(const string& filename, unsigned int& id)
  132. {
  133.     cout << _("Loading ARB vertex program: ") << filename << 'n';
  134.     string* source = ReadTextFromFile(filename);
  135.     if (source == NULL)
  136.     {
  137.         cout << _("Error loading ARB vertex program: ") << filename << 'n';
  138.         return false;
  139.     }
  140.     glx::glGenProgramsARB(1, (GLuint*) &id);
  141.     if (glGetError() != GL_NO_ERROR)
  142.     {
  143.         delete source;
  144.         return false;
  145.     }
  146.     glx::glBindProgramARB(GL_VERTEX_PROGRAM_ARB, id);
  147.     glx::glProgramStringARB(GL_VERTEX_PROGRAM_ARB,
  148.                             GL_PROGRAM_FORMAT_ASCII_ARB,
  149.                             source->length(),
  150.                             reinterpret_cast<const GLubyte*>(source->c_str()));
  151.     GLenum err = glGetError();
  152.     if (err != GL_NO_ERROR)
  153.     {
  154.         GLint errPos = 0;
  155.         glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
  156.         const char* errMsg = (const char*) glGetString(GL_PROGRAM_ERROR_STRING_ARB);
  157.         if (errMsg == NULL)
  158.             errMsg = "Unknown error";
  159.         
  160.         cout << _("Error in vertex program ") << filename <<
  161.             _(", line ") << findLineNumber(*source, errPos) << ": " << errMsg << 'n';
  162.     }
  163.     delete source;
  164.     return err == GL_NO_ERROR;
  165. }
  166. // ARB path is preferred; NV vertex program path will eventually go away
  167. VertexProcessor* vp::initNV()
  168. {
  169.     cout << _("Initializing NV vertex programs . . .n");
  170.     if (!LoadNvVertexProgram("shaders/diffuse.vp", diffuse))
  171.         return NULL;
  172.     if (!LoadNvVertexProgram("shaders/specular.vp", specular))
  173.         return NULL;
  174.     if (!LoadNvVertexProgram("shaders/haze.vp", diffuseHaze))
  175.         return NULL;
  176.     if (!LoadNvVertexProgram("shaders/bumpdiffuse.vp", diffuseBump))
  177.         return NULL;
  178.     if (!LoadNvVertexProgram("shaders/bumphaze.vp", diffuseBumpHaze))
  179.         return NULL;
  180.     if (!LoadNvVertexProgram("shaders/shadowtex.vp", shadowTexture))
  181.         return NULL;
  182.     if (!LoadNvVertexProgram("shaders/diffuse_texoff.vp", diffuseTexOffset))
  183.         return NULL;
  184.     if (!LoadNvVertexProgram("shaders/rings.vp", ringIllum))
  185.         return NULL;
  186.     if (!LoadNvVertexProgram("shaders/ringshadow.vp", ringShadow))
  187.         return NULL;
  188.     if (!LoadNvVertexProgram("shaders/night.vp", nightLights))
  189.         return NULL;
  190.     // if (!LoadNvVertexProgram("shaders/comet.vp", cometTail))
  191.     //    return false;
  192.     // Two light shaders have only been written for the ARB vertex program path
  193.     // Fall back to the the one light versions.
  194.     diffuse_2light = diffuse;
  195.     diffuseHaze_2light = diffuseHaze;
  196.     diffuseTexOffset_2light = diffuseTexOffset;
  197.     specular_2light = specular;
  198.     everything = 0;
  199.     cout << _("All NV vertex programs loaded successfully.n");
  200.     glx::glTrackMatrixNV(GL_VERTEX_PROGRAM_NV,
  201.                          0, GL_MODELVIEW_PROJECTION_NV, GL_IDENTITY_NV);
  202.     glx::glTrackMatrixNV(GL_VERTEX_PROGRAM_NV,
  203.                          4, GL_MODELVIEW_PROJECTION_NV, GL_INVERSE_TRANSPOSE_NV);
  204.     return new VertexProcessorNV();
  205. }
  206. VertexProcessor* vp::initARB()
  207. {
  208.     cout << _("Initializing ARB vertex programs . . .n");
  209.     if (!LoadARBVertexProgram("shaders/diffuse_arb.vp", diffuse))
  210.         return NULL;
  211.     if (!LoadARBVertexProgram("shaders/specular_arb.vp", specular))
  212.         return NULL;
  213.     if (!LoadARBVertexProgram("shaders/haze_arb.vp", diffuseHaze))
  214.         return NULL;
  215.     if (!LoadARBVertexProgram("shaders/bumpdiffuse_arb.vp", diffuseBump))
  216.         return NULL;
  217.     if (!LoadARBVertexProgram("shaders/bumphaze_arb.vp", diffuseBumpHaze))
  218.         return NULL;
  219.     if (!LoadARBVertexProgram("shaders/shadowtex_arb.vp", shadowTexture))
  220.         return NULL;
  221.     if (!LoadARBVertexProgram("shaders/diffuse_texoff_arb.vp", diffuseTexOffset))
  222.         return NULL;
  223.     if (!LoadARBVertexProgram("shaders/rings_arb.vp", ringIllum))
  224.         return NULL;
  225.     if (!LoadARBVertexProgram("shaders/ringshadow_arb.vp", ringShadow))
  226.         return NULL;
  227.     if (!LoadARBVertexProgram("shaders/night_arb.vp", nightLights))
  228.         return NULL;
  229.     if (!LoadARBVertexProgram("shaders/glossmap_arb.vp", glossMap))
  230.         return NULL;
  231.     if (!LoadARBVertexProgram("shaders/diffuse2_arb.vp", diffuse_2light))
  232.         return NULL;
  233.     if (!LoadARBVertexProgram("shaders/haze2_arb.vp", diffuseHaze_2light))
  234.         return NULL;
  235.     if (!LoadARBVertexProgram("shaders/diffuse_texoff2_arb.vp", diffuseTexOffset_2light))
  236.         return NULL;
  237.     if (!LoadARBVertexProgram("shaders/specular2_arb.vp", specular_2light))
  238.         return NULL;
  239.     if (!LoadARBVertexProgram("shaders/night2_arb.vp", nightLights_2light))
  240.         return NULL;
  241.     if (!LoadARBVertexProgram("shaders/star_arb.vp", starDisc))
  242.         return NULL;
  243. #ifdef HDR_COMPRESS
  244.     if (!LoadARBVertexProgram("shaders/bumpdiffuse_arb_hdr.vp", diffuseBumpHDR))
  245.         return NULL;
  246.     if (!LoadARBVertexProgram("shaders/bumphaze_arb_hdr.vp", diffuseBumpHazeHDR))
  247.         return NULL;
  248.     if (!LoadARBVertexProgram("shaders/night_arb_hdr.vp", nightLightsHDR))
  249.         return NULL;
  250.     if (!LoadARBVertexProgram("shaders/night2_arb_hdr.vp", nightLights_2lightHDR))
  251.         return NULL;
  252. #endif
  253.     // Load vertex programs that are only required with fragment programs
  254.     if (ExtensionSupported("GL_NV_fragment_program") ||
  255.         ExtensionSupported("GL_ARB_fragment_program"))
  256.     {
  257.         if (!LoadARBVertexProgram("shaders/multishadow_arb.vp", multiShadow))
  258.             return NULL;
  259.         if (!LoadARBVertexProgram("shaders/texphong_arb.vp", perFragmentSpecular))
  260.             return NULL;
  261.         if (!LoadARBVertexProgram("shaders/texphong_alpha_arb.vp", perFragmentSpecularAlpha))
  262.             return NULL;
  263.     }
  264.     if (!LoadARBVertexProgram("shaders/ell_galaxy_arb.vp", ellipticalGalaxy))
  265.         return NULL;
  266.     cout << _("All ARB vertex programs loaded successfully.n");
  267.     return new VertexProcessorARB();
  268. }
  269. void vp::disable()
  270. {
  271.     glDisable(GL_VERTEX_PROGRAM_NV);
  272. }
  273. void vp::enable()
  274. {
  275.     glEnable(GL_VERTEX_PROGRAM_NV);
  276. }
  277. void vp::use(unsigned int prog)
  278. {
  279.     glx::glBindProgramNV(GL_VERTEX_PROGRAM_NV, prog);
  280. }
  281. void vp::parameter(unsigned int param, const Vec3f& v)
  282. {
  283.     glx::glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, param, v.x, v.y, v.z, 0.0f);
  284. }
  285.                             
  286. void vp::parameter(unsigned int param, const Point3f& p)
  287. {
  288.     glx::glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, param, p.x, p.y, p.z, 0.0f);
  289. }
  290. void vp::parameter(unsigned int param, const Color& c)
  291. {
  292.     glx::glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, param,
  293.                                 c.red(), c.green(), c.blue(), c.alpha());
  294. }
  295. void vp::parameter(unsigned int param, float x, float y, float z, float w)
  296. {
  297.     glx::glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, param, x, y, z, w);
  298. }
  299. void arbvp::parameter(unsigned int param, const Vec3f& v)
  300. {
  301.     glx::glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, param,
  302.                                     v.x, v.y, v.z, 0.0f);
  303. }
  304.                             
  305. void arbvp::parameter(unsigned int param, const Point3f& p)
  306. {
  307.     glx::glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, param,
  308.                                     p.x, p.y, p.z, 0.0f);
  309. }
  310. void arbvp::parameter(unsigned int param, const Color& c)
  311. {
  312.     glx::glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, param,
  313.                                    c.red(), c.green(), c.blue(), c.alpha());
  314. }
  315. void arbvp::parameter(unsigned int param, float x, float y, float z, float w)
  316. {
  317.     glx::glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, param, x, y, z, w);
  318. }
  319. void arbvp::parameter(unsigned int param, const float* fv)
  320. {
  321.     glx::glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, param, fv);
  322. }
  323. VertexProcessor::VertexProcessor()
  324. {
  325. }
  326. VertexProcessor::~VertexProcessor()
  327. {
  328. }
  329. void VertexProcessor::parameter(vp::Parameter param, const Vec3f& v)
  330. {
  331.     parameter(param, v.x, v.y, v.z, 0.0f);
  332. }
  333.                             
  334. void VertexProcessor::parameter(vp::Parameter param, const Point3f& p)
  335. {
  336.     parameter(param, p.x, p.y, p.z, 0.0f);
  337. }
  338. void VertexProcessor::parameter(vp::Parameter param, const Color& c)
  339. {
  340.     parameter(param, c.red(), c.green(), c.blue(), c.alpha());
  341. }
  342. // VertexProcessorNV implementation
  343. static unsigned int parameterMappings[] = 
  344. {
  345.     16, // LightDirection0
  346.     15, // EyePosition
  347.     20, // DiffuseColor0
  348.     34, // SpecularColor0
  349.     40, // SpecularExponent
  350.     32, // AmbientColor
  351.     33, // HazeColor
  352.     41, // TextureTranslation
  353.     90, // Constant0 - relevant for NV_vertex_program only
  354.      0, // Unused
  355.     41, // TexGen_S
  356.     42, // TexGen_T
  357.      0, // TexGen_S2
  358.      0, // TexGen_T2
  359.      0, // TexGen_S3
  360.      0, // TexGen_T3
  361.      0, // TexGen_S4
  362.      0, // TexGen_T4
  363.     50, // LightDirection1
  364.     51, // DiffuseColor1,
  365.     52, // SpecularColor1
  366. };
  367. VertexProcessorNV::VertexProcessorNV()
  368. {
  369. }
  370. VertexProcessorNV::~VertexProcessorNV()
  371. {
  372. }
  373. void VertexProcessorNV::enable()
  374. {
  375.     glEnable(GL_VERTEX_PROGRAM_NV);
  376. }
  377. void VertexProcessorNV::disable()
  378. {
  379.     glDisable(GL_VERTEX_PROGRAM_NV);
  380. }
  381. void VertexProcessorNV::use(unsigned int prog)
  382. {
  383.     glx::glBindProgramNV(GL_VERTEX_PROGRAM_NV, prog);
  384. }
  385. void VertexProcessorNV::parameter(vp::Parameter param,
  386.                                   float x, float y, float z, float w)
  387. {
  388.     glx::glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, 
  389.                                 parameterMappings[param], x, y, z, w);
  390. }
  391. void VertexProcessorNV::parameter(vp::Parameter param, const float* fv)
  392. {
  393.     glx::glProgramParameter4fvNV(GL_VERTEX_PROGRAM_NV,
  394.                                  parameterMappings[param], fv);
  395. }
  396. void VertexProcessorNV::enableAttribArray(unsigned int index)
  397. {
  398.     glEnableClientState(GL_VERTEX_ATTRIB_ARRAY0_NV + index);
  399. }
  400. void VertexProcessorNV::disableAttribArray(unsigned int index)
  401. {
  402.     glDisableClientState(GL_VERTEX_ATTRIB_ARRAY0_NV + index);
  403. }
  404. void VertexProcessorNV::attribArray(unsigned int index,
  405.                                      int size,
  406.                                      GLenum type,
  407.                                      unsigned int stride,
  408.                                      const void* ptr)
  409. {
  410.     glx::glVertexAttribPointerNV(index, size, type, stride, ptr);
  411. }
  412. // VertexProcessorARB implementation
  413. VertexProcessorARB::VertexProcessorARB()
  414. {
  415. }
  416. VertexProcessorARB::~VertexProcessorARB()
  417. {
  418. }
  419. void VertexProcessorARB::enable()
  420. {
  421.     glEnable(GL_VERTEX_PROGRAM_ARB);
  422. }
  423. void VertexProcessorARB::disable()
  424. {
  425.     glDisable(GL_VERTEX_PROGRAM_ARB);
  426. }
  427. void VertexProcessorARB::use(unsigned int prog)
  428. {
  429.     glx::glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prog);
  430. }
  431. void VertexProcessorARB::parameter(vp::Parameter param,
  432.                                    float x, float y, float z, float w)
  433. {
  434.     glx::glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, param, x, y, z, w);
  435. }
  436. void VertexProcessorARB::parameter(vp::Parameter param, const float* fv)
  437. {
  438.     glx::glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, param, fv);
  439. }
  440. void VertexProcessorARB::enableAttribArray(unsigned int index)
  441. {
  442.     glx::glEnableVertexAttribArrayARB(index);
  443. }
  444. void VertexProcessorARB::disableAttribArray(unsigned int index)
  445. {
  446.     glx::glDisableVertexAttribArrayARB(index);
  447. }
  448. void VertexProcessorARB::attribArray(unsigned int index,
  449.                                      int size,
  450.                                      GLenum type,
  451.                                      unsigned int stride,
  452.                                      const void* ptr)
  453. {
  454.     glx::glVertexAttribPointerARB(index, size, type, GL_FALSE, stride, ptr);
  455. }