static PyObject * iCompoundProperty_getPropertyNames(PyObject * self, PyObject * args) { ALEMBIC_TRY_STATEMENT Abc::ICompoundProperty *icprop = ((iCompoundProperty*)self)->mBaseCompoundProperty; const int nb_prop = icprop->getNumProperties(); PyObject *tuple = PyTuple_New(nb_prop); for (int i = 0; i < nb_prop; ++i) PyTuple_SetItem(tuple,i,Py_BuildValue("s",icprop->getPropertyHeader(i).getName().c_str())); return tuple; ALEMBIC_PYOBJECT_CATCH_STATEMENT }
AbcM::IMaterialSchema getMatSchema(AbcG::ILight& objLight) { Abc::ICompoundProperty props = objLight.getProperties(); for(int i=0; i<props.getNumProperties(); i++){ Abc::PropertyHeader propHeader = props.getPropertyHeader(i); if(AbcM::IMaterialSchema::matches(propHeader)){ return AbcM::IMaterialSchema(props, propHeader.getName()); } } return AbcM::IMaterialSchema(); }
void AbcNodeUtils::printCompoundProperty( Abc::ICompoundProperty prop ) { if(!prop){ return; } for(size_t i=0; i<prop.getNumProperties(); i++){ AbcA::PropertyHeader pheader = prop.getPropertyHeader(i); AbcA::PropertyType propType = pheader.getPropertyType(); ESS_LOG_WARNING("PropertyType: "<<AbcNodeUtils::getTypeStr(propType)); ESS_LOG_WARNING("PropertyName: "<<pheader.getName()<<", pod: "<<AbcNodeUtils::getPodStr(pheader.getDataType().getPod()) \ <<", extent: "<<(int)pheader.getDataType().getExtent()<<", interpretation: "<<pheader.getMetaData().get("interpretation")); } }
int AlembicImport_Light(const std::string &path, AbcG::IObject& iObj, alembic_importoptions &options, INode** pMaxNode) { //#define OMNI_LIGHT_CLASS_ID 0x1011 //#define SPOT_LIGHT_CLASS_ID 0x1012 //#define DIR_LIGHT_CLASS_ID 0x1013 //#define FSPOT_LIGHT_CLASS_ID 0x1014 //#define TDIR_LIGHT_CLASS_ID 0x1015 //#define OMNI_LIGHT 0 // Omnidirectional //#define TSPOT_LIGHT 1 // Targeted //#define DIR_LIGHT 2 // Directional //#define FSPOT_LIGHT 3 // Free //#define TDIR_LIGHT 4 // Targeted directional if(options.attachToExisting){ ESS_LOG_WARNING("Attach to existing for lights is not yet supported. Could not attach "<<iObj.getFullName()); return alembic_success; } std::vector<matShader> shaders; AbcG::ILight objLight = AbcG::ILight(iObj, Alembic::Abc::kWrapExisting); std::string identifier = objLight.getFullName(); //CompoundPropertyReaderPtr propReader = objLight.getProperties(); Abc::ICompoundProperty props = objLight.getProperties(); InputLightType::enumt lightType = InputLightType::NUM_INPUT_LIGHT_TYPES; for(int i=0; i<props.getNumProperties(); i++){ Abc::PropertyHeader propHeader = props.getPropertyHeader(i); if(AbcM::IMaterialSchema::matches(propHeader)){ AbcM::IMaterialSchema matSchema(props, propHeader.getName()); //ESS_LOG_WARNING("MaterialSchema present on light."); lightType = readShader(matSchema, shaders); } //ESS_LOG_WARNING("name: "<<propHeader.getName()); //if( AbcG::ICameraSchema::matches(propHeader) ){ // ESS_LOG_WARNING("Found light camera."); // //AbcG::ICameraSchema camSchema(props, propHeader.getName()); //} } bool bReplaceExisting = false; int nodeRes = alembic_failure; if(lightType == InputLightType::AMBIENT_LIGHT){ nodeRes = createNode(iObj, LIGHT_CLASS_ID, Class_ID(OMNI_LIGHT_CLASS_ID, 0), pMaxNode, bReplaceExisting); //Modifier* pModifier = FindModifier(*pMaxNode, Class_ID(OMNI_LIGHT_CLASS_ID, 0)); //if(pModifier){ // ESS_LOG_WARNING("NumParamBlocks: "<<pModifier->NumParamBlocks()); //} //printControllers(*pMaxNode); //pMaxNode>GetParamBlockByID( 0 )->SetValue( GetParamIdByName( pModifier, 0, "muted" ), zero, FALSE ); GET_MAX_INTERFACE()->SelectNode(*pMaxNode); //set the ambient check box, intensity controller, and light colour controller (not sure how to this in C++) std::stringstream evalStream; std::string modkey(""); for(int s=0; s<shaders.size(); s++){ std::string target = shaders[s].target; std::string type = shaders[s].type; for(int i=0; i<shaders[s].props.size(); i++){ std::string propName = shaders[s].props[i].name; std::string& val = shaders[s].props[i].displayVal; bool& bConstant = shaders[s].props[i].bConstant; const AbcA::DataType& datatype = shaders[s].props[i].propHeader.getDataType(); const AbcA::MetaData& metadata = shaders[s].props[i].propHeader.getMetaData(); if(datatype.getPod() == AbcA::kFloat32POD){ std::stringstream propStream; propStream<<target<<"."<<type<<"."<<propName; if(datatype.getExtent() == 1 && propName.find("intensity") != std::string::npos ){ //intensity property found, so attach controller addFloatController(evalStream, options, modkey, std::string("multiplier"), path, iObj.getFullName(), propStream.str()); } else if(datatype.getExtent() == 3 && propName.find("lightcolor") != std::string::npos ){ //color property found, so attach controller std::stringstream xStream, yStream, zStream; xStream<<propStream.str()<<"."<<metadata.get("interpretation")<<".x"; yStream<<propStream.str()<<"."<<metadata.get("interpretation")<<".y"; zStream<<propStream.str()<<"."<<metadata.get("interpretation")<<".z"; evalStream<<"$.rgb.controller = Color_RGB()\n"; addFloatController(evalStream, options, modkey, std::string("rgb.controller.r"), path, iObj.getFullName(), xStream.str()); addFloatController(evalStream, options, modkey, std::string("rgb.controller.g"), path, iObj.getFullName(), yStream.str()); addFloatController(evalStream, options, modkey, std::string("rgb.controller.b"), path, iObj.getFullName(), zStream.str()); } } else{ } evalStream<<"\n"; } } evalStream<<"$.ambientOnly = true\n"; ExecuteMAXScriptScript( EC_UTF8_to_TCHAR((char*)evalStream.str().c_str())); } else{//create a null, if we don't know what type of light this is nodeRes = createNode(iObj, HELPER_CLASS_ID, Class_ID(DUMMY_CLASS_ID,0), pMaxNode, bReplaceExisting); } if(nodeRes == alembic_failure){ return nodeRes; } GET_MAX_INTERFACE()->SelectNode(*pMaxNode); for(int i=0; i<shaders.size(); i++){ std::sort(shaders[i].props.begin(), shaders[i].props.end(), sortFunc); Modifier* pMod = createDisplayModifier("Shader Properties", shaders[i].name, shaders[i].props); std::string target = shaders[i].target; std::string type = shaders[i].type; addControllersToModifier("Shader Properties", shaders[i].name, shaders[i].props, target, type, path, iObj.getFullName(), options); } // ----- TODO: add camera modifier //createCameraModifier(path, identifier, *pMaxNode); // ----- TODO: don't attach controllers for constant parameters //TODO: make the spinners read only return alembic_success; }
//TODO: out at maximum one warning per unsupported type void readInputProperties( Abc::ICompoundProperty prop, std::vector<AbcProp>& props ) { if(!prop){ return; } for(size_t i=0; i<prop.getNumProperties(); i++){ AbcA::PropertyHeader pheader = prop.getPropertyHeader(i); AbcA::PropertyType propType = pheader.getPropertyType(); //ESS_LOG_WARNING("Property, propName: "<<pheader.getName()<<", pod: "<<getPodStr(pheader.getDataType().getPod()) \ // <<", extent: "<<(int)pheader.getDataType().getExtent()<<", interpretation: "<<pheader.getMetaData().get("interpretation")); int invalidStrIndex = containsInvalidString(pheader.getName()); if( invalidStrIndex > 0 ){ ESS_LOG_WARNING("Skipping property "<<pheader.getName()<<" because it contains an invalid character: "<<invalidStrTable[invalidStrIndex]); continue; } if( propType == AbcA::kCompoundProperty ){ //printInputProperties(Abc::ICompoundProperty(prop, pheader.getName())); //ESS_LOG_WARNING("Unsupported compound property: "<<pheader.getName()); } else if( propType == AbcA::kScalarProperty ){ //ESS_LOG_WARNING("Scaler property: "<<pheader.getName()); // std::string displayVal; bool bConstant = true; int sortId = 0; int size = 0; if(Abc::IBoolProperty::matches(pheader)){ //I need to know the name and type only if animated; an appropriate controller will handle reading the data. //If not animated, the value will set directly on the light and/or display modifier Abc::IBoolProperty boolProp(prop, pheader.getName()); /*if(boolProp.isConstant()){*/ AbcU::bool_t bVal = false; boolProp.get(bVal); if(bVal == true) displayVal = "true"; else displayVal = "false"; //} //else{ // //} } else if(readPropExt1<Abc::IInt32Property, int>(prop, pheader, displayVal, bConstant)); else if(readPropExt1<Abc::IFloatProperty, float>(prop, pheader, displayVal, bConstant)); else if(readPropExt3<Abc::IC3fProperty, Abc::C3f>(prop, pheader, displayVal, bConstant)); else if(readPropExt3<Abc::IV3fProperty, Abc::V3f>(prop, pheader, displayVal, bConstant)); else if(readPropExt3<Abc::IN3fProperty, Abc::N3f>(prop, pheader, displayVal, bConstant)); else if(Abc::IStringProperty::matches(pheader)){ Abc::IStringProperty stringProp(prop, pheader.getName()); stringProp.get(displayVal); sortId = 1000000000; } else{ // Abc::PropertyHeader propHeader = props.getPropertyHeader(i); // AbcA::PropertyType propType = propHeader.getPropertyType(); ESS_LOG_WARNING("Unsupported property, propName: "<<pheader.getName()<<", pod: "<<getPodStr(pheader.getDataType().getPod()) \ <<", extent: "<<(int)pheader.getDataType().getExtent()<<", interpretation: "<<pheader.getMetaData().get("interpretation")); } props.push_back(AbcProp(pheader.getName(), displayVal, pheader, bConstant, sortId)); } else if( propType == AbcA::kArrayProperty ){ //ESS_LOG_WARNING("Unsupported array property: "<<pheader.getName()); //it the moment is unlikely we will support array properties in 3DS Max. They won't work so well with our display modifier system. //ESS_LOG_WARNING("Unsupported array property, propName: "<<pheader.getName()<<", pod: "<<getPodStr(pheader.getDataType().getPod()) \ //<<", extent: "<<(int)pheader.getDataType().getExtent()<<", interpretation: "<<pheader.getMetaData().get("interpretation")); } else{ ESS_LOG_WARNING("Unsupported input property: "<<pheader.getName()); } } }