196 lines
3.9 KiB
Text
196 lines
3.9 KiB
Text
|
/**
|
||
|
* 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 eggVertexUV.I
|
||
|
* @author drose
|
||
|
* @date 2004-07-20
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Returns the actual name that should be set for a given name string.
|
||
|
* Usually this is the same string that is input, but for historical reasons
|
||
|
* the texture coordinate name "default" is mapped to the empty string.
|
||
|
*/
|
||
|
INLINE std::string EggVertexUV::
|
||
|
filter_name(const std::string &name) {
|
||
|
if (name == "default") {
|
||
|
return std::string();
|
||
|
}
|
||
|
return name;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE void EggVertexUV::
|
||
|
set_name(const std::string &name) {
|
||
|
Namable::set_name(filter_name(name));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the number of components of the texture coordinate set. This is
|
||
|
* either 2 (the normal case) or 3 (for a 3-d texture coordinate).
|
||
|
*/
|
||
|
INLINE int EggVertexUV::
|
||
|
get_num_dimensions() const {
|
||
|
return has_w() ? 3 : 2;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns true if the texture coordinate has a third, w component, false if
|
||
|
* it is just a normal 2-d texture coordinate.
|
||
|
*/
|
||
|
INLINE bool EggVertexUV::
|
||
|
has_w() const {
|
||
|
return (_flags & F_has_w) != 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the texture coordinate pair, if get_num_dimensions() is 2.
|
||
|
*/
|
||
|
INLINE LTexCoordd EggVertexUV::
|
||
|
get_uv() const {
|
||
|
nassertr(!has_w(), LTexCoordd::zero());
|
||
|
return LTexCoordd(_uvw[0], _uvw[1]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the texture coordinate triple, if get_num_dimensions() is 3. This
|
||
|
* is also legal to call if get_num_dimensions() is 2 (but the last dimension
|
||
|
* will be zero).
|
||
|
*/
|
||
|
INLINE const LTexCoord3d &EggVertexUV::
|
||
|
get_uvw() const {
|
||
|
return _uvw;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the texture coordinate pair. This makes the texture coordinate a 2-d
|
||
|
* texture coordinate, which is the usual case.
|
||
|
*/
|
||
|
INLINE void EggVertexUV::
|
||
|
set_uv(const LTexCoordd &uv) {
|
||
|
_uvw.set(uv[0], uv[1], 0.0);
|
||
|
_flags &= ~F_has_w;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the texture coordinate triple. This makes the texture coordinate a
|
||
|
* 3-d texture coordinate.
|
||
|
*/
|
||
|
INLINE void EggVertexUV::
|
||
|
set_uvw(const LTexCoord3d &uvw) {
|
||
|
_uvw = uvw;
|
||
|
_flags |= F_has_w;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE bool EggVertexUV::
|
||
|
has_tangent() const {
|
||
|
return (_flags & F_has_tangent) != 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE bool EggVertexUV::
|
||
|
has_tangent4() const {
|
||
|
return (_flags & F_has_tangent4) != 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE const LNormald &EggVertexUV::
|
||
|
get_tangent() const {
|
||
|
nassertr(has_tangent(), _tangent);
|
||
|
return _tangent;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE LVecBase4d EggVertexUV::
|
||
|
get_tangent4() const {
|
||
|
LVecBase4d tangent4(_tangent, 1.0);
|
||
|
nassertr_always(has_tangent(), tangent4);
|
||
|
if (_flags & F_flip_computed_binormal) {
|
||
|
tangent4[3] = -1.0;
|
||
|
}
|
||
|
return tangent4;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE void EggVertexUV::
|
||
|
set_tangent(const LNormald &tangent) {
|
||
|
_tangent = tangent;
|
||
|
_flags |= F_has_tangent;
|
||
|
_flags &= ~(F_has_tangent4 | F_flip_computed_binormal);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the tangent vector, along with a fourth parameter that is multiplied
|
||
|
* with the result of cross(normal, tangent) when computing the binormal.
|
||
|
*/
|
||
|
INLINE void EggVertexUV::
|
||
|
set_tangent4(const LVecBase4d &tangent) {
|
||
|
_tangent = tangent.get_xyz();
|
||
|
_flags |= F_has_tangent4 | F_has_tangent;
|
||
|
if (tangent[3] < 0.0) {
|
||
|
_flags |= F_flip_computed_binormal;
|
||
|
} else {
|
||
|
_flags &= ~F_flip_computed_binormal;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE void EggVertexUV::
|
||
|
clear_tangent() {
|
||
|
_flags &= ~F_has_tangent;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE bool EggVertexUV::
|
||
|
has_binormal() const {
|
||
|
return (_flags & F_has_binormal) != 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE const LNormald &EggVertexUV::
|
||
|
get_binormal() const {
|
||
|
nassertr(has_binormal(), _binormal);
|
||
|
return _binormal;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE void EggVertexUV::
|
||
|
set_binormal(const LNormald &binormal) {
|
||
|
_binormal = binormal;
|
||
|
_flags |= F_has_binormal;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE void EggVertexUV::
|
||
|
clear_binormal() {
|
||
|
_flags &= ~F_has_binormal;
|
||
|
}
|