35 PN_stdfloat randFloat() {
36 return ((PN_stdfloat)rand() / (PN_stdfloat)RAND_MAX);
42 void MeshDrawer::generator(
int budget) {
45 _vdata->unclean_set_num_rows(budget * 3);
55 for (
int i = 0; i < budget; i++) {
56 for (
int vert = 0; vert < 3; vert++) {
57 LVector3 vec3 = LVector3(randFloat()+1000,randFloat(),randFloat())*.001;
58 LVector4 vec4 = LVector4(1,1,1,randFloat());
59 LVector2 vec2 = LVector2(0,randFloat());
60 tvertex.set_data3(vec3);
61 tcolor.set_data4(vec4);
63 tnormal.set_data3(vec3);
70 _prim->add_next_vertices(budget * 3);
71 _prim->close_primitive();
72 _geom =
new Geom(_vdata);
73 _geom->add_primitive(_prim);
74 if (_geomnode ==
nullptr) {
75 _geomnode =
new GeomNode(
"__MeshDrawer_GeomNode");
78 _geomnode->remove_all_geoms();
80 _geomnode->add_geom(_geom);
81 _last_clear_index = budget;
101 _b1 = - _right - _up;
104 _b4 = - _right + _up;
107 if (_vertex !=
nullptr)
delete _vertex;
108 if (_normal !=
nullptr)
delete _normal;
109 if (_uv !=
nullptr)
delete _uv;
110 if (_color !=
nullptr)
delete _color;
112 if (_vdata ==
nullptr) {
120 _dprim = _prim->decompose();
123 _start_clear_index = 0;
124 _end_clear_index = _budget;
125 _clear_index = _start_clear_index;
135 for(
int i = _clear_index ; i < _last_clear_index; i ++ ) {
141 _last_clear_index = _clear_index;
144 delete _vertex; _vertex =
nullptr;
145 delete _uv; _uv =
nullptr;
146 delete _normal; _normal =
nullptr;
147 delete _color; _color =
nullptr;
156 const LVector4 &color, PN_stdfloat rotation) {
158 rotation = rotation / 57.29578;
160 LVector3 v1 = pos + _b1*size*sin(rotation) + _b2*size*cos(rotation);
161 LVector3 v2 = pos + _b2*size*sin(rotation) + _b3*size*cos(rotation);
162 LVector3 v3 = pos + _b3*size*sin(rotation) + _b4*size*cos(rotation);
163 LVector3 v4 = pos + _b4*size*sin(rotation) + _b1*size*cos(rotation);
165 PN_stdfloat u = frame.get_x();
166 PN_stdfloat v = frame.get_y();
167 PN_stdfloat us = frame.get_z();
168 PN_stdfloat vs = frame.get_w();
171 v1, color, LVector2(u,v),
172 v2, color, LVector2(u+us,v),
173 v3, color, LVector2(u+us,v+vs));
175 v3, color, LVector2(u+us,v+vs),
176 v4, color, LVector2(u,v+vs),
177 v1, color, LVector2(u,v));
185 const LVector4 &frame2, PN_stdfloat blend, PN_stdfloat size,
const LVector4 &color, PN_stdfloat rotation) {
188 PN_stdfloat original_w = c2.get_w();
189 c2.set_w((1.f-blend)*original_w);
190 particle(pos,frame1,size,c2,rotation);
191 c2.set_w(blend*original_w);
192 particle(pos,frame2,size,c2,rotation);
201 const LVector4 &_color) {
203 LVector3 v1 = pos + _b1*size;
204 LVector3 v2 = pos + _b2*size;
205 LVector3 v3 = pos + _b3*size;
206 LVector3 v4 = pos + _b4*size;
208 PN_stdfloat u = frame.get_x();
209 PN_stdfloat v = frame.get_y();
210 PN_stdfloat us = frame.get_z();
211 PN_stdfloat vs = frame.get_w();
214 v1, _color, LVector2(u,v),
215 v2, _color, LVector2(u+us,v),
216 v3, _color, LVector2(u+us,v+vs));
218 v3, _color, LVector2(u+us,v+vs),
219 v4, _color, LVector2(u,v+vs),
220 v1, _color, LVector2(u,v));
229 PN_stdfloat thickness,
const LVector4 &color) {
240 PN_stdfloat thickness,
const LVector4 &color) {
242 PN_stdfloat u = frame.get_x();
243 PN_stdfloat v = frame.get_y();
244 PN_stdfloat us = frame.get_z();
245 PN_stdfloat vs = frame.get_w();
247 LVector3 v1 = start - _up*thickness;
248 LVector3 v2 = stop - _up*thickness;
249 LVector3 v3 = stop + _up*thickness;
250 LVector3 v4 = start + _up*thickness;
252 tri(v1, color, LVector2(u,v),
253 v2, color, LVector2(u+us,v),
254 v3, color, LVector2(u+us,v+vs));
255 tri(v3, color, LVector2(u+us,v+vs),
256 v4, color, LVector2(u,v+vs),
257 v1, color, LVector2(u,v));
259 v1 = start - _right*thickness;
260 v2 = stop - _right*thickness;
261 v3 = stop + _right*thickness;
262 v4 = start + _right*thickness;
264 tri(v1, color, LVector2(u,v),
265 v2, color, LVector2(u+us,v),
266 v3, color, LVector2(u+us,v+vs));
267 tri(v3, color, LVector2(u+us,v+vs),
268 v4, color, LVector2(u,v+vs),
269 v1, color, LVector2(u,v));
282 const LVector4 &frame, PN_stdfloat thickness_start,
const LVector4 &color_start,
283 PN_stdfloat thickness_stop,
const LVector4 &color_stop) {
285 PN_stdfloat u = frame.get_x();
286 PN_stdfloat v = frame.get_y();
287 PN_stdfloat us = frame.get_z();
288 PN_stdfloat vs = frame.get_w();
290 LVector3 v1 = start - _up*thickness_start;
291 LVector3 v2 = stop - _up*thickness_stop;
292 LVector3 v3 = stop + _up*thickness_stop;
293 LVector3 v4 = start + _up*thickness_start;
295 tri(v1, color_start, LVector2(u,v),
296 v2, color_stop, LVector2(u+us,v),
297 v3, color_stop, LVector2(u+us,v+vs));
298 tri(v3, color_stop, LVector2(u+us,v+vs),
299 v4, color_start, LVector2(u,v+vs),
300 v1, color_start, LVector2(u,v));
302 v1 = start - _right*thickness_start;
303 v2 = stop - _right*thickness_stop;
304 v3 = stop + _right*thickness_stop;
305 v4 = start + _right*thickness_start;
307 tri(v1, color_start, LVector2(u,v),
308 v2, color_stop, LVector2(u+us,v),
309 v3, color_stop, LVector2(u+us,v+vs));
310 tri(v3, color_stop, LVector2(u+us,v+vs),
311 v4, color_start, LVector2(u,v+vs),
312 v1, color_start, LVector2(u,v));
320 const LVector3 &pos,
const LVector4 &frame, PN_stdfloat size,
const LVector4 &_color,
321 int seed,
int number, PN_stdfloat distance) {
323 LVector3 relative_pos;
324 for(
int i = 0; i < number; i++) {
325 relative_pos = LVector3(randFloat()-.5f,randFloat()-.5f,randFloat()-.5f);
326 relative_pos.normalize();
327 relative_pos *= randFloat()*distance;
328 particle(relative_pos+pos,frame,size,_color,randFloat()*360.0f);
336 void MeshDrawer::stream(
const LVector3 &start,
const LVector3 &stop,
const LVector4 &frame, PN_stdfloat size,
const LVector4 &_color,
337 int number, PN_stdfloat offset) {
339 offset = offset-floor(offset);
340 LVector3 relative_pos = stop;
341 LVector3 vec = stop - start;
342 PN_stdfloat distance = vec.length();
344 for(
int i = 0; i < number; i++) {
345 relative_pos = start + vec * ((i+offset)*(distance/PN_stdfloat(number)));
346 billboard(relative_pos,frame,size,_color);
361 LVector4 color = LVector4(1,1,1,1);
372 for(
int j=0; j<geomNode->get_num_geoms(); j++) {
373 CPT(
Geom) geom = geomNode->get_geom(j);
377 for (
size_t k = 0; k < geom->get_num_primitives(); ++k) {
382 for(
int p=0; p < _prim->get_num_primitives();p++) {
383 int s = _prim->get_primitive_start(p);
384 int e = _prim->get_primitive_end(p);
388 for(
int idx=s; idx<e; idx++) {
389 int vidx = _prim->get_vertex(idx);
393 current_node_path,prim_vertex_reader->
get_data3());
394 uv[indx_over] = prim_uv_reader->
get_data2();
396 if (indx_over > 2)
break;
400 tri(vec[0],color,uv[0],
405 if( _clear_index > _end_clear_index)
return;
408 delete prim_vertex_reader;
409 delete prim_uv_reader;
422 PN_stdfloat thickness,
const LVector4 &color) {
444 _last_thickness = thickness;
450 LVector3 start = _last_pos;
454 LPoint2 cam_start2d = LVector2();
456 LPoint2 cam_stop2d = LVector2();
459 DCAST_INTO_V(camera, _camera.
node());
462 lens->
project(cam_start3d, cam_start2d);
463 lens->
project(cam_stop3d, cam_stop2d);
465 LVector2 dif = cam_stop2d - cam_start2d;
466 PN_stdfloat rotation = atan2(dif.get_x(),dif.get_y());
468 LVector3 now_v1 = start + _b1*(PN_stdfloat)(thickness*sin(rotation)) + _b2*(PN_stdfloat)(thickness*cos(rotation));
469 LVector3 now_v4 = start + _b4*(PN_stdfloat)(thickness*sin(rotation)) + _b1*(PN_stdfloat)(thickness*cos(rotation));
470 LVector3 now_v2 = stop + _b2*(PN_stdfloat)(thickness*sin(rotation)) + _b3*(PN_stdfloat)(thickness*cos(rotation));
471 LVector3 now_v3 = stop + _b3*(PN_stdfloat)(thickness*sin(rotation)) + _b4*(PN_stdfloat)(thickness*cos(rotation));
485 LVector3 v1 = _last_v1;
486 LVector3 v2 = (_last_v2+now_v1)/2.0f;
487 LVector3 v3 = (_last_v3+now_v4)/2.0f;
488 LVector3 v4 = _last_v4;
491 PN_stdfloat u = frame.get_x();
492 PN_stdfloat v = frame.get_y();
493 PN_stdfloat us = frame.get_z();
494 PN_stdfloat vs = frame.get_w();
496 tri(v1, _last_color, LVector2(u,v),
497 v2, color, LVector2(u+us,v),
498 v3, color, LVector2(u+us,v+vs));
499 tri(v3, color, LVector2(u+us,v+vs),
500 v4, _last_color, LVector2(u,v+vs),
501 v1, _last_color, LVector2(u,v));
511 _last_thickness = thickness;
522 PN_stdfloat u = frame.get_x();
523 PN_stdfloat v = frame.get_y();
524 PN_stdfloat us = frame.get_z();
525 PN_stdfloat vs = frame.get_w();
527 tri(_last_v1, _last_color, LVector2(u,v),
528 _last_v2, color, LVector2(u+us,v),
529 _last_v3, color, LVector2(u+us,v+vs));
530 tri(_last_v3, color, LVector2(u+us,v+vs),
531 _last_v4, _last_color, LVector2(u,v+vs),
532 _last_v1, _last_color, LVector2(u,v));