151 lines
4.8 KiB
C
151 lines
4.8 KiB
C
|
/**
|
||
|
* PANDA 3D SOFTWARE
|
||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||
|
*
|
||
|
* All use of this software is subject to the terms of the revised BSD
|
||
|
* license. You should have received a copy of this license along
|
||
|
* with this source code in a file named "LICENSE."
|
||
|
*
|
||
|
* @file meshDrawer.h
|
||
|
* @author treeform
|
||
|
* @date 2008-12-19
|
||
|
* @author treeform
|
||
|
* @date 2010-01-12
|
||
|
*/
|
||
|
|
||
|
#ifndef MESHDRAWER_H
|
||
|
#define MESHDRAWER_H
|
||
|
|
||
|
#include "pandabase.h"
|
||
|
#include "luse.h"
|
||
|
#include "pandaNode.h"
|
||
|
#include "pointerTo.h"
|
||
|
#include "lpoint2.h"
|
||
|
#include "lvecBase2.h"
|
||
|
#include "pnmImage.h"
|
||
|
#include "nodePath.h"
|
||
|
#include "texture.h"
|
||
|
#include "geomVertexFormat.h"
|
||
|
#include "geomVertexArrayFormat.h"
|
||
|
#include "geomVertexData.h"
|
||
|
#include "geomVertexWriter.h"
|
||
|
#include "geomVertexRewriter.h"
|
||
|
#include "boundingVolume.h"
|
||
|
|
||
|
#include "nodePathCollection.h"
|
||
|
|
||
|
#include "geomTristrips.h"
|
||
|
#include "geomTriangles.h"
|
||
|
#include "geom.h"
|
||
|
#include "geomNode.h"
|
||
|
#include "nodePath.h"
|
||
|
|
||
|
/**
|
||
|
* Mesh drawer creates a single geom object that can be shaped with different
|
||
|
* draw commands. This is an efficient way to render bunch of billboards,
|
||
|
* particles, fast changing triangles. Its implemented by recycling same geom
|
||
|
* over and over again. Max budget specifies how many triangles are allowed.
|
||
|
* Some uses of this class can be : particle system, radar icons, health bars,
|
||
|
* 2d icons, 2d ui, bullets, missile trails. Any that can be drawn with
|
||
|
* triangles can be drawn with this class. At the low level this uses the
|
||
|
* GeomVertexRewriter's. The internal geom consists of vertex, normal, uv and
|
||
|
* color channels.
|
||
|
*/
|
||
|
class EXPCL_PANDA_GRUTIL MeshDrawer : public TypedObject {
|
||
|
PUBLISHED:
|
||
|
INLINE MeshDrawer();
|
||
|
INLINE ~MeshDrawer();
|
||
|
|
||
|
INLINE void set_budget(int budget);
|
||
|
INLINE int get_budget();
|
||
|
|
||
|
INLINE NodePath get_root();
|
||
|
|
||
|
void begin(NodePath camera, NodePath render);
|
||
|
INLINE 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);
|
||
|
|
||
|
void particle(const LVector3 &pos, const LVector4 &frame, PN_stdfloat size, const LVector4 &color, PN_stdfloat rotation);
|
||
|
void blended_particle(const LVector3 &pos, const LVector4 &frame1, const LVector4 &frame2,
|
||
|
PN_stdfloat blend, PN_stdfloat size, const LVector4 &color, PN_stdfloat rotation);
|
||
|
void billboard(const LVector3 &pos, const LVector4 &frame, PN_stdfloat size, const LVector4 &color);
|
||
|
void segment(const LVector3 &start, const LVector3 &stop, const LVector4 &frame, PN_stdfloat thickness, const LVector4 &color);
|
||
|
void cross_segment(const LVector3 &start, const LVector3 &stop, const LVector4 &frame, PN_stdfloat thickness, const LVector4 &color);
|
||
|
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);
|
||
|
|
||
|
void link_segment(const LVector3 &pos, const LVector4 &frame, PN_stdfloat thickness, const LVector4 &color);
|
||
|
void link_segment_end(const LVector4 &frame, const LVector4 &color);
|
||
|
|
||
|
void explosion(const LVector3 &pos, const LVector4 &frame, PN_stdfloat size, const LVector4 &color,
|
||
|
int seed, int number, PN_stdfloat distance);
|
||
|
void stream(const LVector3 &start, const LVector3 &stop, const LVector4 &frame, PN_stdfloat size, const LVector4 &color,
|
||
|
int number, PN_stdfloat offset);
|
||
|
void geometry(NodePath node);
|
||
|
void end();
|
||
|
|
||
|
private:
|
||
|
|
||
|
// use vars
|
||
|
NodePath _root;
|
||
|
NodePath _camera, _render;
|
||
|
int _budget;
|
||
|
|
||
|
// store regeneration geoms & nodes
|
||
|
PT(Geom) _geom;
|
||
|
PT(GeomNode) _geomnode;
|
||
|
PT(GeomVertexData) _vdata;
|
||
|
PT(GeomTriangles) _prim;
|
||
|
CPT(GeomPrimitive) _dprim;
|
||
|
|
||
|
// writers
|
||
|
GeomVertexRewriter *_vertex;
|
||
|
GeomVertexRewriter *_normal;
|
||
|
GeomVertexRewriter *_uv;
|
||
|
GeomVertexRewriter *_color;
|
||
|
|
||
|
// billboard vectors
|
||
|
LVector3 _eyePos;
|
||
|
LVector3 _b1, _b2, _b3, _b4;
|
||
|
LVector3 _up, _right;
|
||
|
|
||
|
// clear indexes
|
||
|
int _last_clear_index, _start_clear_index, _end_clear_index, _clear_index;
|
||
|
|
||
|
// used for curves
|
||
|
int _at_start;
|
||
|
LVector3 _last_v1,_last_v2,_last_v3,_last_v4,_last_pos;
|
||
|
PN_stdfloat _last_thickness;
|
||
|
LVector4 _last_color;
|
||
|
|
||
|
// bounding volume
|
||
|
PT(BoundingVolume) _bv;
|
||
|
|
||
|
// private create all the needed geoms
|
||
|
void generator(int budget);
|
||
|
|
||
|
public:
|
||
|
static TypeHandle get_class_type() {
|
||
|
return _type_handle;
|
||
|
}
|
||
|
static void init_type() {
|
||
|
TypedObject::init_type();
|
||
|
register_type(_type_handle, "MeshDrawer",
|
||
|
TypedObject::get_class_type());
|
||
|
}
|
||
|
virtual TypeHandle get_type() const {
|
||
|
return get_class_type();
|
||
|
}
|
||
|
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
|
||
|
|
||
|
private:
|
||
|
static TypeHandle _type_handle;
|
||
|
|
||
|
};
|
||
|
|
||
|
#include "meshDrawer.I"
|
||
|
|
||
|
#endif /*MESHDRAWER_H*/
|