Panda3D
Loading...
Searching...
No Matches
stTerrain.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 stTerrain.h
10 * @author drose
11 * @date 2010-10-11
12 */
13
14#ifndef STTERRAIN_H
15#define STTERRAIN_H
16
17#include "pandabase.h"
18#include "typedReferenceCount.h"
19#include "namable.h"
20#include "geomVertexData.h"
21#include "speedtree_api.h"
22
23/**
24 * This is the abstract base class that defines the interface needed to
25 * describe a terrain for rendering by SpeedTree. To use it, you must
26 * subclass and override the appropriate virtual methods. Or, consider just
27 * using STBasicTerrain.
28 *
29 * A terrain is defined as a 2-d height function over all space: get_height(x,
30 * y) may be called for any point in space and it should return a reasonable
31 * value. A terrain also provides normal maps and splat maps, as rendered by
32 * SpeedTree's Terrain.hlsl shader file.
33 */
34class EXPCL_PANDASPEEDTREE STTerrain : public TypedReferenceCount, public Namable {
35protected:
36 STTerrain();
37 STTerrain(const STTerrain &copy);
38PUBLISHED:
39 virtual ~STTerrain();
40
41 virtual void clear();
42 virtual void load_data()=0;
43
44 INLINE bool is_valid() const;
45
46 INLINE const Filename &get_normal_map() const;
47 INLINE const Filename &get_splat_map() const;
48
49 INLINE int get_num_splat_layers() const;
50 INLINE const Filename &get_splat_layer(int n) const;
51 INLINE PN_stdfloat get_splat_layer_tiling(int n) const;
52 INLINE LColor get_splat_layer_color(int n) const;
53
54 INLINE const GeomVertexFormat *get_vertex_format();
55
56 INLINE PN_stdfloat get_min_height() const;
57 INLINE PN_stdfloat get_max_height() const;
58
59 virtual PN_stdfloat get_height(PN_stdfloat x, PN_stdfloat y) const=0;
60 virtual PN_stdfloat get_smooth_height(PN_stdfloat x, PN_stdfloat y, PN_stdfloat radius) const;
61 virtual PN_stdfloat get_slope(PN_stdfloat x, PN_stdfloat y) const;
62
63 bool placement_is_acceptable(PN_stdfloat x, PN_stdfloat y,
64 PN_stdfloat height_min, PN_stdfloat height_max,
65 PN_stdfloat slope_min, PN_stdfloat slope_max);
66
67 virtual void fill_vertices(GeomVertexData *data,
68 PN_stdfloat start_x, PN_stdfloat start_y,
69 PN_stdfloat size_xy, int num_xy) const;
70
71 virtual void output(std::ostream &out) const;
72 virtual void write(std::ostream &out, int indent_level = 0) const;
73
74public:
75 const SpeedTree::SVertexAttribDesc *get_st_vertex_format() const;
76
77protected:
78 bool set_vertex_format(const GeomVertexFormat *format);
79
81 static bool convert_vertex_format(VertexAttribs &st_vertex_attribs,
82 const GeomVertexFormat *format);
83 static bool convert_vertex_column(SpeedTree::SVertexAttribDesc &st_attrib,
84 const GeomVertexColumn *column);
85
86protected:
87 class SplatLayer {
88 public:
89 Filename _filename;
90 PN_stdfloat _tiling;
91 UnalignedLVecBase4 _color;
92 };
94
95protected:
96 bool _is_valid;
97
98 Filename _normal_map;
99 Filename _splat_map;
100 SplatLayers _splat_layers;
101
102 CPT(GeomVertexFormat) _vertex_format;
103 VertexAttribs _st_vertex_attribs;
104
105 PN_stdfloat _min_height;
106 PN_stdfloat _max_height;
107
108public:
109 static TypeHandle get_class_type() {
110 return _type_handle;
111 }
112 static void init_type() {
113 TypedReferenceCount::init_type();
114 register_type(_type_handle, "STTerrain",
115 TypedReferenceCount::get_class_type());
116 }
117 virtual TypeHandle get_type() const {
118 return get_class_type();
119 }
120 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
121
122private:
123 static TypeHandle _type_handle;
124};
125
126INLINE std::ostream &operator << (std::ostream &out, const STTerrain &terrain) {
127 terrain.output(out);
128 return out;
129}
130
131#include "stTerrain.I"
132
133#endif
The name of a file, such as a texture file or an Egg file.
Definition filename.h:44
This defines how a single column is interleaved within a vertex array stored within a Geom.
This defines the actual numeric vertex data stored in a Geom, in the structure defined by a particula...
This class defines the physical layout of the vertex data stored within a Geom.
A base class for all things which can have a name.
Definition namable.h:26
void output(std::ostream &out) const
Outputs the Namable.
Definition namable.I:61
This is the abstract base class that defines the interface needed to describe a terrain for rendering...
Definition stTerrain.h:34
TypeHandle is the identifier used to differentiate C++ class types.
Definition typeHandle.h:81
A base class for things which need to inherit from both TypedObject and from ReferenceCount.
This is our own Panda specialization on the default STL vector.
Definition pvector.h:42
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void register_type(TypeHandle &type_handle, const std::string &name)
This inline function is just a convenient way to call TypeRegistry::register_type(),...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.