Panda3D
|
00001 // Filename: MeshDrawer2D.cxx 00002 // Created by: treeform (19dec08) 00003 // 00004 //////////////////////////////////////////////////////////////////// 00005 // 00006 // PANDA 3D SOFTWARE 00007 // Copyright (c) Carnegie Mellon University. All rights reserved. 00008 // 00009 // All use of this software is subject to the terms of the revised BSD 00010 // license. You should have received a copy of this license along 00011 // with this source code in a file named "LICENSE." 00012 // 00013 //////////////////////////////////////////////////////////////////// 00014 00015 #include "meshDrawer2D.h" 00016 00017 #include "geomVertexFormat.h" 00018 #include "geomVertexArrayFormat.h" 00019 #include "geomVertexData.h" 00020 #include "geomVertexWriter.h" 00021 #include "geomVertexRewriter.h" 00022 #include "camera.h" 00023 #include "boundingSphere.h" 00024 #include "geomTristrips.h" 00025 #include "geomTriangles.h" 00026 #include "geom.h" 00027 #include "geomNode.h" 00028 #include "pnmPainter.h" 00029 #include "pnmBrush.h" 00030 #include "lvecBase4.h" 00031 #include "lvector3.h" 00032 #include "pandaNode.h" 00033 00034 TypeHandle MeshDrawer2D::_type_handle; 00035 00036 00037 #define RANDF ((float) rand() / (float) 0x7fffffff) 00038 00039 00040 //////////////////////////////////////////////////////////////////// 00041 // Function: MeshDrawer2D::generator 00042 // Access: Private 00043 // Description: Creates a system with a given budget. 00044 //////////////////////////////////////////////////////////////////// 00045 void MeshDrawer2D::generator(int budget) { 00046 // create enough triangles for budget: 00047 _vdata = new GeomVertexData(_root.get_name(), GeomVertexFormat::get_v3c4t2(), Geom::UH_static);//UH_dynamic); 00048 GeomVertexWriter *tvertex = new GeomVertexWriter(_vdata, "vertex"); 00049 GeomVertexWriter *tuv = new GeomVertexWriter(_vdata, "texcoord"); 00050 GeomVertexWriter *tcolor = new GeomVertexWriter(_vdata, "color"); 00051 _prim = new GeomTriangles(Geom::UH_static); 00052 00053 // iterate and fill _up a geom with random data so that it will 00054 // not be optimized out by panda3d system 00055 for(int i = 0; i < budget; i++) { 00056 for( int vert = 0; vert < 4; vert++) { 00057 00058 LVector3f vec3 = LVector3f(RANDF+10000,RANDF,RANDF); 00059 LVector4f vec4 = LVector4f(RANDF,RANDF,RANDF,0); 00060 LVector2f vec2 = LVector2f(RANDF,RANDF); 00061 00062 tvertex->add_data3f(vec3); 00063 tcolor->add_data4f(vec4); 00064 tuv->add_data2f(vec2); 00065 00066 } 00067 00068 _prim->add_vertices(i*4+0, i*4+1, i*4+2); 00069 _prim->close_primitive(); 00070 00071 _prim->add_vertices(i*4+1, i*4+2, i*4+3); 00072 _prim->close_primitive(); 00073 00074 } 00075 // create our node and attach it to this node path 00076 _geom = new Geom(_vdata); 00077 _geom->add_primitive(_prim); 00078 _geomnode = new GeomNode("__MeshDrawer_GeomNode"); 00079 _geomnode->add_geom(_geom); 00080 _root.attach_new_node(_geomnode); 00081 _last_clear_index = budget; 00082 00083 delete tvertex; 00084 delete tuv; 00085 delete tcolor; 00086 } 00087 00088 //////////////////////////////////////////////////////////////////// 00089 // Function: MeshDrawer2D::begin 00090 // Access: Published 00091 // Description: Opens up the geom for drawing, dont forget to call 00092 // MeshDrawer2D::end() 00093 //////////////////////////////////////////////////////////////////// 00094 void MeshDrawer2D::begin() { 00095 00096 // recreate our rewriters 00097 if (_vertex != NULL) delete _vertex; 00098 if (_uv != NULL) delete _uv; 00099 if (_color != NULL) delete _color; 00100 00101 _vertex = new GeomVertexRewriter(_vdata, "vertex"); 00102 _uv = new GeomVertexRewriter(_vdata, "texcoord"); 00103 _color = new GeomVertexRewriter(_vdata, "color"); 00104 _dprim = _prim->decompose(); 00105 00106 // reseta our clearning indexes 00107 _start_clear_index = 0; 00108 _end_clear_index = _budget; 00109 _clear_index = _start_clear_index; 00110 00111 } 00112 00113 //////////////////////////////////////////////////////////////////// 00114 // Function: MeshDrawer2D::end 00115 // Access: Published 00116 // Description: Finish the drawing and clearing off the remaining 00117 // vertexes. 00118 //////////////////////////////////////////////////////////////////// 00119 void MeshDrawer2D::end() { 00120 00121 // clear the unused triangles at the end of the buffer 00122 for(int i = _clear_index ; i < _last_clear_index; i ++ ) { 00123 _vertex->add_data3f(0,0,0); 00124 _vertex->add_data3f(0,0,0); 00125 _vertex->add_data3f(0,0,0); 00126 _vertex->add_data3f(0,0,0); 00127 } 00128 // dont clear more then you have too 00129 _last_clear_index = _clear_index; 00130 00131 // delete the re writers 00132 delete _vertex; _vertex = NULL; 00133 delete _uv; _uv = NULL; 00134 delete _color; _color = NULL; 00135 00136 } 00137 00138 00139 00140 //////////////////////////////////////////////////////////////////// 00141 // Function: MeshDrawer2D::quad 00142 // Access: Published 00143 // Description: Draws a tiled rectangle, size of tiles is in 00144 // us and vs 00145 //////////////////////////////////////////////////////////////////// 00146 void MeshDrawer2D:: 00147 rectangle_tiled(float x, float y, float w, float h, 00148 float u, float v, float us, float vs, 00149 LVector4f color 00150 ) { 00151 00152 float x_fit = w/us; 00153 float y_fit = h/vs; 00154 float x_pos = x; 00155 00156 while (x_fit > 0){ 00157 float y_pos = y; 00158 y_fit = h/vs; 00159 while (y_fit > 0){ 00160 00161 float fixed_us = us; 00162 float fixed_vs = vs; 00163 00164 // we are cuttin in the middle of a tile x direction 00165 if (x_fit < 1){ 00166 fixed_us = w; 00167 while (fixed_us > us){ 00168 fixed_us -= us; 00169 } 00170 } 00171 00172 // we are cuttin in the middel of a tile y directon 00173 if (y_fit < 1){ 00174 fixed_vs = h; 00175 while (fixed_vs > vs){ 00176 fixed_vs -= vs; 00177 } 00178 } 00179 00180 rectangle(x_pos,y_pos,fixed_us,fixed_vs,u,v,fixed_us,fixed_vs,color); 00181 00182 y_pos += vs; 00183 y_fit -= 1; 00184 } 00185 x_pos += us; 00186 x_fit -= 1; 00187 } 00188 00189 00190 } 00191 00192 00193 //////////////////////////////////////////////////////////////////// 00194 // Function: MeshDrawer2D::quad 00195 // Access: Published 00196 // Description: Draws a 2d rectangle, with borders and corders, 00197 // taken from the surrounding texture 00198 //////////////////////////////////////////////////////////////////// 00199 void MeshDrawer2D:: 00200 rectangle_border( 00201 float x, float y, float w, float h, 00202 float r, float t, float l, float b, 00203 float tr, float tt, float tl, float tb, 00204 float u, float v, float us, float vs, 00205 LVector4f color){ 00206 00207 rectangle(x,y,w,h,u,v,us,vs,color); // center 00208 00209 // -------------- ----------------- ------ 00210 rectangle(x, y+h, w, t, u, v+vs, us, tt, color); // N 00211 rectangle(x, y-b, w, b, u, v-tb, us, tb, color); // S 00212 00213 00214 rectangle(x-l, y, l, h, u-tl, v, tl, vs, color); // W 00215 rectangle(x+w, y, r, h, r, v, tr, vs, color); // E 00216 00217 /* 00218 rectangle(x-l, y+h, l, t, u-tl, v, tl, tt, color); // NW 00219 rectangle(x-l, y-b, l, b, u-tl, v-tb, tl, tb, color); // SW 00220 rectangle(x+w, y+h, r, t, u, v, tr, tt, color); // NE 00221 rectangle(x+w, y-b, r, b, u, v-tb, tr, tb, color); // SE 00222 */ 00223 } 00224 00225 //////////////////////////////////////////////////////////////////// 00226 // Function: MeshDrawer2D::quad 00227 // Access: Published 00228 // Description: Draws a 2d rectangle, with borders and corders, 00229 // taken from the surrounding texture 00230 //////////////////////////////////////////////////////////////////// 00231 void MeshDrawer2D:: 00232 rectangle_border_tiled( 00233 float x, float y, float w, float h, 00234 float r, float t, float l, float b, 00235 float tr, float tt, float tl, float tb, 00236 float u, float v, float us, float vs, 00237 LVector4f color){ 00238 00239 rectangle_tiled(x,y,w,h,u,v,us,vs,color); // center 00240 00241 rectangle_tiled(x, y+h, w, t, u, v+t, us, t, color); // N 00242 rectangle_tiled(x, y-b, w, b, u, v-b, us, b, color); // S 00243 rectangle_tiled(x-l, y, l, h, u-l, v, l, vs, color); // W 00244 rectangle_tiled(x+w, y, r, h, r, v, r, vs, color); // E 00245 00246 rectangle_tiled(x-l, y+h, l, t, u-l, v, l, t, color); // NW 00247 rectangle_tiled(x-l, y-b, l, b, u-l, v-b, l, b, color); // SW 00248 rectangle_tiled(x+w, y+h, r, t, u, v, r, t, color); // NE 00249 rectangle_tiled(x+w, y-b, r, b, u, v-b, r, b, color); // SE 00250 }