fix primitive bumpmap support

This commit is contained in:
David Rose 2005-07-02 13:21:46 +00:00
parent cdc8de24bc
commit 0fb2f183e3
8 changed files with 69 additions and 41 deletions

View File

@ -151,9 +151,9 @@ generate_normalization_cube_map(int size) {
vec.normalize(); vec.normalize();
vec = scale.xform_point(vec); vec = scale.xform_point(vec);
*p++ = (unsigned char)vec[0];
*p++ = (unsigned char)vec[1];
*p++ = (unsigned char)vec[2]; *p++ = (unsigned char)vec[2];
*p++ = (unsigned char)vec[1];
*p++ = (unsigned char)vec[0];
} }
} }
@ -163,9 +163,9 @@ generate_normalization_cube_map(int size) {
LVector3f vec(-half_size, center - yi, xi - center); LVector3f vec(-half_size, center - yi, xi - center);
vec.normalize(); vec.normalize();
vec = scale.xform_point(vec); vec = scale.xform_point(vec);
*p++ = (unsigned char)vec[0];
*p++ = (unsigned char)vec[1];
*p++ = (unsigned char)vec[2]; *p++ = (unsigned char)vec[2];
*p++ = (unsigned char)vec[1];
*p++ = (unsigned char)vec[0];
} }
} }
@ -175,9 +175,9 @@ generate_normalization_cube_map(int size) {
LVector3f vec(xi - center, half_size, yi - center); LVector3f vec(xi - center, half_size, yi - center);
vec.normalize(); vec.normalize();
vec = scale.xform_point(vec); vec = scale.xform_point(vec);
*p++ = (unsigned char)vec[0];
*p++ = (unsigned char)vec[1];
*p++ = (unsigned char)vec[2]; *p++ = (unsigned char)vec[2];
*p++ = (unsigned char)vec[1];
*p++ = (unsigned char)vec[0];
} }
} }
@ -187,9 +187,9 @@ generate_normalization_cube_map(int size) {
LVector3f vec(xi - center, -half_size, center - yi); LVector3f vec(xi - center, -half_size, center - yi);
vec.normalize(); vec.normalize();
vec = scale.xform_point(vec); vec = scale.xform_point(vec);
*p++ = (unsigned char)vec[0];
*p++ = (unsigned char)vec[1];
*p++ = (unsigned char)vec[2]; *p++ = (unsigned char)vec[2];
*p++ = (unsigned char)vec[1];
*p++ = (unsigned char)vec[0];
} }
} }
@ -199,9 +199,9 @@ generate_normalization_cube_map(int size) {
LVector3f vec(xi - center, center - yi, half_size); LVector3f vec(xi - center, center - yi, half_size);
vec.normalize(); vec.normalize();
vec = scale.xform_point(vec); vec = scale.xform_point(vec);
*p++ = (unsigned char)vec[0];
*p++ = (unsigned char)vec[1];
*p++ = (unsigned char)vec[2]; *p++ = (unsigned char)vec[2];
*p++ = (unsigned char)vec[1];
*p++ = (unsigned char)vec[0];
} }
} }
@ -211,9 +211,9 @@ generate_normalization_cube_map(int size) {
LVector3f vec(center - xi, center - yi, -half_size); LVector3f vec(center - xi, center - yi, -half_size);
vec.normalize(); vec.normalize();
vec = scale.xform_point(vec); vec = scale.xform_point(vec);
*p++ = (unsigned char)vec[0];
*p++ = (unsigned char)vec[1];
*p++ = (unsigned char)vec[2]; *p++ = (unsigned char)vec[2];
*p++ = (unsigned char)vec[1];
*p++ = (unsigned char)vec[0];
} }
} }
} }

View File

