fixed the bug on multiple blendshape

This commit is contained in:
Asad M. Zaman 2005-12-06 01:38:37 +00:00
parent 827d79bc1d
commit f4054015c4
5 changed files with 60 additions and 91 deletions

View File

@ -50,8 +50,6 @@ MayaShader(MObject engine) {
<< "Reading shading engine " << get_name() << "\n"; << "Reading shading engine " << get_name() << "\n";
} }
_blend_type = BT_unspecified;
bool found_shader = false; bool found_shader = false;
MPlug shader_plug = engine_fn.findPlug("surfaceShader"); MPlug shader_plug = engine_fn.findPlug("surfaceShader");
if (!shader_plug.isNull()) { if (!shader_plug.isNull()) {

View File

@ -53,18 +53,6 @@ public:
typedef pvector<MayaShaderColorDef *> ColorDef; typedef pvector<MayaShaderColorDef *> ColorDef;
ColorDef _color; ColorDef _color;
enum BlendType {
BT_unspecified,
BT_modulate,
BT_decal,
BT_blend,
BT_replace,
BT_add,
BT_blend_color_scale,
};
BlendType _blend_type;
private: private:
bool read_surface_shader(MObject shader); bool read_surface_shader(MObject shader);
}; };

View File

@ -61,6 +61,8 @@ MayaShaderColorDef() {
_alpha_is_luminance = false; _alpha_is_luminance = false;
_blend_type = BT_unspecified;
_repeat_uv.set(1.0, 1.0); _repeat_uv.set(1.0, 1.0);
_offset.set(0.0, 0.0); _offset.set(0.0, 0.0);
_rotate_uv = 0.0; _rotate_uv = 0.0;
@ -98,6 +100,7 @@ MayaShaderColorDef(MayaShaderColorDef &copy) {
_wrap_u = copy._wrap_u; _wrap_u = copy._wrap_u;
_wrap_v = copy._wrap_v; _wrap_v = copy._wrap_v;
_blend_type = copy._blend_type;
_alpha_is_luminance = copy._alpha_is_luminance; _alpha_is_luminance = copy._alpha_is_luminance;
_repeat_uv = copy._repeat_uv; _repeat_uv = copy._repeat_uv;
@ -323,37 +326,23 @@ read_surface_color(MayaShader *shader, MObject color, bool trans) {
MPlug inputsPlug = layered_fn.findPlug("inputs", &status); MPlug inputsPlug = layered_fn.findPlug("inputs", &status);
MPlug blendModePlug = layered_fn.findPlug("blendMode", &status); MPlug blendModePlug = layered_fn.findPlug("blendMode", &status);
maya_cat.debug() << "number of connections: " << color_pa.length() << endl;
bool first = true;
BlendType bt = BT_modulate;
for (size_t i=0; i<color_pa.length(); ++i) {
MPlug pl = color_pa[i];
MPlugArray pla;
pl.connectedTo(pla, true, false);
// First figure out the blend mode intended for this shadercolordef
int li = pl.logicalIndex();
if (li > -1) {
// found a blend mode
maya_cat.spam() << "*** Start doIt... ***" << endl; maya_cat.spam() << "*** Start doIt... ***" << endl;
maya_cat.spam() << "inputsPlug Name: " << inputsPlug.name() << endl; maya_cat.spam() << "inputsPlug Name: " << inputsPlug.name() << endl;
//maya_cat.spam() << "inputsPlug numElem: " << inputsPlug.numElements() << endl; status = blendModePlug.selectAncestorLogicalIndex(li,inputsPlug);
maya_cat.spam() << "plug_array numElem: " << color_pa.length() << endl;
int logicalIdx = -1;
// go through the plug array to find the first logical index of blend mode
for (size_t i=0; i<color_pa.length(); ++i) {
MPlug elementPlug = color_pa[i];
int li = elementPlug.logicalIndex();
maya_cat.spam() << "li: " << li << endl;
if (li > -1) {
/*
if (li > 20) {
maya_cat.error()
<< "unusual blendmode :" << li << " for :" << layered_fn.name() << endl;
exit(1);
}
*/
logicalIdx = li;
break;
}
}
if (logicalIdx < 0) {
maya_cat.error()
<< "Could not retrieve blendMode from: " << layered_fn.name() << endl;
exit(1);
}
// Now that I have the logical index, select the ancestorLogicalIndex
// on the blendModePlug to get the blendMode
status = blendModePlug.selectAncestorLogicalIndex(logicalIdx,inputsPlug);
blendModePlug.getValue(blendValue); blendModePlug.getValue(blendValue);
maya_cat.spam() maya_cat.spam()
@ -361,29 +350,25 @@ read_surface_color(MayaShader *shader, MObject color, bool trans) {
MFnEnumAttribute blendModeEnum(blendModePlug); MFnEnumAttribute blendModeEnum(blendModePlug);
MString blendName = blendModeEnum.fieldName(blendValue, &status); MString blendName = blendModeEnum.fieldName(blendValue, &status);
switch (blendValue) { switch (blendValue) {
case 1: case 1:
shader->_blend_type = MayaShader::BT_decal; bt = BT_decal;
break; break;
case 6: case 6:
shader->_blend_type = MayaShader::BT_modulate; bt = BT_modulate;
break; break;
case 4: case 4:
shader->_blend_type = MayaShader::BT_add; bt = BT_add;
break; break;
default:
shader->_blend_type = MayaShader::BT_modulate;
} }
maya_cat.info() << layered_fn.name() << ": blendMode used " << blendName << endl; maya_cat.info() << layered_fn.name() << ": blendMode used " << blendName << endl;
maya_cat.spam() << "*** END doIt... ***" << endl; maya_cat.spam() << "*** END doIt... ***" << endl;
maya_cat.debug() << "number of connections: " << color_pa.length() << endl; // advance to the next plug, because that is where the shader info are
bool first = true; pl = color_pa[++i];
for (size_t i=0; i<color_pa.length(); ++i) {
MPlug pl = color_pa[i];
MPlugArray pla;
pl.connectedTo(pla, true, false); pl.connectedTo(pla, true, false);
}
for (size_t j=0; j<pla.length(); ++j) { for (size_t j=0; j<pla.length(); ++j) {
//maya_cat.debug() << pl.name() << " is(pl) " << pl.node().apiTypeStr() << endl; //maya_cat.debug() << pl.name() << " is(pl) " << pl.node().apiTypeStr() << endl;
//maya_cat.debug() << pla[j].name() << " is(pla) " << pla[j].node().apiTypeStr() << endl; //maya_cat.debug() << pla[j].name() << " is(pla) " << pla[j].node().apiTypeStr() << endl;
@ -401,6 +386,7 @@ read_surface_color(MayaShader *shader, MObject color, bool trans) {
MayaShaderColorDef *color_p = new MayaShaderColorDef; MayaShaderColorDef *color_p = new MayaShaderColorDef;
color_p->read_surface_color(shader, pla[j].node()); color_p->read_surface_color(shader, pla[j].node());
color_p->_texture_name.assign(pla[j].name().asChar()); color_p->_texture_name.assign(pla[j].name().asChar());
color_p->_blend_type = bt;
size_t loc = color_p->_texture_name.find('.',0); size_t loc = color_p->_texture_name.find('.',0);
if (loc != string::npos) { if (loc != string::npos) {
color_p->_texture_name.resize(loc); color_p->_texture_name.resize(loc);
@ -411,6 +397,7 @@ read_surface_color(MayaShader *shader, MObject color, bool trans) {
maya_cat.debug() << pl.name().asChar() << " first:connectedTo: " << pla_name << endl; maya_cat.debug() << pl.name().asChar() << " first:connectedTo: " << pla_name << endl;
read_surface_color(shader, pla[j].node()); read_surface_color(shader, pla[j].node());
_texture_name.assign(pla[j].name().asChar()); _texture_name.assign(pla[j].name().asChar());
_blend_type = bt;
size_t loc = _texture_name.find('.',0); size_t loc = _texture_name.find('.',0);
if (loc != string::npos) { if (loc != string::npos) {
_texture_name.resize(loc); _texture_name.resize(loc);
@ -418,21 +405,7 @@ read_surface_color(MayaShader *shader, MObject color, bool trans) {
maya_cat.debug() << "uv_name : " << _texture_name << endl; maya_cat.debug() << "uv_name : " << _texture_name << endl;
first = false; first = false;
} }
// lets see what this is connected to!?
MPlug pl_temp = pla[j];
MPlugArray pla_temp;
pl_temp.connectedTo(pla_temp, true, false);
maya_cat.debug() << pl_temp.name().asChar() << " connectedTo:" << pla_temp.length() << " plugs\n";
} }
/*
string blah;
get_enum_attribute(pl.node(),"blendMode",blah);
maya_cat.info() << "rsc layer: blend mode :" << blah << endl;
float alpha;
get_maya_attribute(pl.node(),"alpha",alpha);
maya_cat.info() << "rsc layer: alpha :" << alpha << endl;
*/
} }
} else { } else {
// This shader wasn't understood. // This shader wasn't understood.

View File

@ -46,6 +46,18 @@ public:
void write(ostream &out) const; void write(ostream &out) const;
enum BlendType {
BT_unspecified,
BT_modulate,
BT_decal,
BT_blend,
BT_replace,
BT_add,
BT_blend_color_scale,
};
BlendType _blend_type;
enum ProjectionType { enum ProjectionType {
PT_off, PT_off,
PT_planar, PT_planar,
@ -58,6 +70,11 @@ public:
PT_perspective, PT_perspective,
}; };
ProjectionType _projection_type;
LMatrix4d _projection_matrix;
double _u_angle;
double _v_angle;
bool _has_texture; bool _has_texture;
Filename _texture_filename; Filename _texture_filename;
string _texture_name; string _texture_name;
@ -67,11 +84,6 @@ public:
bool _has_flat_color; bool _has_flat_color;
Colord _flat_color; Colord _flat_color;
ProjectionType _projection_type;
LMatrix4d _projection_matrix;
double _u_angle;
double _v_angle;
LVector2f _coverage; LVector2f _coverage;
LVector2f _translate_frame; LVector2f _translate_frame;
double _rotate_frame; double _rotate_frame;

View File

@ -2331,9 +2331,7 @@ set_shader_attributes(EggPrimitive &primitive, const MayaShader &shader,
// from the texture file. But the top textures may have to strip the alpha // from the texture file. But the top textures may have to strip the alpha
if (i!=shader._color.size()-1) { if (i!=shader._color.size()-1) {
// read the _alpha_is_luminance to figure out env_type // read the _alpha_is_luminance to figure out env_type
//if (!shader._alpha_is_luminance) tex.set_env_type((EggTexture::EnvType)color_def->_blend_type);
//tex.set_env_type(EggTexture::ET_decal);
tex.set_env_type((EggTexture::EnvType)shader._blend_type);
// multitexture modulate mode may specify, desired alpha on/off // multitexture modulate mode may specify, desired alpha on/off
if (!color_def->_alpha_is_luminance) if (!color_def->_alpha_is_luminance)
tex.set_alpha_mode(EggRenderMode::AM_off); // Force alpha to be 'off' tex.set_alpha_mode(EggRenderMode::AM_off); // Force alpha to be 'off'