Panda3D
Loading...
Searching...
No Matches
fltGeometry.cxx
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 fltGeometry.cxx
10 * @author drose
11 * @date 2001-02-28
12 */
13
14#include "fltGeometry.h"
15#include "fltRecordReader.h"
16#include "fltRecordWriter.h"
17#include "fltHeader.h"
18#include "fltMaterial.h"
19
20TypeHandle FltGeometry::_type_handle;
21
22/**
23 *
24 */
25FltGeometry::
26FltGeometry(FltHeader *header) : FltBeadID(header) {
27 _ir_color = 0;
28 _relative_priority = 0;
29 _draw_type = DT_solid_cull_backface;
30 _texwhite = false;
31 _color_name_index = 0;
32 _alt_color_name_index = 0;
33 _billboard_type = BT_none;
34 _detail_texture_index = -1;
35 _texture_index = -1;
36 _material_index = -1;
37 _dfad_material_code = 0;
38 _dfad_feature_id = 0;
39 _ir_material_code = 0;
40 _transparency = 0;
41 _lod_generation_control = 0;
42 _line_style_index = 0;
43 _flags = F_no_color;
44 _light_mode = LM_face_no_normal;
45 _texture_mapping_index = 0;
46 _color_index = 0;
47 _alt_color_index = 0;
48}
49
50
51/**
52 * Returns the primary color of the face, as a four-component value (including
53 * alpha as the transparency channel).
54 *
55 * If has_color() is false, the result is white, but still reflects the
56 * transparency correctly.
57 */
59get_color() const {
60 LColor color;
61
62 if (!has_color() || (_texwhite && has_texture())) {
63 // Force this one white.
64 color.set(1.0, 1.0, 1.0, 1.0);
65
66 } else if (has_material()) {
67 // If we have a material, that replaces the color.
68 FltMaterial *material = get_material();
69 color.set(material->_diffuse[0],
70 material->_diffuse[1],
71 material->_diffuse[2],
72 material->_alpha);
73 } else {
74 LRGBColor rgb =
75 _header->get_rgb(_color_index, (_flags & F_packed_color) != 0,
76 _packed_color);
77 color.set(rgb[0], rgb[1], rgb[2], 1.0);
78 }
79
80 // Modify the whole thing by our transparency.
81 PN_stdfloat alpha = 1.0 - (_transparency / 65535.0);
82 color[3] *= alpha;
83
84 return color;
85}
86
87/**
88 * Sets the primary color of the face, using the packed color convention.
89 */
91set_color(const LColor &color) {
92 set_rgb(LRGBColor(color[0], color[1], color[2]));
93 _transparency = (int)floor((1.0 - color[3]) * 65535.0);
94}
95
96/**
97 * Returns the primary color of the face, as a three-component value ignoring
98 * transparency.
99 */
101get_rgb() const {
102 if (!has_color() || (_texwhite && has_texture())) {
103 // Force this one white.
104 return LRGBColor(1.0, 1.0, 1.0);
105 }
106
107 if (has_material()) {
108 // If we have a material, that replaces the color.
109 FltMaterial *material = get_material();
110 return material->_diffuse;
111 }
112
113 return _header->get_rgb(_color_index, (_flags & F_packed_color) != 0,
114 _packed_color);
115}
116
117/**
118 * Sets the primary color of the face, using the packed color convention; does
119 * not affect transparency.
120 */
122set_rgb(const LRGBColor &rgb) {
123 _packed_color.set_rgb(rgb);
124 _flags = ((_flags & ~F_no_color) | F_packed_color);
125
126 // If we have a color, we can't have a material.
127 _material_index = -1;
128 _texwhite = false;
129}
130
131/**
132 * Returns true if the face has an alternate color indicated, false otherwise.
133 */
135has_alt_color() const {
136 return (_flags & F_no_alt_color) == 0;
137}
138
139/**
140 * If has_alt_color() indicates true, returns the alternate color of the face,
141 * as a four-component value (including alpha as the transparency channel).
142 */
144get_alt_color() const {
145 nassertr(has_alt_color(), LColor(0.0, 0.0, 0.0, 0.0));
146
147 return _header->get_color(_alt_color_index, (_flags & F_packed_color) != 0,
148 _alt_packed_color, _transparency);
149}
150
151/**
152 * If has_alt_color() indicates true, returns the alternate color of the face,
153 * as a three-component value ignoring transparency.
154 */
156get_alt_rgb() const {
157 nassertr(has_alt_color(), LRGBColor(0.0, 0.0, 0.0));
158
159 return _header->get_rgb(_alt_color_index, (_flags & F_packed_color) != 0,
160 _alt_packed_color);
161}
162
163/**
164 * Fills in the information in this bead based on the information given in the
165 * indicated datagram, whose opcode has already been read. Returns true on
166 * success, false if the datagram is invalid.
167 */
168bool FltGeometry::
169extract_record(FltRecordReader &reader) {
170 DatagramIterator &iterator = reader.get_iterator();
171
172 _ir_color = iterator.get_be_int32();
173 _relative_priority = iterator.get_be_int16();
174 _draw_type = (DrawType)iterator.get_int8();
175 _texwhite = (iterator.get_int8() != 0);
176 _color_name_index = iterator.get_be_int16();
177 _alt_color_name_index = iterator.get_be_int16();
178 iterator.skip_bytes(1);
179 _billboard_type = (BillboardType)iterator.get_int8();
180 _detail_texture_index = iterator.get_be_int16();
181 _texture_index = iterator.get_be_int16();
182 _material_index = iterator.get_be_int16();
183 _dfad_material_code = iterator.get_be_int16();
184 _dfad_feature_id = iterator.get_be_int16();
185 _ir_material_code = iterator.get_be_int32();
186 _transparency = iterator.get_be_uint16();
187 _lod_generation_control = iterator.get_uint8();
188 _line_style_index = iterator.get_uint8();
189 if (_header->get_flt_version() >= 1420) {
190 _flags = iterator.get_be_uint32();
191 _light_mode = (LightMode)iterator.get_uint8();
192 iterator.skip_bytes(1 + 4);
193 iterator.skip_bytes(2); // Undocumented padding.
194
195 if (!_packed_color.extract_record(reader)) {
196 return false;
197 }
198 if (!_alt_packed_color.extract_record(reader)) {
199 return false;
200 }
201
202 if (_header->get_flt_version() >= 1520) {
203 _texture_mapping_index = iterator.get_be_int16();
204 iterator.skip_bytes(2);
205 _color_index = iterator.get_be_int32();
206 _alt_color_index = iterator.get_be_int32();
207 iterator.skip_bytes(2 + 2);
208 }
209 }
210
211 return true;
212}
213
214/**
215 * Fills up the current record on the FltRecordWriter with data for this
216 * record, but does not advance the writer. Returns true on success, false if
217 * there is some error.
218 */
219bool FltGeometry::
220build_record(FltRecordWriter &writer) const {
221 Datagram &datagram = writer.update_datagram();
222
223 datagram.add_be_int32(_ir_color);
224 datagram.add_be_int16(_relative_priority);
225 datagram.add_int8(_draw_type);
226 datagram.add_int8(_texwhite);
227 datagram.add_be_uint16(_color_name_index);
228 datagram.add_be_uint16(_alt_color_name_index);
229 datagram.pad_bytes(1);
230 datagram.add_int8(_billboard_type);
231 datagram.add_be_int16(_detail_texture_index);
232 datagram.add_be_int16(_texture_index);
233 datagram.add_be_int16(_material_index);
234 datagram.add_be_int16(_dfad_material_code);
235 datagram.add_be_int16(_dfad_feature_id);
236 datagram.add_be_int32(_ir_material_code);
237 datagram.add_be_uint16(_transparency);
238 datagram.add_uint8(_lod_generation_control);
239 datagram.add_uint8(_line_style_index);
240 datagram.add_be_uint32(_flags);
241 datagram.add_uint8(_light_mode);
242 datagram.pad_bytes(1 + 4);
243 datagram.pad_bytes(2); // Undocumented padding.
244
245 if (!_packed_color.build_record(writer)) {
246 return false;
247 }
248 if (!_alt_packed_color.build_record(writer)) {
249 return false;
250 }
251
252 if (_header->get_flt_version() >= 1520) {
253 // New with 15.2
254 datagram.add_be_int16(_texture_mapping_index);
255 datagram.pad_bytes(2);
256 datagram.add_be_int32(_color_index);
257 datagram.add_be_int32(_alt_color_index);
258 datagram.pad_bytes(2 + 2);
259 }
260
261 return true;
262}
A class to retrieve the individual data elements previously stored in a Datagram.
void skip_bytes(size_t size)
Skips over the indicated number of bytes in the datagram.
uint8_t get_uint8()
Extracts an unsigned 8-bit integer.
uint16_t get_be_uint16()
Extracts an unsigned 16-bit big-endian integer.
uint32_t get_be_uint32()
Extracts an unsigned 32-bit big-endian integer.
int32_t get_be_int32()
Extracts a signed 32-bit big-endian integer.
int8_t get_int8()
Extracts a signed 8-bit integer.
int16_t get_be_int16()
Extracts a signed 16-bit big-endian integer.
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
Definition datagram.h:38
void add_be_uint32(uint32_t value)
Adds an unsigned 32-bit big-endian integer to the datagram.
Definition datagram.I:181
void add_be_uint16(uint16_t value)
Adds an unsigned 16-bit big-endian integer to the datagram.
Definition datagram.I:172
void add_be_int32(int32_t value)
Adds a signed 32-bit big-endian integer to the datagram.
Definition datagram.I:154
void add_uint8(uint8_t value)
Adds an unsigned 8-bit integer to the datagram.
Definition datagram.I:50
void add_be_int16(int16_t value)
Adds a signed 16-bit big-endian integer to the datagram.
Definition datagram.I:145
void pad_bytes(size_t size)
Adds the indicated number of zero bytes to the datagram.
Definition datagram.cxx:99
void add_int8(int8_t value)
Adds a signed 8-bit integer to the datagram.
Definition datagram.I:42
A base class for any of a broad family of flt beads that include an ID.
Definition fltBeadID.h:24
bool has_texture() const
Returns true if the face has a texture applied, false otherwise.
Definition fltGeometry.I:18
bool has_material() const
Returns true if the face has a material applied, false otherwise.
Definition fltGeometry.I:49
bool has_alt_color() const
Returns true if the face has an alternate color indicated, false otherwise.
LRGBColor get_alt_rgb() const
If has_alt_color() indicates true, returns the alternate color of the face, as a three-component valu...
LColor get_color() const
Returns the primary color of the face, as a four-component value (including alpha as the transparency...
LColor get_alt_color() const
If has_alt_color() indicates true, returns the alternate color of the face, as a four-component value...
void set_color(const LColor &color)
Sets the primary color of the face, using the packed color convention.
LRGBColor get_rgb() const
Returns the primary color of the face, as a three-component value ignoring transparency.
void set_rgb(const LRGBColor &rgb)
Sets the primary color of the face, using the packed color convention; does not affect transparency.
bool has_color() const
Returns true if the face has a primary color indicated, false otherwise.
Definition fltGeometry.I:80
FltMaterial * get_material() const
Returns the material applied to this face, or NULL if no material was applied.
Definition fltGeometry.I:58
This is the first bead in the file, the top of the bead hierarchy, and the primary interface to readi...
Definition fltHeader.h:44
Represents a single material in the material palette.
Definition fltMaterial.h:28
void set_rgb(const LRGBColor &rgb)
Sets the color according to the indicated three-component LRGBColor value, and set the alpha to 1....
This class turns an istream into a sequence of FltRecords by reading a sequence of Datagrams and extr...
DatagramIterator & get_iterator()
Returns an iterator suitable for extracting data from the current record.
This class writes a sequence of FltRecords to an ostream, handling opcode and size counts properly.
Datagram & update_datagram()
Returns a modifiable reference to the datagram associated with the current record.
TypeHandle is the identifier used to differentiate C++ class types.
Definition typeHandle.h:81
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.