Panda3D

Loading...
Searching...
No Matches
meshDrawer.h
Go to the documentation of this file.
1/**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file meshDrawer.h
10 * @author treeform
11 * @date 2008-12-19
12 * @author treeform
13 * @date 2010-01-12
14 */
15
16#ifndef MESHDRAWER_H
17#define MESHDRAWER_H
18
19#include "pandabase.h"
20#include "luse.h"
21#include "pandaNode.h"
22#include "pointerTo.h"
23#include "lpoint2.h"
24#include "lvecBase2.h"
25#include "pnmImage.h"
26#include "nodePath.h"
27#include "texture.h"
28#include "geomVertexFormat.h"
29#include "geomVertexArrayFormat.h"
30#include "geomVertexData.h"
31#include "geomVertexWriter.h"
32#include "geomVertexRewriter.h"
33#include "boundingVolume.h"
34
35#include "nodePathCollection.h"
36
37#include "geomTristrips.h"
38#include "geomTriangles.h"
39#include "geom.h"
40#include "geomNode.h"
41#include "nodePath.h"
42
43/**
44 * Mesh drawer creates a single geom object that can be shaped with different
45 * draw commands. This is an efficient way to render bunch of billboards,
46 * particles, fast changing triangles. Its implemented by recycling same geom
47 * over and over again. Max budget specifies how many triangles are allowed.
48 * Some uses of this class can be : particle system, radar icons, health bars,
49 * 2d icons, 2d ui, bullets, missile trails. Any that can be drawn with
50 * triangles can be drawn with this class. At the low level this uses the
51 * GeomVertexRewriter's. The internal geom consists of vertex, normal, uv and
52 * color channels.
53 */
54 class EXPCL_PANDA_GRUTIL MeshDrawer : public TypedObject {
55PUBLISHED:
56 INLINE MeshDrawer();
57 INLINE ~MeshDrawer();
58
59 INLINE void set_budget(int budget);
60 INLINE int get_budget();
61
62 INLINE NodePath get_root();
63
64 void begin(NodePath camera, NodePath render);
65 INLINE void tri(const LVector3 &v1, const LVector4 &c1, const LVector2 &uv1,
66 const LVector3 &v2, const LVector4 &c2, const LVector2 &uv2,
67 const LVector3 &v3, const LVector4 &c3, const LVector2 &uv3);
68
69 void particle(const LVector3 &pos, const LVector4 &frame, PN_stdfloat size, const LVector4 &color, PN_stdfloat rotation);
70 void blended_particle(const LVector3 &pos, const LVector4 &frame1, const LVector4 &frame2,
71 PN_stdfloat blend, PN_stdfloat size, const LVector4 &color, PN_stdfloat rotation);
72 void billboard(const LVector3 &pos, const LVector4 &frame, PN_stdfloat size, const LVector4 &color);
73 void segment(const LVector3 &start, const LVector3 &stop, const LVector4 &frame, PN_stdfloat thickness, const LVector4 &color);
74 void cross_segment(const LVector3 &start, const LVector3 &stop, const LVector4 &frame, PN_stdfloat thickness, const LVector4 &color);
75 void uneven_segment(const LVector3 &start, const LVector3 &stop,
76 const LVector4 &frame, PN_stdfloat thickness_start, const LVector4 &color_start,
77 PN_stdfloat thickness_stop, const LVector4 &color_stop);
78
79 void link_segment(const LVector3 &pos, const LVector4 &frame, PN_stdfloat thickness, const LVector4 &color);
80 void link_segment_end(const LVector4 &frame, const LVector4 &color);
81
82 void explosion(const LVector3 &pos, const LVector4 &frame, PN_stdfloat size, const LVector4 &color,
83 int seed, int number, PN_stdfloat distance);
84 void stream(const LVector3 &start, const LVector3 &stop, const LVector4 &frame, PN_stdfloat size, const LVector4 &color,
85 int number, PN_stdfloat offset);
86 void geometry(NodePath node);
87 void end();
88
89 private:
90
91 // use vars
92 NodePath _root;
93 NodePath _camera, _render;
94 int _budget;
95
96 // store regeneration geoms & nodes
97 PT(Geom) _geom;
98 PT(GeomNode) _geomnode;
99 PT(GeomVertexData) _vdata;
100 PT(GeomTriangles) _prim;
101 CPT(GeomPrimitive) _dprim;
102
103 // writers
104 GeomVertexRewriter *_vertex;
105 GeomVertexRewriter *_normal;
106 GeomVertexRewriter *_uv;
107 GeomVertexRewriter *_color;
108
109 // billboard vectors
110 LVector3 _eyePos;
111 LVector3 _b1, _b2, _b3, _b4;
112 LVector3 _up, _right;
113
114 // clear indexes
115 int _last_clear_index, _start_clear_index, _end_clear_index, _clear_index;
116
117 // used for curves
118 int _at_start;
119 LVector3 _last_v1,_last_v2,_last_v3,_last_v4,_last_pos;
120 PN_stdfloat _last_thickness;
121 LVector4 _last_color;
122
123 // bounding volume
124 PT(BoundingVolume) _bv;
125
126 // private create all the needed geoms
127 void generator(int budget);
128
129 public:
130 static TypeHandle get_class_type() {
131 return _type_handle;
132 }
133 static void init_type() {
134 TypedObject::init_type();
135 register_type(_type_handle, "MeshDrawer",
136 TypedObject::get_class_type());
137 }
138 virtual TypeHandle get_type() const {
139 return get_class_type();
140 }
141 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
142
143 private:
144 static TypeHandle _type_handle;
145
146};
147
148#include "meshDrawer.I"
149
150#endif /*MESHDRAWER_H*/
boundingVolume.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
BoundingVolume
This is an abstract class for any volume in any sense which can be said to define the locality of ref...
Definition boundingVolume.h:41
GeomNode
A node that holds Geom objects, renderable pieces of geometry.
Definition geomNode.h:34
GeomPrimitive
This is an abstract base class for a family of classes that represent the fundamental geometry primit...
Definition geomPrimitive.h:56
GeomTriangles
Defines a series of disconnected triangles.
Definition geomTriangles.h:23
GeomVertexData
This defines the actual numeric vertex data stored in a Geom, in the structure defined by a particula...
Definition geomVertexData.h:68
GeomVertexRewriter
This object provides the functionality of both a GeomVertexReader and a GeomVertexWriter,...
Definition geomVertexRewriter.h:33
Geom
A container for geometry primitives.
Definition geom.h:54
MeshDrawer::particle
void particle(const LVector3 &pos, const LVector4 &frame, PN_stdfloat size, const LVector4 &color, PN_stdfloat rotation)
Draws a particle that is sort of like a bill board but has an extra rotation component.
Definition meshDrawer.cxx:155
MeshDrawer::link_segment_end
void link_segment_end(const LVector4 &frame, const LVector4 &color)
Finish drawing linked segments, needs at least two calls to link_segment before it can end the linked...
Definition meshDrawer.cxx:525
MeshDrawer::explosion
void explosion(const LVector3 &pos, const LVector4 &frame, PN_stdfloat size, const LVector4 &color, int seed, int number, PN_stdfloat distance)
Draws number of particles in a sphere like emitter.
Definition meshDrawer.cxx:319
MeshDrawer::get_root
NodePath get_root()
Returns the root NodePath.
Definition meshDrawer.I:50
MeshDrawer::billboard
void billboard(const LVector3 &pos, const LVector4 &frame, PN_stdfloat size, const LVector4 &color)
Draws a billboard - particle with no rotation.
Definition meshDrawer.cxx:200
MeshDrawer::uneven_segment
void uneven_segment(const LVector3 &start, const LVector3 &stop, const LVector4 &frame, PN_stdfloat thickness_start, const LVector4 &color_start, PN_stdfloat thickness_stop, const LVector4 &color_stop)
Draws a segment a line with different thickness and color on both sides.
Definition meshDrawer.cxx:281
MeshDrawer::geometry
void geometry(NodePath node)
Draws the geometry that is inside this node path into the MeshDrawer object.
Definition meshDrawer.cxx:358
MeshDrawer::cross_segment
void cross_segment(const LVector3 &start, const LVector3 &stop, const LVector4 &frame, PN_stdfloat thickness, const LVector4 &color)
Draws a segment a line with a thickness.
Definition meshDrawer.cxx:239
MeshDrawer::begin
void begin(NodePath camera, NodePath render)
Pass the current camera node and the root node.
Definition meshDrawer.cxx:88
MeshDrawer::set_budget
void set_budget(int budget)
Sets the total triangle budget of the drawer.
Definition meshDrawer.I:59
MeshDrawer::blended_particle
void blended_particle(const LVector3 &pos, const LVector4 &frame1, const LVector4 &frame2, PN_stdfloat blend, PN_stdfloat size, const LVector4 &color, PN_stdfloat rotation)
Works just like particle but accepts 2 frames and a blend (from 0 to 1) component between them Frame ...
Definition meshDrawer.cxx:184
MeshDrawer::end
void end()
Finish the drawing and clearing off the remaining vertexes.
Definition meshDrawer.cxx:132
MeshDrawer::MeshDrawer
MeshDrawer()
Creates the MeshDrawer low level system.
Definition meshDrawer.I:20
MeshDrawer::tri
void tri(const LVector3 &v1, const LVector4 &c1, const LVector2 &uv1, const LVector3 &v2, const LVector4 &c2, const LVector2 &uv2, const LVector3 &v3, const LVector4 &c3, const LVector2 &uv3)
Draws a triangle with the given parameters.
Definition meshDrawer.I:75
MeshDrawer::get_budget
int get_budget()
Gets the total triangle budget of the drawer.
Definition meshDrawer.I:68
MeshDrawer::link_segment
void link_segment(const LVector3 &pos, const LVector4 &frame, PN_stdfloat thickness, const LVector4 &color)
Stars or continues linked segment.
Definition meshDrawer.cxx:426
MeshDrawer::segment
void segment(const LVector3 &start, const LVector3 &stop, const LVector4 &frame, PN_stdfloat thickness, const LVector4 &color)
Draws a segment a line with a thickness.
Definition meshDrawer.cxx:228
MeshDrawer::stream
void stream(const LVector3 &start, const LVector3 &stop, const LVector4 &frame, PN_stdfloat size, const LVector4 &color, int number, PN_stdfloat offset)
Draws a number of particles in a big line with a shift dictated by the offset.
Definition meshDrawer.cxx:336
NodePath
NodePath is the fundamental system for disambiguating instances, and also provides a higher-level int...
Definition nodePath.h:159
TypeHandle
TypeHandle is the identifier used to differentiate C++ class types.
Definition typeHandle.h:81
TypedObject::init_type
static void init_type()
This function is declared non-inline to work around a compiler bug in g++ 2.96.
Definition typedObject.cxx:44
geomNode.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
geomTriangles.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
geomTristrips.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
geomVertexArrayFormat.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
geomVertexData.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
geomVertexFormat.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
geomVertexRewriter.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
geomVertexWriter.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
geom.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
lpoint2.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
luse.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
lvecBase2.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
meshDrawer.I
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
nodePathCollection.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
nodePath.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pandaNode.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pandabase.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pnmImage.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pointerTo.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
register_type
void register_type(TypeHandle &type_handle, const std::string &name)
This inline function is just a convenient way to call TypeRegistry::register_type(),...
Definition register_type.I:22
texture.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.