main.cpp
上传用户:qccn516
上传日期:2013-05-02
资源大小:3382k
文件大小:5k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /* Horizon Texture generator
  2.  *
  3.  * Copyright (C) 2003-2004, Alexander Zaprjagaev <frustum@frustum.org>
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  */
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include <stdlib.h>
  22. #include "mathlib.h"
  23. #include "texture.h"
  24. /*
  25.  */
  26. class Horizon {
  27. public:
  28. Horizon(const char *name,float size,float elevation) : hmap(NULL) {
  29. unsigned char *h = Texture::load(name,width,height);
  30. if(!h) return;
  31. hmap = new float[width * height];
  32. float *dest = hmap;
  33. unsigned char *src = h;
  34. for(int i = 0; i < width * height; i++) {
  35. *dest++ = (float)*src / 255.0 * elevation / size * (float)width;
  36. src += 4;
  37. }
  38. delete h;
  39. }
  40. ~Horizon() {
  41. if(hmap) delete hmap;
  42. }
  43. // height
  44. float height_wrap(int x,int y) {
  45. while(x < 0) x += width;
  46. while(y < 0) y += height;
  47. if(x >= width) x = x % width;
  48. if(y >= height) y = y % height;
  49. return hmap[y * width + x];
  50. }
  51. // create one layer of 3d texture
  52. void create_layer(unsigned char *dest,const vec2 &dir) {
  53. vec2 d = dir;
  54. float step = fabs(d.x) > fabs(d.y) ? fabs(d.x) : fabs(d.y);
  55. d /= step;
  56. int length = (int)sqrt((float)width * d.x * (float)width * d.x + (float)height * d.y * (float)height * d.y);
  57. for(int y = 0; y < height; y++) {
  58. for(int x = 0; x < width; x++) {
  59. vec2 v(x,y);
  60. *dest = 0;
  61. float height_start = height_wrap(x,y);
  62. float len = 0;
  63. float dlen =  d.length();
  64. float angle = 0;
  65. for(int i = 0; i < length; i++) {
  66. v += d;
  67. len += dlen;
  68. int nx = (int)(v.x + 0.5);
  69. int ny = (int)(v.y + 0.5);
  70. float a = (height_wrap(nx,ny) - height_start) / len;
  71. if(a > angle) angle = a;
  72. }
  73. *dest++ = (unsigned char)((1.0 - cos(atan(angle))) * 255.0);
  74. }
  75. }
  76. }
  77. // create horizon texture
  78. void create(const char *name,int depth) {
  79. if(!hmap) return;
  80. unsigned char *data = new unsigned char[width * height * depth];
  81. for(int i = 0; i < depth; i++) {
  82. vec2 dir;
  83. dir.x = sin((float)i / (float)depth * 2 * PI);
  84. dir.y = cos((float)i / (float)depth * 2 * PI);
  85. create_layer(data + width * height * i,dir);
  86. fprintf(stdout,"%.1f prescent completer",(float)(i + 1) / (float)depth * 100.0);
  87. fflush(stdout);
  88. }
  89. printf("n");
  90. Texture::save_3d(name,data,width,height,depth,Texture::LUMINANCE);
  91. delete data;
  92. }
  93. int width,height;
  94. float *hmap;
  95. };
  96. /*
  97.  */
  98. vec3 getCubeVector(int i,int size,int x,int y) {
  99. float s = ((float)x + 0.5) / (float)size * 2.0 - 1.0;
  100. float t = ((float)y + 0.5) / (float)size * 2.0 - 1.0;
  101. vec3 v;
  102. switch(i) {
  103. case 0: v = vec3(1.0,-t,-s); break;
  104. case 1: v = vec3(-1.0,-t,s); break;
  105. case 2: v = vec3(s,1.0,t); break;
  106. case 3: v = vec3(s,-1.0,-t); break;
  107. case 4: v = vec3(s,-t,1.0); break;
  108. case 5: v = vec3(-s,-t,-1.0); break;
  109. }
  110. v.normalize();
  111. return v;
  112. }
  113. int main(int argc,char **argv) {
  114. if(argc > 4) {
  115. char name[1024];
  116. strcpy(name,argv[1]);
  117. char *s = strrchr(name,'.');
  118. if(s) strcpy(s,".3d");
  119. else strcat(name,".3d");
  120. Horizon *horizon = new Horizon(argv[1],atof(argv[2]),atof(argv[3]));
  121. horizon->create(name,atoi(argv[4]));
  122. delete horizon;
  123. printf("%s -> %sn",argv[1],name);
  124. } else {
  125. printf("horizon texture generatorn");
  126. printf("usage: %s <heightmap> <size> <elevation> <depth>n",argv[0]);
  127. printf("written by Alexander Zaprjagaevn");
  128. printf("frustum@frustum.orgn");
  129. printf("http://frustum.orgn");
  130. }
  131. // create lookup cubemap texture
  132. /*char *names[] = {
  133. "data/horizon_px.tga",
  134. "data/horizon_nx.tga",
  135. "data/horizon_py.tga",
  136. "data/horizon_ny.tga",
  137. "data/horizon_pz.tga",
  138. "data/horizon_nz.tga",
  139. };
  140. int size = 128;
  141. unsigned char *data = new unsigned char[size * size * 4];
  142. for(int i = 0; i < 6; i++) {
  143. unsigned char *d = data;
  144. for(int y = 0; y < size; y++) {
  145. for(int x = 0; x < size; x++) {
  146. vec3 dir = getCubeVector(i,size,x,y);
  147. vec3 vec(dir.x,dir.y,0);
  148. vec.normalize();
  149. float h = acos(vec3(0,1,0) * vec) / (2.0 * PI);
  150. if(vec.x < 0) h = 1.0 - h;
  151. *d++ = (unsigned char)(h * 255.0);
  152. *d++ = (unsigned char)((1.0 - vec * dir) * 255.0);
  153. *d++ = 0;
  154. *d++ = 255;
  155. }
  156. }
  157. Texture::save_tga(names[i],data,size,size);
  158. }
  159. delete data;*/
  160. return 0;
  161. }