@ -480,22 +480,19 @@ munge_texcoord_light_vector(const CullTraverser *traverser) {
for (lvi = light_vectors.begin(); for (lvi = light_vectors.begin();
lvi != light_vectors.end(); lvi != light_vectors.end();
++lvi) { ++lvi) {
TextureStage *stage = (*lvi).first; TextureStage *stage = (*lvi);
const NodePath &light = (*lvi).second; NodePath light = tex_gen->get_light(stage);
nassertv(!light.is_empty()); nassertv(!light.is_empty());
string source_name = tex_gen->get_source_name(stage);
Light *light_obj = light.node()->as_light(); Light *light_obj = light.node()->as_light();
nassertv(light_obj != (Light *)NULL); nassertv(light_obj != (Light *)NULL);
// Determine the names of the tangent and binormal columns // Determine the names of the tangent and binormal columns
// associated with the stage's texcoord name. // associated with the stage's texcoord name.
CPT(InternalName) texcoord_name = stage->get_texcoord_name(); CPT(InternalName) tangent_name = InternalName::get_tangent_name(source_name);
string basename; CPT(InternalName) binormal_name = InternalName::get_binormal_name(source_name);
if (texcoord_name != InternalName::get_texcoord()) {
basename = texcoord_name->get_basename();
}
CPT(InternalName) tangent_name = InternalName::get_tangent_name(basename); CPT(InternalName) texcoord_name = stage->get_texcoord_name();
CPT(InternalName) binormal_name = InternalName::get_binormal_name(basename);
if (_munged_data->has_column(tangent_name) && if (_munged_data->has_column(tangent_name) &&
_munged_data->has_column(binormal_name)) { _munged_data->has_column(binormal_name)) {

View File

@ -154,7 +154,7 @@ bool DirectionalLight::
get_vector_to_light(LVector3f &result, const LPoint3f &, get_vector_to_light(LVector3f &result, const LPoint3f &,
const LMatrix4f &to_object_space) { const LMatrix4f &to_object_space) {
CDReader cdata(_cycler); CDReader cdata(_cycler);
result = cdata->_direction * to_object_space; result = -(cdata->_direction * to_object_space);
return true; return true;
} }

View File

@ -3253,11 +3253,13 @@ set_tex_gen(TextureStage *stage, RenderAttrib::TexGenMode mode, int priority) {
// Description: Enables automatic texture coordinate generation for // Description: Enables automatic texture coordinate generation for
// the indicated texture stage. This version of this // the indicated texture stage. This version of this
// method is useful when setting M_light_vector, which // method is useful when setting M_light_vector, which
// requires a specific light. // requires the name of the texture coordinate set that
// supplies the tangent and binormal, as well as the
// specific light to generate coordinates for.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void NodePath:: void NodePath::
set_tex_gen(TextureStage *stage, RenderAttrib::TexGenMode mode, set_tex_gen(TextureStage *stage, RenderAttrib::TexGenMode mode,
const NodePath &light, int priority) { const string &source_name, const NodePath &light, int priority) {
nassertv_always(!is_empty()); nassertv_always(!is_empty());
const RenderAttrib *attrib = const RenderAttrib *attrib =
@ -3274,7 +3276,7 @@ set_tex_gen(TextureStage *stage, RenderAttrib::TexGenMode mode,
tga = DCAST(TexGenAttrib, TexGenAttrib::make()); tga = DCAST(TexGenAttrib, TexGenAttrib::make());
} }
node()->set_attrib(tga->add_stage(stage, mode, light), priority); node()->set_attrib(tga->add_stage(stage, mode, source_name, light), priority);
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////

View File

@ -581,7 +581,9 @@ PUBLISHED:
INLINE LVecBase2f get_tex_scale(const NodePath &other, TextureStage *stage) const; INLINE LVecBase2f get_tex_scale(const NodePath &other, TextureStage *stage) const;
void set_tex_gen(TextureStage *stage, RenderAttrib::TexGenMode mode, int priority = 0); void set_tex_gen(TextureStage *stage, RenderAttrib::TexGenMode mode, int priority = 0);
void set_tex_gen(TextureStage *stage, RenderAttrib::TexGenMode mode, const NodePath &light, int priority = 0); void set_tex_gen(TextureStage *stage, RenderAttrib::TexGenMode mode,
const string &source_name, const NodePath &light,
int priority = 0);
void clear_tex_gen(); void clear_tex_gen();
void clear_tex_gen(TextureStage *stage); void clear_tex_gen(TextureStage *stage);
bool has_tex_gen(TextureStage *stage) const; bool has_tex_gen(TextureStage *stage) const;

View File

@ -113,6 +113,10 @@ compare_to(const TexGenAttrib::ModeDef &other) const {
if (_mode != other._mode) { if (_mode != other._mode) {
return (int)_mode < (int)other._mode ? -1 : 1; return (int)_mode < (int)other._mode ? -1 : 1;
} }
return _light.compare_to(other._light); int compare = _light.compare_to(other._light);
if (compare != 0) {
return compare;
}
return strcmp(_source_name.c_str(), other._source_name.c_str());
} }

View File

@ -61,8 +61,9 @@ make() {
// indicated stage. // indicated stage.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
CPT(RenderAttrib) TexGenAttrib:: CPT(RenderAttrib) TexGenAttrib::
make(TextureStage *stage, TexGenAttrib::Mode mode, const NodePath &light) { make(TextureStage *stage, TexGenAttrib::Mode mode,
return DCAST(TexGenAttrib, make())->add_stage(stage, mode, light); const string &source_name, const NodePath &light) {
return DCAST(TexGenAttrib, make())->add_stage(stage, mode, source_name, light);
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -74,12 +75,14 @@ make(TextureStage *stage, TexGenAttrib::Mode mode, const NodePath &light) {
// replaced. // replaced.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
CPT(RenderAttrib) TexGenAttrib:: CPT(RenderAttrib) TexGenAttrib::
add_stage(TextureStage *stage, TexGenAttrib::Mode mode, const NodePath &light) const { add_stage(TextureStage *stage, TexGenAttrib::Mode mode,
const string &source_name, const NodePath &light) const {
CPT(RenderAttrib) removed = remove_stage(stage); CPT(RenderAttrib) removed = remove_stage(stage);
TexGenAttrib *attrib = new TexGenAttrib(*DCAST(TexGenAttrib, removed)); TexGenAttrib *attrib = new TexGenAttrib(*DCAST(TexGenAttrib, removed));
ModeDef &mode_def = attrib->_stages[stage]; ModeDef &mode_def = attrib->_stages[stage];
mode_def._mode = mode; mode_def._mode = mode;
mode_def._source_name = source_name;
mode_def._light = light; mode_def._light = light;
switch (mode) { switch (mode) {
case M_point_sprite: case M_point_sprite:
@ -100,7 +103,7 @@ add_stage(TextureStage *stage, TexGenAttrib::Mode mode, const NodePath &light) c
nassert_raise(strm.str()); nassert_raise(strm.str());
} else { } else {
attrib->_light_vectors[stage] = light; attrib->_light_vectors.insert(stage);
attrib->_geom_rendering |= Geom::GR_texcoord_light_vector; attrib->_geom_rendering |= Geom::GR_texcoord_light_vector;
attrib->_num_light_vectors++; attrib->_num_light_vectors++;
} }
@ -189,6 +192,26 @@ get_mode(TextureStage *stage) const {
return M_off; return M_off;
} }
////////////////////////////////////////////////////////////////////
// Function: TexGenAttrib::get_source_name
// Access: Published
// Description: Returns the source name associated with the named
// texture stage, or the empty string if no name is
// associated with the indicated stage. This is only
// meaningful if the mode is M_light_vector, in which
// case it indicates the name of the source texture
// coordinate set from which the tangent and binormal
// are derived.
////////////////////////////////////////////////////////////////////
string TexGenAttrib::
get_source_name(TextureStage *stage) const {
Stages::const_iterator mi = _stages.find(stage);
if (mi != _stages.end()) {
return (*mi).second._source_name;
}
return string();
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: TexGenAttrib::get_light // Function: TexGenAttrib::get_light
// Access: Published // Access: Published
@ -272,7 +295,8 @@ output(ostream &out) const {
break; break;
case M_light_vector: case M_light_vector:
out << "light_vector: " << mode_def._light; out << "light_vector: \"" << mode_def._source_name << "\", "
<< mode_def._light;
break; break;
} }
out << ")"; out << ")";
@ -402,7 +426,6 @@ compose_impl(const RenderAttrib *other) const {
TextureStage *stage = (*ri).first; TextureStage *stage = (*ri).first;
const ModeDef &mode_def = (*ri).second; const ModeDef &mode_def = (*ri).second;
Mode mode = mode_def._mode; Mode mode = mode_def._mode;
const NodePath &light = mode_def._light;
switch (mode) { switch (mode) {
case M_point_sprite: case M_point_sprite:
@ -412,7 +435,7 @@ compose_impl(const RenderAttrib *other) const {
break; break;
case M_light_vector: case M_light_vector:
attrib->_light_vectors[stage] = light; attrib->_light_vectors.insert(stage);
attrib->_geom_rendering |= Geom::GR_texcoord_light_vector; attrib->_geom_rendering |= Geom::GR_texcoord_light_vector;
attrib->_num_light_vectors++; attrib->_num_light_vectors++;
break; break;
@ -487,7 +510,6 @@ invert_compose_impl(const RenderAttrib *other) const {
TextureStage *stage = (*ri).first; TextureStage *stage = (*ri).first;
const ModeDef &mode_def = (*ri).second; const ModeDef &mode_def = (*ri).second;
Mode mode = mode_def._mode; Mode mode = mode_def._mode;
const NodePath &light = mode_def._light;
switch (mode) { switch (mode) {
case M_point_sprite: case M_point_sprite:
@ -497,7 +519,7 @@ invert_compose_impl(const RenderAttrib *other) const {
break; break;
case M_light_vector: case M_light_vector:
attrib->_light_vectors[stage] = light; attrib->_light_vectors.insert(stage);
attrib->_geom_rendering |= Geom::GR_texcoord_light_vector; attrib->_geom_rendering |= Geom::GR_texcoord_light_vector;
attrib->_num_light_vectors++; attrib->_num_light_vectors++;
break; break;

View File

@ -54,14 +54,15 @@ public:
PUBLISHED: PUBLISHED:
static CPT(RenderAttrib) make(); static CPT(RenderAttrib) make();
static CPT(RenderAttrib) make(TextureStage *stage, Mode mode, const NodePath &light = NodePath()); static CPT(RenderAttrib) make(TextureStage *stage, Mode mode, const string &source_name = string(), const NodePath &light = NodePath());
CPT(RenderAttrib) add_stage(TextureStage *stage, Mode mode, const NodePath &light = NodePath()) const; CPT(RenderAttrib) add_stage(TextureStage *stage, Mode mode, const string &source_name = string(), const NodePath &light = NodePath()) const;
CPT(RenderAttrib) remove_stage(TextureStage *stage) const; CPT(RenderAttrib) remove_stage(TextureStage *stage) const;
bool is_empty() const; bool is_empty() const;
bool has_stage(TextureStage *stage) const; bool has_stage(TextureStage *stage) const;
Mode get_mode(TextureStage *stage) const; Mode get_mode(TextureStage *stage) const;
string get_source_name(TextureStage *stage) const;
NodePath get_light(TextureStage *stage) const; NodePath get_light(TextureStage *stage) const;
INLINE int get_geom_rendering(int geom_rendering) const; INLINE int get_geom_rendering(int geom_rendering) const;
@ -69,7 +70,7 @@ PUBLISHED:
public: public:
INLINE const Geom::NoTexCoordStages &get_no_texcoords() const; INLINE const Geom::NoTexCoordStages &get_no_texcoords() const;
typedef pmap<TextureStage *, NodePath> LightVectors; typedef pset<TextureStage *> LightVectors;
INLINE const LightVectors &get_light_vectors() const; INLINE const LightVectors &get_light_vectors() const;
virtual void issue(GraphicsStateGuardianBase *gsg) const; virtual void issue(GraphicsStateGuardianBase *gsg) const;
@ -87,6 +88,7 @@ private:
INLINE ModeDef(); INLINE ModeDef();
INLINE int compare_to(const ModeDef &other) const; INLINE int compare_to(const ModeDef &other) const;
Mode _mode; Mode _mode;
string _source_name;
NodePath _light; NodePath _light;
}; };
typedef pmap<PT(TextureStage), ModeDef> Stages; typedef pmap<PT(TextureStage), ModeDef> Stages;
@ -99,8 +101,7 @@ private:
Geom::NoTexCoordStages _no_texcoords; Geom::NoTexCoordStages _no_texcoords;
// This is another optimization during rendering; it lists the // This is another optimization during rendering; it lists the
// texture stages (if any) that use M_light_vector, and their // texture stages (if any) that use M_light_vector.
// associated lights.
LightVectors _light_vectors; LightVectors _light_vectors;
// This element is only used during reading from a bam file. It has // This element is only used during reading from a bam file. It has