mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 02:42:49 -04:00
314 lines
9.2 KiB
C++
314 lines
9.2 KiB
C++
// Filename: geom.h
|
|
// Created by: mike (09Jan97)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
|
|
//
|
|
// All use of this software is subject to the terms of the Panda 3d
|
|
// Software license. You should have received a copy of this license
|
|
// along with this source code; you will also find a current copy of
|
|
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
|
|
//
|
|
// To contact the maintainers of this program write to
|
|
// panda3d-general@lists.sourceforge.net .
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
#ifndef GEOM_H
|
|
#define GEOM_H
|
|
|
|
#include "pandabase.h"
|
|
|
|
#include "drawable.h"
|
|
|
|
#include "vector_typedWritable.h"
|
|
#include "pointerTo.h"
|
|
#include "pointerToArray.h"
|
|
#include "typedef.h"
|
|
#include "luse.h"
|
|
#include "pta_Vertexf.h"
|
|
#include "pta_Normalf.h"
|
|
#include "pta_Colorf.h"
|
|
#include "pta_TexCoordf.h"
|
|
#include "pta_ushort.h"
|
|
#include "pta_int.h"
|
|
#include "texture.h"
|
|
|
|
class Datagram;
|
|
class DatagramIterator;
|
|
class BamReader;
|
|
class BamWriter;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Defines
|
|
////////////////////////////////////////////////////////////////////
|
|
BEGIN_PUBLISH
|
|
enum GeomBindType
|
|
{
|
|
G_OFF,
|
|
G_OVERALL,
|
|
G_PER_PRIM,
|
|
G_PER_COMPONENT,
|
|
G_PER_VERTEX
|
|
};
|
|
END_PUBLISH
|
|
static const int num_GeomBindTypes = 5;
|
|
|
|
enum GeomAttrType
|
|
{
|
|
G_COORD,
|
|
G_COLOR,
|
|
G_NORMAL,
|
|
G_TEXCOORD
|
|
};
|
|
static const int num_GeomAttrTypes = 4;
|
|
|
|
ostream &operator << (ostream &out, GeomBindType t);
|
|
ostream &operator << (ostream &out, GeomAttrType t);
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Class : Geom
|
|
// Description : Geometry parent class
|
|
////////////////////////////////////////////////////////////////////
|
|
class EXPCL_PANDA Geom : public dDrawable {
|
|
public:
|
|
|
|
// These classes are used to iterate through all the vertices,
|
|
// normals, etc. They're returned by make_vertex_iterator(), and
|
|
// operated on by get_next_vertex(), etc.
|
|
class VertexIterator {
|
|
public:
|
|
const Vertexf *_array;
|
|
const ushort *_index;
|
|
};
|
|
class NormalIterator {
|
|
public:
|
|
const Normalf *_array;
|
|
const ushort *_index;
|
|
};
|
|
class TexCoordIterator {
|
|
public:
|
|
const TexCoordf *_array;
|
|
const ushort *_index;
|
|
};
|
|
class ColorIterator {
|
|
public:
|
|
const Colorf *_array;
|
|
const ushort *_index;
|
|
};
|
|
|
|
// Declare some function types. This declares several typenames
|
|
// which are pointers to function types--these are not themselves
|
|
// functions. A function pointed to by a variable of this type,
|
|
// when given an iterator of the appropriate type from the Geom,
|
|
// will retrieve the next element from the array and increment the
|
|
// iterator appropriately for next time.
|
|
typedef const Vertexf &GetNextVertex(VertexIterator &);
|
|
typedef const Normalf &GetNextNormal(NormalIterator &);
|
|
typedef const TexCoordf &GetNextTexCoord(TexCoordIterator &);
|
|
typedef const Colorf &GetNextColor(ColorIterator &);
|
|
|
|
|
|
Geom();
|
|
Geom(const Geom ©);
|
|
~Geom();
|
|
|
|
void operator = (const Geom ©);
|
|
virtual Geom *make_copy() const=0;
|
|
|
|
PUBLISHED:
|
|
void write(ostream &out, int indent_level = 0) const;
|
|
virtual void output(ostream &out) const;
|
|
void write_verbose(ostream &out, int indent_level) const;
|
|
|
|
public:
|
|
// From parent dDrawable
|
|
virtual void draw(GraphicsStateGuardianBase *gsg);
|
|
|
|
// From parent Configurable
|
|
virtual void config();
|
|
|
|
// Immediate mode drawing functions - issue graphics commands
|
|
virtual void draw_immediate(GraphicsStateGuardianBase *gsg, GeomContext *gc) = 0;
|
|
virtual void print_draw_immediate() const = 0;
|
|
|
|
void calc_tight_bounds(LPoint3f &min_point, LPoint3f &max_point,
|
|
bool &found_any) const;
|
|
PUBLISHED:
|
|
void transform_vertices(const LMatrix4f &mat);
|
|
|
|
void set_coords(const PTA_Vertexf &coords,
|
|
const PTA_ushort &vindex =
|
|
PTA_ushort());
|
|
void set_coords(const PTA_Vertexf &coords,
|
|
GeomBindType bind,
|
|
const PTA_ushort &vindex =
|
|
PTA_ushort());
|
|
void set_normals(const PTA_Normalf &norms,
|
|
GeomBindType bind,
|
|
const PTA_ushort &nindex =
|
|
PTA_ushort());
|
|
void set_colors(const PTA_Colorf &colors,
|
|
GeomBindType bind,
|
|
const PTA_ushort &cindex =
|
|
PTA_ushort());
|
|
void set_texcoords(const PTA_TexCoordf &texcoords,
|
|
GeomBindType bind,
|
|
const PTA_ushort &tindex =
|
|
PTA_ushort());
|
|
|
|
public:
|
|
// These can't be published because of the pass-by-reference
|
|
// primitive types.
|
|
void get_coords(PTA_Vertexf &coords,
|
|
GeomBindType &bind,
|
|
PTA_ushort &vindex) const;
|
|
|
|
void get_coords(PTA_Vertexf &coords,
|
|
PTA_ushort &vindex) const;
|
|
|
|
void get_normals(PTA_Normalf &norms,
|
|
GeomBindType &bind,
|
|
PTA_ushort &nindex) const;
|
|
void get_colors(PTA_Colorf &colors,
|
|
GeomBindType &bind,
|
|
PTA_ushort &cindex) const;
|
|
void get_texcoords(PTA_TexCoordf &texcoords,
|
|
GeomBindType &bind,
|
|
PTA_ushort &tindex) const;
|
|
|
|
PUBLISHED:
|
|
virtual bool is_dynamic() const;
|
|
|
|
INLINE GeomBindType get_binding(int attr) const;
|
|
INLINE const PTA_Vertexf &get_coords_array() const;
|
|
INLINE const PTA_Normalf &get_normals_array() const;
|
|
INLINE const PTA_Colorf &get_colors_array() const;
|
|
INLINE const PTA_TexCoordf &get_texcoords_array() const;
|
|
INLINE const PTA_ushort &get_coords_index() const;
|
|
INLINE const PTA_ushort &get_normals_index() const;
|
|
INLINE const PTA_ushort &get_colors_index() const;
|
|
INLINE const PTA_ushort &get_texcoords_index() const;
|
|
|
|
void prepare(PreparedGraphicsObjects *prepared_objects);
|
|
|
|
INLINE void set_num_prims(int num);
|
|
INLINE int get_num_prims() const;
|
|
|
|
INLINE void set_lengths(const PTA_int &lengths);
|
|
INLINE PTA_int get_lengths() const;
|
|
|
|
virtual int get_num_vertices_per_prim() const=0;
|
|
virtual int get_num_more_vertices_than_components() const=0;
|
|
virtual bool uses_components() const=0;
|
|
|
|
INLINE int get_num_vertices() const;
|
|
|
|
// Returns the length of the indicated primitive. Often this is the
|
|
// same for all primitives in the Geom. However, geoms which use
|
|
// the lengths array will redefine this appropriately.
|
|
virtual int get_length(int prim) const=0;
|
|
|
|
virtual Geom *explode() const;
|
|
virtual PTA_ushort get_tris() const;
|
|
|
|
public:
|
|
INLINE VertexIterator make_vertex_iterator() const;
|
|
INLINE const Vertexf &get_next_vertex(VertexIterator &viterator) const;
|
|
|
|
INLINE NormalIterator make_normal_iterator() const;
|
|
INLINE const Normalf &get_next_normal(NormalIterator &niterator) const;
|
|
|
|
INLINE TexCoordIterator make_texcoord_iterator() const;
|
|
INLINE const TexCoordf &get_next_texcoord(TexCoordIterator &tciterator) const;
|
|
|
|
INLINE ColorIterator make_color_iterator() const;
|
|
INLINE const Colorf &get_next_color(ColorIterator &citerator) const;
|
|
|
|
GeomContext *prepare_now(PreparedGraphicsObjects *prepared_objects,
|
|
GraphicsStateGuardianBase *gsg);
|
|
bool release(PreparedGraphicsObjects *prepared_objects);
|
|
int release_all();
|
|
|
|
protected:
|
|
void init();
|
|
virtual BoundingVolume *recompute_bound();
|
|
|
|
protected:
|
|
|
|
PTA_Vertexf _coords;
|
|
PTA_Normalf _norms;
|
|
PTA_Colorf _colors;
|
|
PTA_TexCoordf _texcoords;
|
|
|
|
PTA_ushort _vindex;
|
|
PTA_ushort _nindex;
|
|
PTA_ushort _cindex;
|
|
PTA_ushort _tindex;
|
|
|
|
int _numprims,_num_vertices;
|
|
PTA_int _primlengths;
|
|
enum GeomBindType _bind[num_GeomAttrTypes];
|
|
|
|
// Functions to extract component values, one at a time.
|
|
GetNextVertex *_get_vertex;
|
|
GetNextNormal *_get_normal;
|
|
GetNextTexCoord *_get_texcoord;
|
|
GetNextColor *_get_color;
|
|
|
|
private:
|
|
void clear_prepared(PreparedGraphicsObjects *prepared_objects);
|
|
|
|
// A Geom keeps a list (actually, a map) of all the
|
|
// PreparedGraphicsObjects tables that it has been prepared into.
|
|
// Each PGO conversely keeps a list (a set) of all the Geoms that
|
|
// have been prepared there. When either destructs, it removes
|
|
// itself from the other's list.
|
|
typedef pmap<PreparedGraphicsObjects *, GeomContext *> Contexts;
|
|
Contexts _contexts;
|
|
|
|
// This value represents the intersection of all the dirty flags of
|
|
// the various GeomContexts that might be associated with this
|
|
// geom.
|
|
int _all_dirty_flags;
|
|
|
|
public:
|
|
//static void register_with_read_factory(void);
|
|
virtual void write_datagram(BamWriter* manager, Datagram &me);
|
|
|
|
//static TypedWritable *make_Generic(const FactoryParams ¶ms);
|
|
|
|
protected:
|
|
void fillin(DatagramIterator& scan, BamReader* manager);
|
|
|
|
public:
|
|
static TypeHandle get_class_type() {
|
|
return _type_handle;
|
|
}
|
|
static void init_type() {
|
|
dDrawable::init_type();
|
|
register_type(_type_handle, "Geom",
|
|
dDrawable::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;
|
|
|
|
friend class GeomContext;
|
|
friend class PreparedGraphicsObjects;
|
|
};
|
|
|
|
INLINE ostream &operator <<(ostream &out, const Geom &geom) {
|
|
geom.output(out);
|
|
return out;
|
|
}
|
|
|
|
#include "geom.I"
|
|
|
|
#endif
|