Morph-SynRJ
view cmn_shape.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 "cmn_shape.h"
2 #include "sys_assert.h"
3 #include "mth_vector3.h"
4 #include "gl_header.h"
5 #include "cmn_intro.h"
9 void cmnSquareShape_t::Init(int _resx,int _resy)
10 {
12 Kill();
14 nbVertexes=_resx*_resy;
15 vertexes=new mth::Vector3_t[nbVertexes+_resy]; // alloc more for vertex array trick
16 normals=new mth::Vector3_t[nbVertexes+_resy];
17 resx=_resx;
18 resy=_resy;
20 #if 0
21 if (GL_ARB_vertex_buffer_object) {
22 glGen
23 }
24 #endif
26 }
29 void cmnSquareShape_t::Kill()
30 {
31 if (vertexes)
32 delete [] vertexes;
33 vertexes=0;
35 if (normals)
36 delete [] normals;
37 normals=0;
39 if (indexes)
40 delete [] indexes;
41 indexes=0;
43 }
46 void cmnSquareShape_t::MakeMorphFrom(cmnSquareShape_t& _shape1,cmnSquareShape_t& _shape2,float _t)
47 {
49 if (_t<1e-3) {
50 memcpy(vertexes,_shape1.vertexes,sizeof(mth::Vector3_t)*nbVertexes);
51 memcpy(normals,_shape1.normals,sizeof(mth::Vector3_t)*nbVertexes);
52 } else if (_t>1.0-1e-3) {
53 memcpy(vertexes,_shape2.vertexes,sizeof(mth::Vector3_t)*nbVertexes);
54 memcpy(normals,_shape2.normals,sizeof(mth::Vector3_t)*nbVertexes);
55 }
57 mth::Vector3_t tmp;
58 float a;
59 for (int i=0;i<nbVertexes;i++) {
60 vertexes[i]=_shape1.vertexes[i];
61 tmp=_shape2.vertexes[i];
62 tmp-=vertexes[i];
63 tmp*=_t;
64 vertexes[i]+=tmp;
66 normals[i]=_shape1.normals[i];
67 tmp=_shape2.normals[i];
68 tmp-=normals[i];
69 tmp*=_t;
70 normals[i]+=tmp;
71 a=normals[i].MagSqr();
72 if (a>1e-4)
73 normals[i]*=1.0/mth::Sqrt(a);
74 }
76 }
79 void cmnSquareShape_t::FixForVArray()
80 {
82 int index;
85 for (int i=0;i<resy;i++) {
86 index=0+i*resx;
87 vertexes[nbVertexes+i]=vertexes[index];
88 normals[nbVertexes+i]=normals[index];
90 if (uvs) {
91 index=resx-1+i*resx;
92 uvs[nbVertexes+i]=uvs[index]+(uvs[(index-1+resx)%resx]-uvs[(index-2+resx)%resx]);
93 }
94 }
95 }
99 mth::Vector2_t* cmnSquareShape_t::GetNewUVsBuffer()
100 {
101 return new mth::Vector2_t[nbVertexes+resy];
102 }
106 void cmnSquareShape_t::EnableArray()
107 {
108 glEnableClientState(GL_VERTEX_ARRAY);
109 glVertexPointer(3,GL_FLOAT,0,vertexes);
111 glEnableClientState(GL_NORMAL_ARRAY);
112 glNormalPointer(GL_FLOAT,0,normals);
114 if (uvs) {
115 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
116 glTexCoordPointer(2,GL_FLOAT,0,uvs);
117 }
118 }
120 void cmnSquareShape_t::DisableArray()
121 {
122 glDisableClientState(GL_VERTEX_ARRAY);
123 glDisableClientState(GL_NORMAL_ARRAY);
124 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
125 }
128 cmnSquareShape_t::IndexBuffers_t* cmnSquareShape_t::GetNewIndexBuffer()
129 {
130 // and fill the indexes buffer
131 indexes=new IndexBuffers_t(resy-1,2*(resx+1));
132 for (int j=0; j<resy-1; j++) {
133 int curi=0;
134 for (int i=0; i<resx; i++) {
135 indexes->indexes[j][curi++]=i+j*resx;
136 indexes->indexes[j][curi++]=i+(j+1)*resx;
137 }
138 indexes->indexes[j][curi++]=nbVertexes+j+0;
139 indexes->indexes[j][curi++]=nbVertexes+j+1;
140 }
142 return indexes;
143 }
