esAux4.h 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999
  1. /*
  2. --------------------------------------------------
  3. James William Fletcher (github.com/mrbid)
  4. February 2023 - esAux4.h v4.0
  5. --------------------------------------------------
  6. A pretty good color converter: https://www.easyrgb.com/en/convert.php
  7. Lambertian fragment shaders make a difference, but only if you normalise the
  8. vertNorm in the fragment shader. Most of the time you won't notice the difference.
  9. Requires:
  10. - vec.h: https://gist.github.com/mrbid/77a92019e1ab8b86109bf103166bd04e
  11. - mat.h: https://gist.github.com/mrbid/cbc69ec9d99b0fda44204975fcbeae7c
  12. */
  13. #ifndef AUX_H
  14. #define AUX_H
  15. //#define VERTEX_SHADE // uncomment for vertex shaded, default is pixel shaded
  16. #include "vec.h"
  17. #include "mat.h"
  18. //*************************************
  19. // STRUCTURES
  20. //*************************************
  21. typedef struct
  22. {
  23. GLuint vid; // Vertex Array Buffer ID
  24. GLuint iid; // Index Array Buffer ID
  25. GLuint cid; // Colour Array Buffer ID
  26. GLuint nid; // Normal Array Buffer ID
  27. GLuint tid; // TexCoord Array Buffer ID
  28. } ESModel;
  29. //*************************************
  30. // UTILITY
  31. //*************************************
  32. GLuint esRand(const GLuint min, const GLuint max);
  33. GLfloat esRandFloat(const GLfloat min, const GLfloat max);
  34. void esBind(const GLenum target, GLuint* buffer, const void* data, const GLsizeiptr datalen, const GLenum usage);
  35. void esRebind(const GLenum target, GLuint* buffer, const void* data, const GLsizeiptr datalen, const GLenum usage);
  36. void esBindModel(ESModel* model, const GLfloat* vertices, const GLsizei vertlen, const GLushort* indices, const GLsizei indlen);
  37. GLuint esLoadTexture(const GLuint w, const GLuint h, const unsigned char* data, const GLuint linear);
  38. GLuint esLoadTextureWrapped(const GLuint w, const GLuint h, const unsigned char* data);
  39. GLuint esLoadTextureA(const GLuint w, const GLuint h, const unsigned char* data, const GLuint linear);
  40. //*************************************
  41. // SHADER
  42. //*************************************
  43. GLuint debugShader(GLuint shader_program);
  44. void makeAllShaders();
  45. void makeFullbright();
  46. void makeFullbright1();
  47. void makeLambert();
  48. void makeLambert1();
  49. void makeLambert2();
  50. void makeLambert3();
  51. void makeFullbrightT();
  52. void makeLambertT();
  53. // no texture
  54. void shadeFullbright(GLint* position, GLint* projection, GLint* modelview, GLint* color, GLint* opacity); // solid color + no shading
  55. void shadeFullbright1(GLint* position, GLint* projection, GLint* modelview, GLint* color, GLint* opacity); // colors + no shading
  56. void shadeLambert(GLint* position, GLint* projection, GLint* modelview, GLint* lightpos, GLint* color, GLint* opacity); // solid color + no normals
  57. void shadeLambert1(GLint* position, GLint* projection, GLint* modelview, GLint* lightpos, GLint* normal, GLint* color, GLint* opacity); // solid color + normals
  58. void shadeLambert2(GLint* position, GLint* projection, GLint* modelview, GLint* lightpos, GLint* color, GLint* opacity); // colors + no normals
  59. void shadeLambert3(GLint* position, GLint* projection, GLint* modelview, GLint* lightpos, GLint* normal, GLint* color, GLint* opacity); // colors + normals
  60. // textured
  61. void shadeFullbrightT(GLint* position, GLint* projection, GLint* modelview, GLint* texcoord, GLint* sampler);
  62. void shadeLambertT(GLint* position, GLint* projection, GLint* modelview, GLint* lightpos, GLint* normal, GLint* texcoord, GLint* sampler, GLint* opacity);
  63. //*************************************
  64. // UTILITY CODE
  65. //*************************************
  66. GLuint esRand(const GLuint min, const GLuint max)
  67. {
  68. return (rand()%(max+1-min))+min;
  69. }
  70. GLfloat esRandFloat(const GLfloat min, const GLfloat max)
  71. {
  72. static GLfloat rrndmax = 1.f/(GLfloat)RAND_MAX;
  73. return (((GLfloat)rand()) * rrndmax) * (max-min) + min;
  74. }
  75. void esBind(const GLenum target, GLuint* buffer, const void* data, const GLsizeiptr datalen, const GLenum usage)
  76. {
  77. glGenBuffers(1, buffer);
  78. glBindBuffer(target, *buffer);
  79. glBufferData(target, datalen, data, usage);
  80. }
  81. void esRebind(const GLenum target, GLuint* buffer, const void* data, const GLsizeiptr datalen, const GLenum usage)
  82. {
  83. glBindBuffer(target, *buffer);
  84. glBufferData(target, datalen, data, usage);
  85. }
  86. void esBindModel(ESModel* model, const GLfloat* vertices, const GLsizei vertlen, const GLushort* indices, const GLsizei indlen)
  87. {
  88. esBind(GL_ARRAY_BUFFER, &model->vid, vertices, vertlen * sizeof(GLfloat) * 3, GL_STATIC_DRAW);
  89. esBind(GL_ELEMENT_ARRAY_BUFFER, &model->iid, indices, indlen * sizeof(GLushort), GL_STATIC_DRAW);
  90. }
  91. GLuint esLoadTexture(const GLuint w, const GLuint h, const unsigned char* data, const GLuint linear)
  92. {
  93. // https://registry.khronos.org/OpenGL-Refpages/es3/html/glTexParameter.xhtml
  94. // https://docs.gl/es2/glTexParameter
  95. GLuint textureId;
  96. // Use tightly packed data
  97. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  98. // Generate a texture object
  99. glGenTextures(1, &textureId);
  100. // Bind the texture object
  101. glBindTexture(GL_TEXTURE_2D, textureId);
  102. // Load the texture
  103. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
  104. // Set the filtering mode
  105. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  106. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  107. if(linear == 1)
  108. {
  109. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  110. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  111. }
  112. else
  113. {
  114. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  115. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  116. }
  117. return textureId;
  118. }
  119. GLuint esLoadTextureA(const GLuint w, const GLuint h, const unsigned char* data, const GLuint linear)
  120. {
  121. GLuint textureId;
  122. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  123. glGenTextures(1, &textureId);
  124. glBindTexture(GL_TEXTURE_2D, textureId);
  125. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
  126. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  127. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  128. if(linear == 1)
  129. {
  130. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  131. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  132. }
  133. else
  134. {
  135. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  136. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  137. }
  138. return textureId;
  139. }
  140. GLuint esLoadTextureWrapped(const GLuint w, const GLuint h, const unsigned char* data)
  141. {
  142. GLuint textureId;
  143. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  144. glGenTextures(1, &textureId);
  145. glBindTexture(GL_TEXTURE_2D, textureId);
  146. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
  147. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
  148. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
  149. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  150. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  151. return textureId;
  152. }
  153. #ifdef GL_DEBUG
  154. // https://registry.khronos.org/OpenGL-Refpages/gl4/html/glDebugMessageControl.xhtml
  155. // https://registry.khronos.org/OpenGL-Refpages/es3/html/glDebugMessageControl.xhtml
  156. // OpenGL ES 3.2 or OpenGL 4.3 and above only.
  157. void GLAPIENTRY MessageCallback( GLenum source,
  158. GLenum type,
  159. GLuint id,
  160. GLenum severity,
  161. GLsizei length,
  162. const GLchar* message,
  163. const void* userParam )
  164. {
  165. printf("GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n",
  166. ( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ),
  167. type, severity, message );
  168. }
  169. void esDebug(const GLuint state)
  170. {
  171. if(state == 1)
  172. {
  173. glEnable(GL_DEBUG_OUTPUT);
  174. glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
  175. glDebugMessageCallback(MessageCallback, 0);
  176. glDebugMessageControl(GL_DEBUG_SOURCE_API, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, NULL, GL_FALSE);
  177. }
  178. else
  179. {
  180. glDisable(GL_DEBUG_OUTPUT);
  181. glDisable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
  182. }
  183. }
  184. #endif
  185. GLuint debugShader(GLuint shader_program)
  186. {
  187. GLint linked;
  188. glGetProgramiv(shader_program, GL_LINK_STATUS, &linked);
  189. if(linked == GL_FALSE)
  190. {
  191. GLint infoLen = 0;
  192. glGetProgramiv(shader_program, GL_INFO_LOG_LENGTH, &infoLen);
  193. if(infoLen > 1)
  194. {
  195. char* infoLog = malloc(sizeof(char) * infoLen);
  196. if(infoLog != NULL)
  197. {
  198. glGetProgramInfoLog(shader_program, infoLen, NULL, infoLog);
  199. printf("!!! error linking shader !!!\n%s\n", infoLog);
  200. free(infoLog);
  201. }
  202. }
  203. else
  204. {
  205. printf("!!! failed to link shader with no returned debug output !!!\n");
  206. }
  207. glDeleteProgram(shader_program);
  208. return linked;
  209. }
  210. return linked;
  211. }
  212. //*************************************
  213. // SHADER CODE
  214. //*************************************
  215. const GLchar* vt0 =
  216. "#version 100\n"
  217. "uniform mat4 modelview;\n"
  218. "uniform mat4 projection;\n"
  219. "attribute vec4 position;\n"
  220. "attribute vec2 texcoord;\n"
  221. "varying vec2 vtc;\n"
  222. "void main()\n"
  223. "{\n"
  224. "vtc = texcoord;\n"
  225. "gl_Position = projection * modelview * position;\n"
  226. "}\n";
  227. const GLchar* ft0 =
  228. "#version 100\n"
  229. "precision highp float;\n"
  230. "varying vec2 vtc;\n"
  231. "uniform sampler2D tex;\n"
  232. "void main()\n"
  233. "{\n"
  234. "gl_FragColor = texture2D(tex, vtc);\n"
  235. "}\n";
  236. //
  237. const GLchar* v0 =
  238. "#version 100\n"
  239. "uniform mat4 modelview;\n"
  240. "uniform mat4 projection;\n"
  241. "uniform vec3 color;\n"
  242. "uniform float opacity;\n"
  243. "attribute vec4 position;\n"
  244. "varying vec4 fragcolor;\n"
  245. "void main()\n"
  246. "{\n"
  247. "fragcolor = vec4(color, opacity);\n"
  248. "gl_Position = projection * modelview * position;\n"
  249. "}\n";
  250. const GLchar* f0 =
  251. "#version 100\n"
  252. "precision highp float;\n"
  253. "varying vec4 fragcolor;\n"
  254. "void main()\n"
  255. "{\n"
  256. "gl_FragColor = fragcolor;\n"
  257. "}\n";
  258. //
  259. const GLchar* v01 =
  260. "#version 100\n"
  261. "uniform mat4 modelview;\n"
  262. "uniform mat4 projection;\n"
  263. "attribute vec3 color;\n"
  264. "uniform float opacity;\n"
  265. "attribute vec4 position;\n"
  266. "varying vec3 vertCol;\n"
  267. "varying float vertOpa;\n"
  268. "void main()\n"
  269. "{\n"
  270. "vertCol = color;\n"
  271. "vertOpa = opacity;\n"
  272. "gl_Position = projection * modelview * position;\n"
  273. "}\n";
  274. const GLchar* f01 =
  275. "#version 100\n"
  276. "precision highp float;\n"
  277. "varying vec3 vertCol;\n"
  278. "varying float vertOpa;\n"
  279. "void main()\n"
  280. "{\n"
  281. "gl_FragColor = vec4(vertCol, vertOpa);\n"
  282. "}\n";
  283. //
  284. #ifdef VERTEX_SHADE
  285. // solid color + no normals
  286. const GLchar* v1 =
  287. "#version 100\n"
  288. "uniform mat4 modelview;\n"
  289. "uniform mat4 projection;\n"
  290. "uniform vec3 color;\n"
  291. "uniform float opacity;\n"
  292. "uniform vec3 lightpos;\n"
  293. "attribute vec4 position;\n"
  294. "varying vec4 fragcolor;\n"
  295. "void main()\n"
  296. "{\n"
  297. "vec4 vertPos4 = modelview * position;\n"
  298. "vec3 vertNorm = normalize(vec3(modelview * vec4(normalize(position.xyz), 0.0)));\n"
  299. "vec3 lightDir = normalize(lightpos - (vertPos4.xyz / vertPos4.w));\n"
  300. "fragcolor = vec4((color * 0.148) + max(dot(lightDir, vertNorm), 0.0) * color, opacity);\n"
  301. "gl_Position = projection * vertPos4;\n"
  302. "}\n";
  303. // solid color + normal array
  304. const GLchar* v11 =
  305. "#version 100\n"
  306. "uniform mat4 modelview;\n"
  307. "uniform mat4 projection;\n"
  308. "uniform vec3 color;\n"
  309. "uniform float opacity;\n"
  310. "uniform vec3 lightpos;\n"
  311. "attribute vec4 position;\n"
  312. "attribute vec3 normal;\n"
  313. "varying vec4 fragcolor;\n"
  314. "void main()\n"
  315. "{\n"
  316. "vec4 vertPos4 = modelview * position;\n"
  317. "vec3 vertNorm = normalize(vec3(modelview * vec4(normal, 0.0)));\n"
  318. "vec3 lightDir = normalize(lightpos - (vertPos4.xyz / vertPos4.w));\n"
  319. "fragcolor = vec4((color * 0.148) + max(dot(lightDir, vertNorm), 0.0) * color, opacity);\n"
  320. "gl_Position = projection * vertPos4;\n"
  321. "}\n";
  322. // color array + no normals
  323. const GLchar* v12 =
  324. "#version 100\n"
  325. "uniform mat4 modelview;\n"
  326. "uniform mat4 projection;\n"
  327. "uniform float opacity;\n"
  328. "uniform vec3 lightpos;\n"
  329. "attribute vec4 position;\n"
  330. "attribute vec3 color;\n"
  331. "varying vec4 fragcolor;\n"
  332. "void main()\n"
  333. "{\n"
  334. "vec4 vertPos4 = modelview * position;\n"
  335. "vec3 vertNorm = normalize(vec3(modelview * vec4(normalize(position.xyz), 0.0)));\n"
  336. "vec3 lightDir = normalize(lightpos - (vertPos4.xyz / vertPos4.w));\n"
  337. "fragcolor = vec4((color * 0.148) + max(dot(lightDir, vertNorm), 0.0) * color, opacity);\n"
  338. "gl_Position = projection * vertPos4;\n"
  339. "}\n";
  340. // color array + normal array
  341. const GLchar* v13 =
  342. "#version 100\n"
  343. "uniform mat4 modelview;\n"
  344. "uniform mat4 projection;\n"
  345. "uniform float opacity;\n"
  346. "uniform vec3 lightpos;\n"
  347. "attribute vec4 position;\n"
  348. "attribute vec3 normal;\n"
  349. "attribute vec3 color;\n"
  350. "varying vec4 fragcolor;\n"
  351. "void main()\n"
  352. "{\n"
  353. "vec4 vertPos4 = modelview * position;\n"
  354. "vec3 vertNorm = normalize(vec3(modelview * vec4(normal, 0.0)));\n"
  355. "vec3 lightDir = normalize(lightpos - (vertPos4.xyz / vertPos4.w));\n"
  356. "fragcolor = vec4((color * 0.148) + max(dot(lightDir, vertNorm), 0.0) * color, opacity);\n"
  357. //"fragcolor = vec4((color * 0.33) + max(dot(lightDir, vertNorm), 0.0) * color, opacity);\n"
  358. "gl_Position = projection * vertPos4;\n"
  359. "}\n";
  360. const GLchar* f1 =
  361. "#version 100\n"
  362. "precision highp float;\n"
  363. "varying vec4 fragcolor;\n"
  364. "void main()\n"
  365. "{\n"
  366. "gl_FragColor = fragcolor;\n"
  367. "}\n";
  368. // texture + normal array
  369. const GLchar* v14 =
  370. "#version 100\n"
  371. "uniform mat4 modelview;\n"
  372. "uniform mat4 projection;\n"
  373. "uniform float opacity;\n"
  374. "uniform vec3 lightpos;\n"
  375. "attribute vec4 position;\n"
  376. "attribute vec3 normal;\n"
  377. "attribute vec2 texcoord;\n"
  378. "varying float lambertian;\n"
  379. "varying float vertOpa;\n"
  380. "varying vec2 vtc;\n"
  381. "void main()\n"
  382. "{\n"
  383. "vtc = texcoord;\n"
  384. "vec4 vertPos4 = modelview * position;\n"
  385. "vec3 vertPos = vertPos4.xyz / vertPos4.w;\n"
  386. "vec3 vertNorm = vec3(modelview * vec4(normal, 0.0));\n"
  387. "vec3 lightDir = normalize(lightpos - vertPos);\n"
  388. "lambertian = max(dot(lightDir, normalize(vertNorm)), 0.0);\n"
  389. "vertOpa = opacity;\n"
  390. "gl_Position = projection * vertPos4;\n"
  391. "}\n";
  392. const GLchar* f14 =
  393. "#version 100\n"
  394. "precision highp float;\n"
  395. "varying float lambertian;\n"
  396. "varying float vertOpa;\n"
  397. "varying vec2 vtc;\n"
  398. "uniform sampler2D tex;\n"
  399. "void main()\n"
  400. "{\n"
  401. "vec4 tcol = texture2D(tex, vtc);\n"
  402. "gl_FragColor = vec4((tcol.xyz * 0.148) + lambertian*tcol.xyz, vertOpa);\n"
  403. "}\n";
  404. #else
  405. // solid color + no normals
  406. const GLchar* v1 =
  407. "#version 100\n"
  408. "uniform mat4 modelview;\n"
  409. "uniform mat4 projection;\n"
  410. "uniform vec3 color;\n"
  411. "uniform float opacity;\n"
  412. "uniform vec3 lightpos;\n"
  413. "attribute vec4 position;\n"
  414. "varying vec3 vertPos;\n"
  415. "varying vec3 vertNorm;\n"
  416. "varying vec3 vertCol;\n"
  417. "varying float vertOpa;\n"
  418. "varying vec3 vlightPos;\n"
  419. "void main()\n"
  420. "{\n"
  421. "vec4 vertPos4 = modelview * position;\n"
  422. "vertPos = vertPos4.xyz / vertPos4.w;\n"
  423. "vertNorm = vec3(modelview * vec4(normalize(position.xyz), 0.0));\n"
  424. "vertCol = color;\n"
  425. "vertOpa = opacity;\n"
  426. "vlightPos = lightpos;\n"
  427. "gl_Position = projection * vertPos4;\n"
  428. "}\n";
  429. // solid color + normal array
  430. const GLchar* v11 =
  431. "#version 100\n"
  432. "uniform mat4 modelview;\n"
  433. "uniform mat4 projection;\n"
  434. "uniform vec3 color;\n"
  435. "uniform float opacity;\n"
  436. "uniform vec3 lightpos;\n"
  437. "attribute vec4 position;\n"
  438. "attribute vec3 normal;\n"
  439. "varying vec3 vertPos;\n"
  440. "varying vec3 vertNorm;\n"
  441. "varying vec3 vertCol;\n"
  442. "varying float vertOpa;\n"
  443. "varying vec3 vlightPos;\n"
  444. "void main()\n"
  445. "{\n"
  446. "vec4 vertPos4 = modelview * position;\n"
  447. "vertPos = vertPos4.xyz / vertPos4.w;\n"
  448. "vertNorm = vec3(modelview * vec4(normal, 0.0));\n"
  449. "vertCol = color;\n"
  450. "vertOpa = opacity;\n"
  451. "vlightPos = lightpos;\n"
  452. "gl_Position = projection * vertPos4;\n"
  453. "}\n";
  454. // color array + no normals
  455. const GLchar* v12 =
  456. "#version 100\n"
  457. "uniform mat4 modelview;\n"
  458. "uniform mat4 projection;\n"
  459. "uniform float opacity;\n"
  460. "uniform vec3 lightpos;\n"
  461. "attribute vec4 position;\n"
  462. "attribute vec3 color;\n"
  463. "varying vec3 vertPos;\n"
  464. "varying vec3 vertNorm;\n"
  465. "varying vec3 vertCol;\n"
  466. "varying float vertOpa;\n"
  467. "varying vec3 vlightPos;\n"
  468. "void main()\n"
  469. "{\n"
  470. "vec4 vertPos4 = modelview * position;\n"
  471. "vertPos = vertPos4.xyz / vertPos4.w;\n"
  472. "vertNorm = vec3(modelview * vec4(normalize(position.xyz), 0.0));\n"
  473. "vertCol = color;\n"
  474. "vertOpa = opacity;\n"
  475. "vlightPos = lightpos;\n"
  476. "gl_Position = projection * vertPos4;\n"
  477. "}\n";
  478. // color array + normal array
  479. const GLchar* v13 =
  480. "#version 100\n"
  481. "uniform mat4 modelview;\n"
  482. "uniform mat4 projection;\n"
  483. "uniform float opacity;\n"
  484. "uniform vec3 lightpos;\n"
  485. "attribute vec4 position;\n"
  486. "attribute vec3 normal;\n"
  487. "attribute vec3 color;\n"
  488. "varying vec3 vertPos;\n"
  489. "varying vec3 vertNorm;\n"
  490. "varying vec3 vertCol;\n"
  491. "varying float vertOpa;\n"
  492. "varying vec3 vlightPos;\n"
  493. "void main()\n"
  494. "{\n"
  495. "vec4 vertPos4 = modelview * position;\n"
  496. "vertPos = vertPos4.xyz / vertPos4.w;\n"
  497. "vertNorm = vec3(modelview * vec4(normal, 0.0));\n"
  498. "vertCol = color;\n"
  499. "vertOpa = opacity;\n"
  500. "vlightPos = lightpos;\n"
  501. "gl_Position = projection * vertPos4;\n"
  502. "}\n";
  503. const GLchar* f1 =
  504. "#version 100\n"
  505. "precision highp float;\n"
  506. "varying vec3 vertPos;\n"
  507. "varying vec3 vertNorm;\n"
  508. "varying vec3 vertCol;\n"
  509. "varying float vertOpa;\n"
  510. "varying vec3 vlightPos;\n"
  511. "void main()\n"
  512. "{\n"
  513. "vec3 ambientColor = vertCol * 0.148;\n"
  514. "vec3 lightDir = normalize(vlightPos - vertPos);\n"
  515. "float lambertian = max(dot(lightDir, normalize(vertNorm)), 0.0);\n"
  516. "gl_FragColor = vec4(ambientColor + lambertian*vertCol, vertOpa);\n"
  517. "}\n";
  518. // texture + normal array
  519. const GLchar* v14 =
  520. "#version 100\n"
  521. "uniform mat4 modelview;\n"
  522. "uniform mat4 projection;\n"
  523. "uniform float opacity;\n"
  524. "uniform vec3 lightpos;\n"
  525. "attribute vec4 position;\n"
  526. "attribute vec3 normal;\n"
  527. "attribute vec2 texcoord;\n"
  528. "varying vec3 vertPos;\n"
  529. "varying vec3 vertNorm;\n"
  530. "varying float vertOpa;\n"
  531. "varying vec3 vlightPos;\n"
  532. "varying vec2 vtc;\n"
  533. "void main()\n"
  534. "{\n"
  535. "vtc = texcoord;\n"
  536. "vec4 vertPos4 = modelview * position;\n"
  537. "vertPos = vertPos4.xyz / vertPos4.w;\n"
  538. "vertNorm = vec3(modelview * vec4(normal, 0.0));\n"
  539. "vertOpa = opacity;\n"
  540. "vlightPos = lightpos;\n"
  541. "gl_Position = projection * vertPos4;\n"
  542. "}\n";
  543. const GLchar* f14 =
  544. "#version 100\n"
  545. "precision highp float;\n"
  546. "varying vec3 vertPos;\n"
  547. "varying vec3 vertNorm;\n"
  548. "varying float vertOpa;\n"
  549. "varying vec3 vlightPos;\n"
  550. "varying vec2 vtc;\n"
  551. "uniform sampler2D tex;\n"
  552. "void main()\n"
  553. "{\n"
  554. "vec4 tcol = texture2D(tex, vtc);\n"
  555. "vec3 ambientColor = tcol.xyz * 0.148;\n"
  556. "vec3 lightDir = normalize(vlightPos - vertPos);\n"
  557. "float lambertian = max(dot(lightDir, normalize(vertNorm)), 0.0);\n"
  558. "gl_FragColor = vec4(ambientColor + lambertian*tcol.xyz, vertOpa);\n"
  559. //"gl_FragColor = vec4((ambientColor + lambertian*tcol.xyz) * clamp(1.0 - (length(vertPos)*0.09), 0.0, 1.0), vertOpa);\n"
  560. "}\n";
  561. #endif
  562. //
  563. GLuint shdFullbrightT;
  564. GLint shdFullbrightT_position;
  565. GLint shdFullbrightT_projection;
  566. GLint shdFullbrightT_modelview;
  567. GLint shdFullbrightT_texcoord;
  568. GLint shdFullbrightT_sampler;
  569. GLuint shdFullbright;
  570. GLint shdFullbright_position;
  571. GLint shdFullbright_projection;
  572. GLint shdFullbright_modelview;
  573. GLint shdFullbright_color;
  574. GLint shdFullbright_opacity;
  575. GLuint shdFullbright1;
  576. GLint shdFullbright1_position;
  577. GLint shdFullbright1_projection;
  578. GLint shdFullbright1_modelview;
  579. GLint shdFullbright1_color;
  580. GLint shdFullbright1_opacity;
  581. GLuint shdLambert;
  582. GLint shdLambert_position;
  583. GLint shdLambert_projection;
  584. GLint shdLambert_modelview;
  585. GLint shdLambert_lightpos;
  586. GLint shdLambert_color;
  587. GLint shdLambert_opacity;
  588. GLuint shdLambert1;
  589. GLint shdLambert1_position;
  590. GLint shdLambert1_projection;
  591. GLint shdLambert1_modelview;
  592. GLint shdLambert1_lightpos;
  593. GLint shdLambert1_color;
  594. GLint shdLambert1_normal;
  595. GLint shdLambert1_opacity;
  596. GLuint shdLambert2;
  597. GLint shdLambert2_position;
  598. GLint shdLambert2_projection;
  599. GLint shdLambert2_modelview;
  600. GLint shdLambert2_lightpos;
  601. GLint shdLambert2_color;
  602. GLint shdLambert2_opacity;
  603. GLuint shdLambert3;
  604. GLint shdLambert3_position;
  605. GLint shdLambert3_projection;
  606. GLint shdLambert3_modelview;
  607. GLint shdLambert3_lightpos;
  608. GLint shdLambert3_color;
  609. GLint shdLambert3_normal;
  610. GLint shdLambert3_opacity;
  611. GLuint shdLambertT;
  612. GLint shdLambertT_position;
  613. GLint shdLambertT_projection;
  614. GLint shdLambertT_modelview;
  615. GLint shdLambertT_lightpos;
  616. GLint shdLambertT_texcoord;
  617. GLint shdLambertT_sampler;
  618. GLint shdLambertT_normal;
  619. GLint shdLambertT_opacity;
  620. //
  621. void makeFullbrightT()
  622. {
  623. GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  624. glShaderSource(vertexShader, 1, &vt0, NULL);
  625. glCompileShader(vertexShader);
  626. GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  627. glShaderSource(fragmentShader, 1, &ft0, NULL);
  628. glCompileShader(fragmentShader);
  629. shdFullbrightT = glCreateProgram();
  630. glAttachShader(shdFullbrightT, vertexShader);
  631. glAttachShader(shdFullbrightT, fragmentShader);
  632. glLinkProgram(shdFullbrightT);
  633. if(debugShader(shdFullbrightT) == GL_FALSE){return;}
  634. shdFullbrightT_position = glGetAttribLocation(shdFullbrightT, "position");
  635. shdFullbrightT_texcoord = glGetAttribLocation(shdFullbrightT, "texcoord");
  636. shdFullbrightT_projection = glGetUniformLocation(shdFullbrightT, "projection");
  637. shdFullbrightT_modelview = glGetUniformLocation(shdFullbrightT, "modelview");
  638. shdFullbrightT_sampler = glGetUniformLocation(shdFullbrightT, "tex");
  639. }
  640. void makeFullbright()
  641. {
  642. GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  643. glShaderSource(vertexShader, 1, &v0, NULL);
  644. glCompileShader(vertexShader);
  645. GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  646. glShaderSource(fragmentShader, 1, &f0, NULL);
  647. glCompileShader(fragmentShader);
  648. shdFullbright = glCreateProgram();
  649. glAttachShader(shdFullbright, vertexShader);
  650. glAttachShader(shdFullbright, fragmentShader);
  651. glLinkProgram(shdFullbright);
  652. if(debugShader(shdFullbright) == GL_FALSE){return;}
  653. shdFullbright_position = glGetAttribLocation(shdFullbright, "position");
  654. shdFullbright_projection = glGetUniformLocation(shdFullbright, "projection");
  655. shdFullbright_modelview = glGetUniformLocation(shdFullbright, "modelview");
  656. shdFullbright_color = glGetUniformLocation(shdFullbright, "color");
  657. shdFullbright_opacity = glGetUniformLocation(shdFullbright, "opacity");
  658. }
  659. void makeFullbright1()
  660. {
  661. GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  662. glShaderSource(vertexShader, 1, &v01, NULL);
  663. glCompileShader(vertexShader);
  664. GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  665. glShaderSource(fragmentShader, 1, &f01, NULL);
  666. glCompileShader(fragmentShader);
  667. shdFullbright1 = glCreateProgram();
  668. glAttachShader(shdFullbright1, vertexShader);
  669. glAttachShader(shdFullbright1, fragmentShader);
  670. glLinkProgram(shdFullbright1);
  671. if(debugShader(shdFullbright1) == GL_FALSE){return;}
  672. shdFullbright1_position = glGetAttribLocation(shdFullbright1, "position");
  673. shdFullbright1_color = glGetAttribLocation(shdFullbright1, "color");
  674. shdFullbright1_projection = glGetUniformLocation(shdFullbright1, "projection");
  675. shdFullbright1_modelview = glGetUniformLocation(shdFullbright1, "modelview");
  676. shdFullbright1_opacity = glGetUniformLocation(shdFullbright1, "opacity");
  677. }
  678. void makeLambert()
  679. {
  680. GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  681. glShaderSource(vertexShader, 1, &v1, NULL);
  682. glCompileShader(vertexShader);
  683. GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  684. glShaderSource(fragmentShader, 1, &f1, NULL);
  685. glCompileShader(fragmentShader);
  686. shdLambert = glCreateProgram();
  687. glAttachShader(shdLambert, vertexShader);
  688. glAttachShader(shdLambert, fragmentShader);
  689. glLinkProgram(shdLambert);
  690. if(debugShader(shdLambert) == GL_FALSE){return;}
  691. shdLambert_position = glGetAttribLocation(shdLambert, "position");
  692. shdLambert_projection = glGetUniformLocation(shdLambert, "projection");
  693. shdLambert_modelview = glGetUniformLocation(shdLambert, "modelview");
  694. shdLambert_lightpos = glGetUniformLocation(shdLambert, "lightpos");
  695. shdLambert_color = glGetUniformLocation(shdLambert, "color");
  696. shdLambert_opacity = glGetUniformLocation(shdLambert, "opacity");
  697. }
  698. void makeLambert1()
  699. {
  700. GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  701. glShaderSource(vertexShader, 1, &v11, NULL);
  702. glCompileShader(vertexShader);
  703. GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  704. glShaderSource(fragmentShader, 1, &f1, NULL);
  705. glCompileShader(fragmentShader);
  706. shdLambert1 = glCreateProgram();
  707. glAttachShader(shdLambert1, vertexShader);
  708. glAttachShader(shdLambert1, fragmentShader);
  709. glLinkProgram(shdLambert1);
  710. if(debugShader(shdLambert1) == GL_FALSE){return;}
  711. shdLambert1_position = glGetAttribLocation(shdLambert1, "position");
  712. shdLambert1_normal = glGetAttribLocation(shdLambert1, "normal");
  713. shdLambert1_projection = glGetUniformLocation(shdLambert1, "projection");
  714. shdLambert1_modelview = glGetUniformLocation(shdLambert1, "modelview");
  715. shdLambert1_lightpos = glGetUniformLocation(shdLambert1, "lightpos");
  716. shdLambert1_color = glGetUniformLocation(shdLambert1, "color");
  717. shdLambert1_opacity = glGetUniformLocation(shdLambert1, "opacity");
  718. }
  719. void makeLambert2()
  720. {
  721. GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  722. glShaderSource(vertexShader, 1, &v12, NULL);
  723. glCompileShader(vertexShader);
  724. GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  725. glShaderSource(fragmentShader, 1, &f1, NULL);
  726. glCompileShader(fragmentShader);
  727. shdLambert2 = glCreateProgram();
  728. glAttachShader(shdLambert2, vertexShader);
  729. glAttachShader(shdLambert2, fragmentShader);
  730. glLinkProgram(shdLambert2);
  731. if(debugShader(shdLambert2) == GL_FALSE){return;}
  732. shdLambert2_position = glGetAttribLocation(shdLambert2, "position");
  733. shdLambert2_color = glGetAttribLocation(shdLambert2, "color");
  734. shdLambert2_projection = glGetUniformLocation(shdLambert2, "projection");
  735. shdLambert2_modelview = glGetUniformLocation(shdLambert2, "modelview");
  736. shdLambert2_lightpos = glGetUniformLocation(shdLambert2, "lightpos");
  737. shdLambert2_opacity = glGetUniformLocation(shdLambert2, "opacity");
  738. }
  739. void makeLambert3()
  740. {
  741. GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  742. glShaderSource(vertexShader, 1, &v13, NULL);
  743. glCompileShader(vertexShader);
  744. GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  745. glShaderSource(fragmentShader, 1, &f1, NULL);
  746. glCompileShader(fragmentShader);
  747. shdLambert3 = glCreateProgram();
  748. glAttachShader(shdLambert3, vertexShader);
  749. glAttachShader(shdLambert3, fragmentShader);
  750. glLinkProgram(shdLambert3);
  751. if(debugShader(shdLambert3) == GL_FALSE){return;}
  752. shdLambert3_position = glGetAttribLocation(shdLambert3, "position");
  753. shdLambert3_normal = glGetAttribLocation(shdLambert3, "normal");
  754. shdLambert3_color = glGetAttribLocation(shdLambert3, "color");
  755. shdLambert3_projection = glGetUniformLocation(shdLambert3, "projection");
  756. shdLambert3_modelview = glGetUniformLocation(shdLambert3, "modelview");
  757. shdLambert3_lightpos = glGetUniformLocation(shdLambert3, "lightpos");
  758. shdLambert3_opacity = glGetUniformLocation(shdLambert3, "opacity");
  759. }
  760. void makeLambertT()
  761. {
  762. GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  763. glShaderSource(vertexShader, 1, &v14, NULL);
  764. glCompileShader(vertexShader);
  765. GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  766. glShaderSource(fragmentShader, 1, &f14, NULL);
  767. glCompileShader(fragmentShader);
  768. shdLambertT = glCreateProgram();
  769. glAttachShader(shdLambertT, vertexShader);
  770. glAttachShader(shdLambertT, fragmentShader);
  771. glLinkProgram(shdLambertT);
  772. if(debugShader(shdLambertT) == GL_FALSE){return;}
  773. shdLambertT_position = glGetAttribLocation(shdLambertT, "position");
  774. shdLambertT_normal = glGetAttribLocation(shdLambertT, "normal");
  775. shdLambertT_texcoord = glGetAttribLocation(shdLambertT, "texcoord");
  776. shdLambertT_projection = glGetUniformLocation(shdLambertT, "projection");
  777. shdLambertT_modelview = glGetUniformLocation(shdLambertT, "modelview");
  778. shdLambertT_lightpos = glGetUniformLocation(shdLambertT, "lightpos");
  779. shdLambertT_opacity = glGetUniformLocation(shdLambertT, "opacity");
  780. shdLambertT_sampler = glGetUniformLocation(shdLambertT, "tex");
  781. }
  782. void makeAllShaders()
  783. {
  784. makeFullbright();
  785. makeFullbright1();
  786. makeLambert();
  787. makeLambert1();
  788. makeLambert2();
  789. makeLambert3();
  790. makeFullbrightT();
  791. makeLambertT();
  792. }
  793. void shadeFullbrightT(GLint* position, GLint* projection, GLint* modelview, GLint* texcoord, GLint* sampler)
  794. {
  795. *position = shdFullbrightT_position;
  796. *projection = shdFullbrightT_projection;
  797. *modelview = shdFullbrightT_modelview;
  798. *texcoord = shdFullbrightT_texcoord;
  799. *sampler = shdFullbrightT_sampler;
  800. glUseProgram(shdFullbrightT);
  801. }
  802. void shadeFullbright(GLint* position, GLint* projection, GLint* modelview, GLint* color, GLint* opacity)
  803. {
  804. *position = shdFullbright_position;
  805. *projection = shdFullbright_projection;
  806. *modelview = shdFullbright_modelview;
  807. *color = shdFullbright_color;
  808. *opacity = shdFullbright_opacity;
  809. glUseProgram(shdFullbright);
  810. }
  811. void shadeFullbright1(GLint* position, GLint* projection, GLint* modelview, GLint* color, GLint* opacity)
  812. {
  813. *position = shdFullbright1_position;
  814. *projection = shdFullbright1_projection;
  815. *modelview = shdFullbright1_modelview;
  816. *color = shdFullbright1_color;
  817. *opacity = shdFullbright1_opacity;
  818. glUseProgram(shdFullbright1);
  819. }
  820. void shadeLambert(GLint* position, GLint* projection, GLint* modelview, GLint* lightpos, GLint* color, GLint* opacity)
  821. {
  822. *position = shdLambert_position;
  823. *projection = shdLambert_projection;
  824. *modelview = shdLambert_modelview;
  825. *lightpos = shdLambert_lightpos;
  826. *color = shdLambert_color;
  827. *opacity = shdLambert_opacity;
  828. glUseProgram(shdLambert);
  829. }
  830. void shadeLambert1(GLint* position, GLint* projection, GLint* modelview, GLint* lightpos, GLint* normal, GLint* color, GLint* opacity)
  831. {
  832. *position = shdLambert1_position;
  833. *projection = shdLambert1_projection;
  834. *modelview = shdLambert1_modelview;
  835. *lightpos = shdLambert1_lightpos;
  836. *color = shdLambert1_color;
  837. *normal = shdLambert1_normal;
  838. *opacity = shdLambert1_opacity;
  839. glUseProgram(shdLambert1);
  840. }
  841. void shadeLambert2(GLint* position, GLint* projection, GLint* modelview, GLint* lightpos, GLint* color, GLint* opacity)
  842. {
  843. *position = shdLambert2_position;
  844. *projection = shdLambert2_projection;
  845. *modelview = shdLambert2_modelview;
  846. *lightpos = shdLambert2_lightpos;
  847. *color = shdLambert2_color;
  848. *opacity = shdLambert2_opacity;
  849. glUseProgram(shdLambert2);
  850. }
  851. void shadeLambert3(GLint* position, GLint* projection, GLint* modelview, GLint* lightpos, GLint* normal, GLint* color, GLint* opacity)
  852. {
  853. *position = shdLambert3_position;
  854. *projection = shdLambert3_projection;
  855. *modelview = shdLambert3_modelview;
  856. *lightpos = shdLambert3_lightpos;
  857. *color = shdLambert3_color;
  858. *normal = shdLambert3_normal;
  859. *opacity = shdLambert3_opacity;
  860. glUseProgram(shdLambert3);
  861. }
  862. void shadeLambertT(GLint* position, GLint* projection, GLint* modelview, GLint* lightpos, GLint* normal, GLint* texcoord, GLint* sampler, GLint* opacity)
  863. {
  864. *position = shdLambertT_position;
  865. *projection = shdLambertT_projection;
  866. *modelview = shdLambertT_modelview;
  867. *lightpos = shdLambertT_lightpos;
  868. *texcoord = shdLambertT_texcoord;
  869. *sampler = shdLambertT_sampler;
  870. *normal = shdLambertT_normal;
  871. *opacity = shdLambertT_opacity;
  872. glUseProgram(shdLambertT);
  873. }
  874. #endif