Point Cloud Library (PCL) 1.15.0
Loading...
Searching...
No Matches
opennurbs_texture.h
1/* $NoKeywords: $ */
2/*
3//
4// Copyright (c) 1993-2012 Robert McNeel & Associates. All rights reserved.
5// OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert
6// McNeel & Associates.
7//
8// THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
9// ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF
10// MERCHANTABILITY ARE HEREBY DISCLAIMED.
11//
12// For complete openNURBS copyright information see <http://www.opennurbs.org>.
13//
14////////////////////////////////////////////////////////////////
15*/
16
17////////////////////////////////////////////////////////////////
18//
19// defines ON_Color and ON_Material
20//
21////////////////////////////////////////////////////////////////
22
23#if !defined(OPENNURBS_TEXTURE_INC_)
24#define OPENNURBS_TEXTURE_INC_
25
26///////////////////////////////////////////////////////////////////////////////
27//
28// Class ON_Texture
29//
30
31class ON_CLASS ON_Texture : public ON_Object
32{
33public:
35
38
39 // default copy constructor and operator= work fine
40
41
42 // overrides virtual ON_Object::IsValid
43 ON_BOOL32 IsValid( ON_TextLog* text_log = NULL ) const;
44
45 // overrides virtual ON_Object::Dump
46 void Dump( ON_TextLog& ) const;
47
48 // overrides virtual ON_Object::SizeOf
49 unsigned int SizeOf() const;
50
51 // overrides virtual ON_Object::Write
52 ON_BOOL32 Write(
53 ON_BinaryArchive& binary_archive
54 ) const;
55
56 // overrides virtual ON_Object::Read
57 ON_BOOL32 Read(
58 ON_BinaryArchive& binary_archive
59 );
60
61 void Default();
62
63 int Compare( const ON_Texture& other ) const;
64
65 /*
66 Description:
67 Reverses the texture in the specified direction.
68 Parameters:
69 dir - [in] 0 = reverse "u", 1 = reverse "v", 2 = reverse "w".
70 Remarks:
71 Modifes m_uvw so that the spedified direction transforms
72 the texture coordinate t to 1-t.
73 Returns:
74 True if input is valid.
75 */
76 bool ReverseTextureCoordinate( int dir );
77
78 /*
79 Description:
80 Swaps the specified texture coordinates.
81 Parameters:
82 i - [in]
83 j - [in] (0 <= i, j <= 3 and i != j)
84 Remarks:
85 Modifes m_uvw so that the specified texture coordinates are swapped.
86 Returns:
87 True if input is valid.
88 */
89 bool SwapTextureCoordinate( int i, int j );
90
91 /*
92 Description:
93 Tiles the specified texture coordinates.
94 Parameters:
95 dir - [in] 0 = reverse "u", 1 = reverse "v", 2 = reverse "w".
96 count - [in] number of tiles (can be negative)
97 offset - [in] offset of the tile (can be any number)
98 Remarks:
99 Modifes m_uvw so that the specified texture coordinate is
100 tiled.
101 Returns:
102 True if input is valid.
103 */
104 bool TileTextureCoordinate( int dir, double count, double offset );
105
106 /*
107 Description:
108 Examines the m_uvw matrix and harvests tiling constants.
109 Parameters:
110 dir - [in] 0 = reverse "u", 1 = reverse "v", 2 = reverse "w".
111 count - [out] number of tiles
112 offset - [out] offset of the tile
113 Returns:
114 True if if the m_uvw matrix had entries that were compatible
115 with tiling.
116 */
117 bool IsTiled( int dir, double* count, double* offset ) const;
118
119
121
122 // list of pre-defined channel ids
124 {
125 tc_channel = 0, // Use the texture coordinate values
126 // currently on the geometric object.
127 default_channel = 1, // Use either default mapping, or the "Custom"
128 // mapping applied to the object
129 srfp_channel = 0xFFFFFFFE, // Use surface parameterization.
130 emap_channel = 0xFFFFFFFF // Environment map the geometric object.
131 };
132
133 // If the m_mapping_channel_id value is one of the built-in
134 // mappings listed in the MAPPING_CHANNEL enum, then that
135 // mapping is used. Otherwise, if an object has rendering
136 // attributes with an ON_MappingChannel entry that has a
137 // matching m_mapping_channel_id value, then the mapping
138 // identified by ON_MappingChannel::m_mapping_id is used.
139 // A value of zero means no mapping is supplied
140 // and the texture coordinates on the mesh are
141 // used.
143
144 // Bitmap filename
145 // During runtime, m_filename is the absolute path to the
146 // file in use. If m_filename_bRelativePath is true, then
147 // the value saved in the 3dm archive will be a relative path.
148 // When m_filename_bRelativePath is true, user interface
149 // should display a relative path.
152
153 // If false, texture is off and should be ignored.
154 // The intended use is to allow people to turn textures
155 // on and off without have to create/destroy or change
156 // other texture settings.
157 bool m_bOn;
158
159 // do not change TYPE enum values - they are saved in 3dm files.
160 // The "TYPE" setting controls how the pixels in the bitmap
161 // are interpreted.
162 enum TYPE
163 {
164 no_texture_type = 0,
165
166 bitmap_texture = 1, // "standard" image texture.
167 bump_texture = 2, // bump map - see m_bump_scale comment
168 transparency_texture = 3, // value = alpha (see m_tranparancy_id)
169
170 // OBSOLETE - set m_mapping_channel_id = ON_MappingChannel::emap_mapping
171 emap_texture = 86, // spherical environment mapping.
172
173 force_32bit_texture_type = 0xFFFFFFFF
174 };
175
177
178 // m_mode determines how the texture is
179 // do not change MODE enum values - they are saved in 3dm files.
180 enum MODE
181 {
182 no_texture_mode = 0,
183 modulate_texture = 1, // modulate with material diffuse color
184 decal_texture = 2, // decal
185 blend_texture = 3, // blend texture with others in the material
186 // To "add" a texture, set m_blend_amount = +1
187 // To "subtract" a texture, set m_blend_amount = -1
188
189 force_32bit_texture_mode = 0xFFFFFFFF
190 };
191
193
195 {
196 nearest_filter = 0, // nearest texture pixel is used
197 linear_filter = 1, // weighted average of corresponding texture pixels
198
199 force_32bit_texture_filter = 0xFFFFFFFF
200 };
201
202 // The value of m_minfilter determines how the color
203 // of the image pixel is calculated when the image pixel
204 // corresponds to multiple texture bitmap pixels.
206
207 // The magfilter setting controls how the color
208 // of the image pixel is calculated when the image pixel
209 // corresponds to a fraction of a texture bitmap pixel.
211
212 enum WRAP
213 {
214 repeat_wrap = 0,
215 clamp_wrap = 1,
216
217 force_32bit_texture_wrap = 0xFFFFFFFF
218 };
219
223
224 // Texture coordinate transformation.
225 bool m_bApply_uvw; // true if m_uvw is active.
227
228 // If ON_UNSET_COLOR != m_border_color, then this color
229 // is used when the texture coordinates are <=0 or >=1
230 // and the m_wrap* value is clamp_wrap.
232
233 // This field is used for textures with type
234 // bitmap_texture that reference bitmap files that do
235 // not have an alpha channel and is used to set
236 // runtime alpha values. It needs to be parsed when the
237 // texture is loaded and can be ignored at runtime.
238 //
239 // If ON_UNSET_COLOR != m_transparent_color, then
240 // a pixel in the bitmap file with a matching RGB
241 // value is assigned the alpha value (ON_Color::Alpha)
242 // in m_transparent_color. The intended use is
243 // for non-rectangular decals defined by RGB bitmaps in
244 // files that don't save an alpha channel.
245 //
246 // For example if the decal is a red number 7 with a
247 // white background, then you would set m_transparent_color's
248 // RGB to white and its A to zero.
250
251 // This field is used for textures with type
252 // bitmap_texture that reference bitmap files that do
253 // not have an alpha channel and is used to set
254 // runtime alpha values. It needs to be parsed when the
255 // texture is loaded and can be ignored at runtime.
256 //
257 // If m_transparency_id is not nil, it is the id of another
258 // texture in the ON_Material.m_textures[] array that has
259 // type m_transparency_texture. The runtime bitmap_texture's
260 // alpha is set to (255-max(R,G,B)) (the "value" in the hue,
261 // saturation,value sense) of the correspondeing
262 // transparency_texture pixel.
263 //
264 // For example, if you had a bitmap texuture that was green
265 // with purple dots saved in a RGB .bmp file and you wanted
266 // the purple dots to be semi-transparent, you could create
267 // another bitmap that was black, where the original was green,
268 // and gray, where the original was purple, have an
269 // transparency_texture reference the white/gray bitmap,
270 // and have the bitmap_texture's m_transparency_id
271 // reference the transparency map.
273
274 // If the m_type is bump_texture, the height of the
275 // bump is m_bump_scale.ParameterAt(value), where
276 // value is in the HSV sense and normalized
277 // (black=0, white=1). The interval can be
278 // decreasing.
280
281 // If the m_mode is blend_texture, then m_blend_A[]
282 // and m_blend_RGB[] determine the blending function.
283 // new alpha = m_blend_constant_A
284 // + m_blend_A[0]*(current alpha)
285 // + m_blend_A[1]*(texture alpha)
286 // + m_blend_A[2]*min(current alpha,texture alpha)
287 // + m_blend_A[3]*max(current alpha,texture alpha)
288 // new rgb = m_blend_constant_RGB
289 // + m_blend_RGB[0]*(current RGB)
290 // + m_blend_RGB[1]*(texture RGB)
291 // + m_blend_RGB[2]*min(current RGB,texture RGB)
292 // + m_blend_RGB[3]*max(current RGB,texture RGB)
293 // Results are clamped to handle underflow or overflow.
295 double m_blend_A[4];
297 double m_blend_RGB[4];
298
299 // If an ON_Material m_textures[] array has more than
300 // one texture, the textures are blended, and the textures
301 // have different m_blend_order values, the the texture
302 // with the smaller m_blend_order is first.
304
305 // Applications use the m_runtime_ptr_id and m_runtime_ptr fields
306 // to cached runtime bitmaps. If either the id or the pointer
307 // are non-zero, then you cannot use them. If you hang something
308 // on the pointer, then set the id to something unique to
309 // prevent others from messing with it.
311 const void* m_runtime_ptr;
312
313 static TYPE TypeFromInt( int i );
314 static MODE ModeFromInt( int i );
315 static FILTER FilterFromInt( int i );
316 static WRAP WrapFromInt( int i );
317};
318
319#if defined(ON_DLL_TEMPLATE)
320// This stuff is here because of a limitation in the way Microsoft
321// handles templates and DLLs. See Microsoft's knowledge base
322// article ID Q168958 for details.
323#pragma warning( push )
324#pragma warning( disable : 4231 )
325ON_DLL_TEMPLATE template class ON_CLASS ON_ClassArray<ON_Texture>;
326ON_DLL_TEMPLATE template class ON_CLASS ON_ObjectArray<ON_Texture>;
327#pragma warning( pop )
328#endif
329
330#endif
331
double m_blend_constant_A
unsigned int SizeOf() const
ON_Color m_border_color
ON_wString m_filename
static TYPE TypeFromInt(int i)
bool ReverseTextureCoordinate(int dir)
ON_UUID m_transparency_texture_id
bool IsTiled(int dir, double *count, double *offset) const
ON_Color m_transparent_color
ON_UUID m_runtime_ptr_id
bool SwapTextureCoordinate(int i, int j)
ON_OBJECT_DECLARE(ON_Texture)
ON_Color m_blend_constant_RGB
void Dump(ON_TextLog &) const
ON_BOOL32 IsValid(ON_TextLog *text_log=NULL) const
bool m_filename_bRelativePath
ON_BOOL32 Read(ON_BinaryArchive &binary_archive)
static WRAP WrapFromInt(int i)
int Compare(const ON_Texture &other) const
const void * m_runtime_ptr
static FILTER FilterFromInt(int i)
bool TileTextureCoordinate(int dir, double count, double offset)
ON_Interval m_bump_scale
void Default()
static MODE ModeFromInt(int i)
ON_BOOL32 Write(ON_BinaryArchive &binary_archive) const