void HwShaderExporter::exportEffectParameters ( StdMat2* material ) { COLLADASW::StreamWriter* streamWriter = &mDocumentExporter->getStreamWriter(); IParamBlock2 * pblock = material->GetParamBlock ( 0 ); int parameterCount = pblock->NumParams(); for ( int i = 0; i < parameterCount; i++ ) { ParamID parameterID = pblock->IndextoID( i ); ParamType2 parameterType = pblock->GetParameterType( parameterID ); ParamDef parameterDef = pblock->GetParamDef( parameterID ); const TCHAR* paramName = parameterDef.int_name; switch ( parameterType ) { case TYPE_FLOAT: { COLLADASW::NewParam<> newParam ( streamWriter ); newParam.setParamType ( COLLADASW::ValueType::FLOAT ); int numOfValues = 1; float paramValue = pblock->GetFloat( parameterID ); exportParam ( paramName, &newParam, ¶mValue, numOfValues ); break; } case TYPE_INT: { COLLADASW::NewParam<> newParam ( streamWriter ); newParam.setParamType ( COLLADASW::ValueType::INT ); int numOfValues = 1; int paramValue = pblock->GetInt( parameterID ); exportParam ( paramName, &newParam, ¶mValue, numOfValues ); break; } case TYPE_RGBA: case TYPE_FRGBA: { COLLADASW::NewParam<> newParam ( streamWriter ); newParam.setParamType ( COLLADASW::ValueType::FLOAT4 ); int numOfValues = 4; AColor paramPoint3Value = pblock->GetAColor( parameterID ); float* paramValue = (float*)paramPoint3Value; exportParam ( paramName, &newParam, paramValue, numOfValues ); break; } case TYPE_POINT3: { COLLADASW::NewParam<> newParam ( streamWriter ); newParam.setParamType ( COLLADASW::ValueType::FLOAT3 ); int numOfValues = 3; Point3 paramPoint3Value = pblock->GetPoint3( parameterID ); float* paramValue = (float*)paramPoint3Value; exportParam ( paramName, &newParam, paramValue, numOfValues ); break; } case TYPE_BOOL: { COLLADASW::NewParam<> newParam ( streamWriter ); newParam.setParamType ( COLLADASW::ValueType::BOOL ); int numOfValues = 1; /*bool*/ int paramValue = pblock->GetInt( parameterID ); exportParam ( paramName, &newParam, ¶mValue, numOfValues ); break; } //TYPE_ANGLE //TYPE_PCNT_FRAC //TYPE_WORLD case TYPE_STRING: { COLLADASW::NewParam<> newParam ( streamWriter ); const MCHAR * paramValue = pblock->GetStr( parameterID ); exportParam ( paramName, &newParam, paramValue ); break; } //TYPE_FILENAME //TYPE_HSV //TYPE_COLOR_CHANNEL //TYPE_TIMEVALUE //TYPE_RADIOBTN_INDEX //TYPE_MTL //TYPE_TEXMAP case TYPE_BITMAP: { PBBitmap * bitmap = pblock->GetBitmap( parameterID ); exportSampler ( paramName, bitmap ); break; } //TYPE_INODE //TYPE_REFTARG //TYPE_INDEX //TYPE_MATRIX3 //TYPE_PBLOCK2 case TYPE_POINT4: { COLLADASW::NewParam<> newParam ( streamWriter ); newParam.setParamType ( COLLADASW::ValueType::FLOAT4 ); int numOfValues = 4; Point4 paramPoint3Value = pblock->GetPoint4( parameterID ); float* paramValue = (float*)paramPoint3Value; exportParam ( paramName, &newParam, paramValue, numOfValues ); break; } default: { //:TODO: warning (file and/or popup) GetCOREInterface()->Log()->LogEntry( SYSLOG_WARN, DISPLAY_DIALOG, _M( "Parameter export problem" ),_M( "Unsupported parameter type (%i) for parameter %s\n" ), parameterType, paramName ); } } } }
void MaxAWDExporter::ExportUserAttributes(Animatable *obj, AWDAttrElement *elem) { if (!opts->ExportAttributes()) return; ICustAttribContainer *attributes = obj->GetCustAttribContainer(); if (attributes) { int a=0; int numAttribs=0; numAttribs = attributes->GetNumCustAttribs(); for (a=0; a<numAttribs; a++) { int k=0; CustAttrib *attr = attributes->GetCustAttrib(a); for (k=0; k<attr->NumParamBlocks(); k++) { int p=0; IParamBlock2 *block = attr->GetParamBlock(k); if (block!=NULL){ char * blockName_ptr=W2A(block->GetLocalName()); if (ATTREQ(blockName_ptr,"AWDObjectSettingsParams") ){ } // the next three should not occur yet, as we do not read Custom-properties on materials yet else if (ATTREQ(blockName_ptr,"AWD_MaterialSettingsparams") ){ } else if (ATTREQ(blockName_ptr,"AWD_EffectMethodsparams") ){ } else if (ATTREQ(blockName_ptr,"AWDShadingParams") ){ } else{ for (p=0; p<block->NumParams(); p++) { ParamID pid = block->IndextoID(p); Color col; AColor acol; Interval valid = FOREVER; awd_uint16 len = 0; AWD_field_type type = AWD_FIELD_FLOAT32; AWD_field_ptr ptr; ptr.v = NULL; switch (block->GetParameterType(pid)) { case TYPE_ANGLE: case TYPE_PCNT_FRAC: case TYPE_WORLD: case TYPE_FLOAT: type = AWD_FIELD_FLOAT64; len = sizeof(awd_float64); ptr.v = malloc(len); *ptr.f64 = block->GetFloat(pid); break; case TYPE_TIMEVALUE: case TYPE_INT: type = AWD_FIELD_INT32; len = sizeof(awd_int32); ptr.v = malloc(len); *ptr.i32 = block->GetInt(pid); break; case TYPE_BOOL: type = AWD_FIELD_BOOL; len = sizeof(awd_bool); ptr.v = malloc(len); *ptr.b = (0 != block->GetInt(pid)); break; case TYPE_FILENAME: case TYPE_STRING: type = AWD_FIELD_STRING; ptr.str = (char*)block->GetStr(pid); len = strlen(ptr.str); break; case TYPE_RGBA: type = AWD_FIELD_COLOR; len = sizeof(awd_color); col = block->GetColor(pid); ptr.v = malloc(len); *ptr.col = awdutil_float_color(col.r, col.g, col.b, 1.0); break; case TYPE_FRGBA: type = AWD_FIELD_COLOR; len = sizeof(awd_color); acol = block->GetAColor(pid); ptr.v = malloc(len); *ptr.col = awdutil_float_color(acol.r, acol.g, acol.b, acol.a); break; } if (ptr.v != NULL) { ParamDef def = block->GetParamDef(pid); if (ns == NULL) { // Namespace has not yet been created; ns is a class // variable that will be created only once and then // reused for all user attributes. char * ns_ptr=opts->AttributeNamespace();//dont free, as this will get freed in the opts delete ns = new AWDNamespace(ns_ptr, strlen(ns_ptr)); awd->add_namespace(ns); } char * thisName=W2A(def.int_name); elem->set_attr(ns, thisName, strlen(thisName)+1, ptr, len, type); free(thisName); } } } free(blockName_ptr); } } } } }