Morph-SynRJ
view efx_rub.cxx @ 0:22de913c2d84
morph-synrj intro
| author | "Cedric Pinson <cedric.pinson@alcove.fr> <mornifle@plopbyte.net>" |
|---|---|
| date | Tue Nov 27 15:23:52 2007 +0100 (2007-11-27) |
| parents | |
| children |
line source
1 #include "efx_rub.h"
2 #include "sys_assert.h"
3 #include "mth_vector3.h"
4 #include "gl_header.h"
5 #include "cmn_intro.h"
6 #include "cmn_texture.h"
8 void efxRubShape_t::Init(int _xres,int _yres)
9 {
10 cmnSquareShape_t::Init(_xres,_yres);
11 }
14 void efxRubShape_t::Generate(int _nbElements,const char** _text,float _alpha,
15 GLuint _texture,int _xTex,int _yTex,
16 float _radius,float _length)
17 {
18 SYS_ASSERT(vertexes && normals);
20 uchar* maps=new uchar[_xTex*_yTex*4];
21 SYS_ASSERT(maps);
24 const float OffsetStepY=0.02;
26 cmnPushGLState();
27 cmnPushMatrix();
29 GLuint tmpTexture=_texture;
30 //float div=4.0;
31 //tmpTexture=txtCreatePerlin2d(texResX,texResY,div*1.0/texResX,div*1.0/texResX);
33 cmnClearScreen(0,0,0,1);
34 cmnSetPlanarView();
36 glDisable(GL_CULL_FACE);
38 glDisable(GL_DEPTH_TEST);
39 glColor3f(1,1,1);
41 // draw the texture
42 txtBindTexture2d(tmpTexture,0);
43 glBegin(GL_QUADS);
44 for (int i=0;i<1;i++) {
45 //glColor4ub(0,0,0,0);
46 glTexCoord2f(0,0);
47 glVertex2f(0,_yTex);
49 //glColor4ub(0,0,0,0);
50 glTexCoord2f(1,0);
51 glVertex2f(_xTex,_yTex);
53 //glColor4ub(167,92,5,255);
54 glTexCoord2f(1,1);
55 glVertex2f(_xTex,0);
57 //glColor4ub(167,92,5,255);
58 glTexCoord2f(0,1);
59 glVertex2f(0,0);
60 }
61 glEnd();
62 txtUnBindTexture2d(0);
64 glEnable(GL_BLEND);
65 glBlendFunc(GL_ONE,GL_ONE);
67 // draw the text
68 font->SetScaleY(3.0);
70 glColor4f(_alpha,_alpha,_alpha,1);
71 float sizey=_nbElements*(font->SizeOfCharY()+OffsetStepY*_yTex);
72 float starty=(_yTex-sizey)/2+OffsetStepY*_yTex;
73 SYS_ASSERT(starty>0);
74 //float sizex=(_nbElement+OffsetStepX*_nbElement)*font->SizeOfCharY();
76 for (i=0;i<_nbElements;i++) {
77 font->Print(0,starty+(i*(OffsetStepY*_yTex+font->SizeOfCharY())),_text[i]);
78 }
80 glColor4f(1,1,1,1);
81 font->SetScale(1.0);
83 glFlush();
85 txtGetTextureFromBackBuffer(maps,0,0,_xTex,_yTex);
87 cmnPopMatrix();
88 cmnPopGLState();
94 const double one_on_xsection=1.0/ResX();
95 const double one_on_ysection=_length*1.0/ResY();
97 const double one_on_xTexSection=_xTex*1.0/ResX();
98 const double one_on_yTexSection=_yTex*1.0/ResY();
100 mth::Vector3_t tmp;
101 for (i=0;i<ResY();i++)
102 for (int s=0; s < ResX(); s++) {
103 tmp.Init(mth::Sin(2 * mth::PI * s * one_on_xsection),
104 -_length*0.5+i*one_on_ysection,
105 mth::Cos(2 * mth::PI * s * one_on_xsection));
107 vertexes[s+i*ResX()]=tmp;
108 tmp[1]=0;
109 tmp.Normalize();
111 // todo: improve quality using a bilinear value
112 int x=(int)(s*one_on_xTexSection);
113 int y=(int)(i*one_on_yTexSection);
115 int sum=0;
116 // sum+=_scalePixelMap*maps[(x+y*texResX)*4+0];
117 sum+=maps[(x+y*_xTex)*4+1];
118 sum+=maps[(x+y*_xTex)*4+2];
119 sum+=maps[(x+y*_xTex)*4+3];
120 float a=_radius*sum*1.0/3.0/255.0;
121 vertexes[s+i*ResX()]+=tmp*a;
122 }
124 // compute normals
125 for (i=0;i<ResY();i++)
126 for (int s=0; s < ResX(); s++) {
127 tmp=GetNormalFace(s-1,i-1);
128 tmp+=GetNormalFace(s,i-1);
129 tmp+=GetNormalFace(s-1,i);
130 tmp+=GetNormalFace(s,i);
131 tmp.Normalize();
132 normals[s+i*ResX()]=tmp;
133 }
135 delete [] maps;
136 }
139 void efxRubShape_t::Kill()
140 {
141 //glDeleteTextures(1,&texture);
142 }
145 // return the normal of the given face
146 mth::Vector3_t efxRubShape_t::GetNormalFace(int _i,int _j)
147 {
148 #define GetVertex(i,j) vertexes[((i)+ResX())%ResX()+(((j)+ResY())%ResY())*ResX()]
149 mth::Vector3_t v1=GetVertex((_i),(_j+1))-GetVertex((_i),(_j));
150 mth::Vector3_t v2=GetVertex((_i+1),_j)-GetVertex((_i),(_j));
152 mth::Vector3_t v3=GetVertex((_i+1),_j)-GetVertex((_i+1),(_j+1));
153 mth::Vector3_t v4=GetVertex(_i,(_j+1))-GetVertex((_i+1),(_j+1));
155 #undef GetVertex
157 mth::Vector3_t result;
158 result=v1.Cross(v2);
159 result+=v3.Cross(v4);
160 result.Normalize();
161 return -result;
162 }
166 void efxRubShape_t::Draw()
167 {
168 typedef int* IntPtr_t;
171 SYS_ASSERT(uvs && vertexes && normals);
173 int i,j;
174 GLenum mode=GL_QUAD_STRIP;
175 float a[2];
176 txtBindTexture2d(textureBase,0);
178 FixForVArray();
179 EnableArray();
181 for (i=0;i<Indexes()->nbBuffers;i++)
182 glDrawElements(mode,Indexes()->sizeOfBuffer,GL_UNSIGNED_INT,Indexes()->indexes[i]);
184 DisableArray();
185 txtUnBindTexture2d(0);
187 }
189 void efxRubShape_t::DrawRow(int _row) const
190 {
191 SYS_ASSERT(uvs && vertexes && normals);
193 int i,j;
194 GLenum mode=GL_QUAD_STRIP;
195 float a[2];
196 txtBindTexture2d(textureBase,0);
198 int index;
199 int index1;
200 j=_row;
201 glBegin(mode);
203 for (i=0; i<resx; i++) {
204 index=i+j*resx;
205 glNormal3fv(normals[index]);
206 glTexCoord2fv(uvs[index]);
207 glVertex3fv(vertexes[index]);
209 index+=resx;
210 glNormal3fv(normals[index]);
211 glTexCoord2fv(uvs[index]);
212 glVertex3fv(vertexes[index]);
213 }
216 index1=j*resx;
217 index=resx-1+index1;
218 glNormal3fv(normals[index1]);
219 a[0]=uvs[index][0]+(uvs[index-1][0]-uvs[index-2][0]);
220 a[1]=uvs[index][1]+(uvs[index-1][1]-uvs[index-2][1]);
221 glTexCoord2fv(a);
222 glVertex3fv(vertexes[index1]);
224 index1+=resx;
225 index=resx-1+index1;
226 glNormal3fv(normals[index1]);
227 a[0]=uvs[index][0]+(uvs[index][0]-uvs[index][0]);
228 a[1]=uvs[index][1]+(uvs[index][1]-uvs[index][1]);
229 glTexCoord2fv(a);
230 glVertex3fv(vertexes[index1]);
231 glEnd();
232 txtUnBindTexture2d(0);
234 }
243 efxRub_t::efxRub_t()
244 {
245 rubbers=0;
246 nbRubbers=0;
247 uvs=0;
248 }
251 void efxRub_t::Init(int _nbBuffers,int _xres,int _yres)
252 {
253 if (rubbers)
254 delete [] rubbers;
255 nbRubbers=_nbBuffers;
256 rubbers=new efxRubShape_t[nbRubbers];
258 rubbers[0].Init(_xres,_yres);
259 uvs=rubbers[0].GetNewUVsBuffer();
260 cmnSquareShape_t::IndexBuffers_t* idx=rubbers[0].GetNewIndexBuffer();
261 rubbers[0].SetUVs(uvs);
262 rubbers[0].SetIndexes(idx);
264 //uvs=new mth::Vector2_t[_xres*_yres];
265 for (int i=0;i<_xres;i++)
266 for (int j=0;j<_yres;j++) {
267 uvs[i+j*_xres][0]=i*1.0/_xres;
268 uvs[i+j*_xres][1]=j*1.0/_yres;
269 }
270 SYS_ASSERT(uvs);
272 for (i=1;i<nbRubbers;i++) {
273 rubbers[i].Init(_xres,_yres);
274 rubbers[i].SetUVs(uvs);
275 rubbers[i].SetIndexes(idx);
276 }
278 morph.Init(_xres,_yres);
279 morph.SetUVs(uvs);
280 morph.SetIndexes(idx);
281 }
284 void efxRub_t::GenerateRandom(int _xTex,int _yTex,float _radius,float _length)
285 {
287 const int nbTextes=3;
288 const char* text[nbTextes]={
289 "syn[rj] [psc80]",
290 "[kohai] [evil]",
291 "[mryoung] [stv]"};
294 float div=2.0;
295 GLuint tmpTexture;
296 int freq;
297 float amp;
298 for (int i=0;i<nbRubbers;i++) {
300 freq=1+(int)(8.0*mth::Rand()/(mth::RANDOM_MAX+1.0));
301 amp=0.5+0.2*mth::Rand()/(mth::RANDOM_MAX+1.0);
303 tmpTexture=txtCreatePerlin2d(_xTex,_yTex,div*1.0/_xTex,div*1.0/_yTex,amp,freq);
304 SYS_ASSERT(tmpTexture);
305 rubbers[i].Generate(nbTextes,text,0.2,tmpTexture,_xTex,_yTex,_radius,_length);
306 glDeleteTextures(1,&tmpTexture);
307 }
309 }
312 void efxRub_t::Generate(int _xTex,int _yTex,float _radius,float _length,int _shape,const char** _elements,int _nbElements)
313 {
314 SYS_ASSERT(_shape>=0 && _shape<nbRubbers);
315 const int nbTextes=_nbElements;
317 float div=2.0;
318 GLuint tmpTexture;
319 int freq;
320 float amp;
321 // for (int i=0;i<nbRubbers;i++) {
323 freq=1+(int)(8.0*mth::Rand()/(mth::RANDOM_MAX+1.0));
324 amp=0.5+0.2*mth::Rand()/(mth::RANDOM_MAX+1.0);
326 // big hack we generate a big shape for the second call
327 static int nbCallFromOut=0;
328 nbCallFromOut++;
330 if (nbCallFromOut==2) // big hack
331 tmpTexture=txtCreatePerlin2d(_xTex,_yTex,div*1.0/_xTex,div*1.0/_yTex,0.8,5);
332 else
333 tmpTexture=txtCreatePerlin2d(_xTex,_yTex,div*1.0/_xTex,div*1.0/_yTex,amp,freq);
334 SYS_ASSERT(tmpTexture);
335 rubbers[_shape].Generate(nbTextes,_elements,0.2,tmpTexture,_xTex,_yTex,_radius,_length);
336 glDeleteTextures(1,&tmpTexture);
337 // }
339 }
344 void efxRub_t::SetTexture(GLuint _id)
345 {
347 for (int i=0;i<nbRubbers;i++)
348 rubbers[i].SetTexture(_id);
349 morph.SetTexture(_id);
350 }
353 void efxRub_t::MakeMorph(int _shape1,int _shape2,float _t)
354 {
355 SYS_ASSERT(_shape1>=0 && _shape1<nbRubbers);
356 SYS_ASSERT(_shape2>=0 && _shape2<nbRubbers);
358 morph.MakeMorphFrom(rubbers[_shape1],rubbers[_shape2],_t);
359 }
