MStatus mDbl3dNoise::doIt( const MArgList& args ) { if (args.length() == 1) { // vector array // get the arguments MDoubleArray dblA; unsigned int count; MStatus stat = getArgVec(args, dblA, count); ERROR_FAIL(stat); // do the job MDoubleArray result = MDoubleArray(count); Noise noiseGen; for(int i=0;i<count;i++) { int id = ELEMENTS_VEC *i; result[i] = noiseGen.improvedPerlin3dS(float(dblA[id]), float(dblA[id+1]),float(dblA[id+2])); } setResult(result); } else if (args.length() == 3) { // get the arguments MDoubleArray dblA, dblB, dblC; unsigned int incA, incB, incC, count; MStatus stat = getArgDblDblDbl(args, dblA, dblB, dblC, incA, incB, incC, count); ERROR_FAIL(stat); // do the actual job unsigned int iterA, iterB, iterC; iterA = iterB = iterC = 0; MDoubleArray result(count); Noise noiseGen; for (unsigned int i=0;i<count;i++) { result[i] = noiseGen.improvedPerlin3dS(float(dblA[iterA]), float(dblB[iterB]), float(dblC[iterC])); iterA += incA; iterB += incB; iterC += incC; } setResult(result); } else { USER_ERROR_CHECK(MS::kFailure,("mDbl3dNoise: wrong number of arguments, should be 1 vecArray or 3 dblArrays!")); } return MS::kSuccess; }
MStatus mDblGauss::doIt( const MArgList& args ) { MStatus stat; int count = 1; srand(mfSeed); // check how many arguments we have if (args.length() == 0) { // no args // just return a single double setResult(MDoubleArray(1,gauss())); return MS::kSuccess; } else if (args.length() == 1) { // one args, check if its an int - if yes return int identity arrays stat = getIntArg(args, 0, count); ERROR_FAIL(stat); MDoubleArray result(count); double randDif = ((double)RAND_MAX + 1); for (int i=0; i< count; i++) result[i] = gauss(); setResult(result); return MS::kSuccess; } else if (args.length() == 3) { double mean, diff; stat = getIntArg(args, 0, count); ERROR_FAIL(stat); stat = getDoubleArg(args, 1, mean); ERROR_FAIL(stat); stat = getDoubleArg(args, 2, diff); ERROR_FAIL(stat); MDoubleArray result(count); for (int i=0; i< count; i++) result[i] = gauss()*diff+mean; setResult(result); return MS::kSuccess; } else { ERROR_FAIL(MS::kFailure); } }
MStatus mDbl2dNoise::doIt( const MArgList& args ) { if (args.length() == 1) { // get the arguments MDoubleArray dblA; unsigned int count; MStatus stat = getArgUV(args, dblA, count); ERROR_FAIL(stat); // do the job MDoubleArray result = MDoubleArray(count); Noise noiseGen; for(int i=0;i<count;i++) result[i] = noiseGen.improvedPerlin2dS(float(dblA[i*ELEMENTS_UV]), float(dblA[i*ELEMENTS_UV+1])); setResult(result); } else if (args.length() == 2) { // get the arguments MDoubleArray dblA, dblB; unsigned int incA, incB, count; MStatus stat = getArgDblDbl(args, dblA, dblB, incA, incB, count); ERROR_FAIL(stat); // do the actual job unsigned int iterA, iterB; iterA = iterB = 0; MDoubleArray result(count); Noise noiseGen; for (unsigned int i=0;i<count;i++) { result[i] = noiseGen.improvedPerlin2dS(float(dblA[iterA]), float(dblB[iterB])); iterA += incA; iterB += incB; } setResult(result); } else { USER_ERROR_CHECK(MS::kFailure,("mDbl2dNoise: wrong number of arguments, should be 1 uvArray or 2 dblArrays!")); } return MS::kSuccess; }
MStatus mDblRand::doIt( const MArgList& args ) { MStatus stat; int count = 1; srand(mfSeed); // check how many arguments we have if (args.length() == 0) { // no args // just return a single double setResult(MDoubleArray(1,(rand()/((double)RAND_MAX + 1)))); return MS::kSuccess; } else if (args.length() == 1) { // one args, check if its an int - if yes return int identity arrays stat = getIntArg(args, 0, count); ERROR_FAIL(stat); MDoubleArray result(count); double randDif = ((double)RAND_MAX + 1); for (int i=0; i< count; i++) result[i] = rand()/randDif; setResult(result); return MS::kSuccess; } else if (args.length() == 3) { double min, max; stat = getIntArg(args, 0, count); ERROR_FAIL(stat); stat = getDoubleArg(args, 1, min); ERROR_FAIL(stat); stat = getDoubleArg(args, 2, max); ERROR_FAIL(stat); MDoubleArray result(count); if (min == max) { result = MDoubleArray(count,max); } else { if (max < min) { //swap double help = max; max = min; min = help; } double randDif = ((double)RAND_MAX + 1) / (max-min); for (int i=0; i< count; i++) result[i] = (rand()/randDif)+min; } setResult(result); return MS::kSuccess; } else { ERROR_FAIL(MS::kFailure); } }
MStatus boingRbCmd::redoIt() { if (argParser->isFlagSet("help") || argParser->isFlagSet("h")) { MString helpMsg = "boingRB - command : Boing - bullet plugin by Risto Puukko\n"; helpMsg += "---------------------------------------------------------\n"; helpMsg += "boingRB [flag] [args] \n"; helpMsg += "\n"; helpMsg += "flags :\n"; helpMsg += " -getAttr [name.attr]\n"; helpMsg += " example : boingRb -getAttr (\"boingRb1.velocity\");\n" ; helpMsg += "\n"; helpMsg += " -getAttr [*.attr]\n"; helpMsg += " example : boingRb -getAttr (\"*.name\");\n" ; helpMsg += "\n"; helpMsg += " -setAttr [name.attr] -value [float float float ]\n"; helpMsg += " example : boingRb -setAttr (\"boingRb1.velocity\") -value 0 4 3 ;\n" ; helpMsg += "\n"; helpMsg += " -addAttr [name.attr] -type [int/double/string/vector]\n"; helpMsg += " example : boingRb -addAttr \"sampleRb.IntAttribute\" -type \"int\";\n" ; helpMsg += " example : boingRb -addAttr \"sampleRb.VectorAttribute\" -type \"vector\";\n" ; helpMsg += "\n"; helpMsg += " -create [ ( \"name=string;geo=string;velocity/vel=float,float,float;position/pos=float,float,float\" )]\n"; helpMsg += " example : boingRb -create (\"name=sampleRb;geo=pCubeShape1;pos=0,4,0\");\n"; helpMsg += "\n"; helpMsg += " -exists [name]\n"; helpMsg += " example : boingRb -exists \"sampleRb\";\n" ; helpMsg += "\n"; helpMsg += " -delete [name]\n"; helpMsg += " example : boingRb -delete \"sampleRb\";\n"; helpMsg += "\n"; helpMsg += "---------------------------------------------------------\n"; MGlobal::displayInfo(helpMsg); return MS::kSuccess; } isSetAttr = argParser->isFlagSet("-setAttr"); isGetAttr = argParser->isFlagSet("-getAttr"); isAddAttr = argParser->isFlagSet("-addAttr"); isType = argParser->isFlagSet("-type"); isExists = argParser->isFlagSet("-exists"); isAttributeExist = argParser->isFlagSet("-attributeExist"); isCreate = argParser->isFlagSet("-create"); isDelete = argParser->isFlagSet("-delete"); isValue = argParser->isFlagSet("-value"); //std::cout<<"argsList : "<<*argsList<<std::endl; //unsigned i; //MStatus stat; //MVector res; // Parse the arguments. /* for (i = 0; i <argsList->length (); i++) { //MString arg = argsList->asString(i, &stat); //if (MS::kSuccess == stat) std::cout<<"arg["<<i<<"] : "<<arg<<std::endl; if ( MString ("-setAttr") == argsList->asString(i, &stat) && MString ("-value") == argsList->asString(i+2, &stat) && MS::kSuccess == stat ) { for (unsigned j=3; j!=6; ++j) res[j-3 ] = argsList->asDouble (j, &stat); } } std::cout<<"res : "<<res<<std::endl; */ if (isSetAttr && isValue) { MString sAttr; argParser->getFlagArgument("setAttr", 0, sAttr); //std::cout<<sAttr<<std::endl; MStringArray jobArgsArray = parseArguments(sAttr, "."); MString rbName = jobArgsArray[0]; MString attr = checkAttribute(jobArgsArray[1]); //std::cout<<"attr : "<<attr<<std::endl; if ( attr == "custom" ) { MString customAttr = jobArgsArray[1]; //char * custAttr = (char*)customAttr.asChar(); //std::cout<<"customAttr : "<<customAttr<<std::endl; shared_ptr<bSolverNode> b_solv = bSolverNode::get_bsolver_node(); bSolverNode::m_custom_data *data = b_solv->getdata(rbName); //std::cout<<"data : "<<data<<std::endl; if (!data) return MS::kFailure; //std::cout<<"data->m_int_data : "<<data->m_int_data<<std::endl; MString type = b_solv->getAttrType(data, customAttr); //std::cout<<"attrype : "<<type<<std::endl; if (type == "string") { //std::cout<<"saving custom string : "<<customAttr<<std::endl; MString value; value = argsList->asString(3); data->m_string_data.append(value); b_solv->set_custom_data_string(data, customAttr, value); //data->m_attr_type.append(customAttr); //char * chars = (char *)value.asChar(); //void * char_ptr = (void *)chars; //b_solv->set_custom_data(customAttr, char_ptr); } else if (type == "double") { //std::cout<<"saving custom double : "<<customAttr<<std::endl; double value; value = argsList->asDouble(3); data->m_double_data.append(value); b_solv->set_custom_data_double(data, customAttr, value); //data->m_attr_type.append(customAttr); //void *val = &value; //b_solv->set_custom_data(customAttr, val); } else if (type == "int") { //std::cout<<"saving custom int : "<<customAttr<<std::endl; int value; value = argsList->asInt(3); //std::cout<<"argsList->get(3, value) -> value : "<<value<<std::endl; data->m_int_data.append(value); b_solv->set_custom_data_int(data, customAttr, value); //data->m_attr_type.append(customAttr); //std::cout<<"data->m_int_data : "<<data->m_int_data<<std::endl; //void *val = &value; //b_solv->set_custom_data(customAttr, val); //std::cout<<"b_solv->set_custom_data,static_cast<void*>(&value)) DONE!!!"<<std::endl; } else if (type == "vector") { //std::cout<<"saving custom vector : "<<customAttr<<std::endl; MVector value = MVector(); value.x = argsList->asDouble(3); value.y = argsList->asDouble(4); value.z = argsList->asDouble(5); data->m_vector_data.append(value); b_solv->set_custom_data_vector(data, customAttr, value); //data->m_attr_type.append(customAttr); //MVector *MVecPtr = &value; //void * vec_ptr = static_cast<void*const>(MVecPtr); //b_solv->set_custom_data(customAttr, vec_ptr); } } else { if (attr == "velocity" || attr == "position" || attr == "angularVelocity") { MVector value; value.x = argsList->asDouble(3); value.y = argsList->asDouble(4); value.z = argsList->asDouble(5); //std::cout<<"vector argument : "<<value<<std::endl; setBulletVectorAttribute(rbName, attr, value); } } //cout<<value<<endl; setResult(MS::kSuccess); } else if ( isAttributeExist ) { MString exAttr; bool result = false; argParser->getFlagArgument("attributeExist", 0, exAttr); //std::cout<<"exAttr : "<<exAttr<<std::endl; MStringArray jobArgsArray = parseArguments(exAttr, "."); MString rbname = jobArgsArray[0]; //std::cout<<"rbname : "<<rbname<<std::endl; MString attrToQuery = jobArgsArray[1]; //std::cout<<"attrToQuery : "<<attrToQuery<<std::endl; MString attr = checkAttribute(attrToQuery); //std::cout<<"attr : "<<attr<<std::endl; if ( attr == "custom" ){ // here we check if user attribute by the name attrToQuery exists shared_ptr<bSolverNode> b_solv = bSolverNode::get_bsolver_node(); //char * queryAttr = (char*)attrToQuery.asChar(); MString attrResult = b_solv->getAttrType(b_solv->getdata(rbname), attrToQuery); if (attrResult != "") //if (b_solv->attribute_exists(attrToQuery)) result = true; //std::cout<<result<<std::endl;; setResult(result); } } else if ( isAddAttr && isType ) { MString aAttr; argParser->getFlagArgument("addAttr", 0, aAttr); //std::cout<<"aAttr : "<<aAttr<<std::endl; MStringArray jobArgsArray = parseArguments(aAttr, "."); //std::cout<<"jobArgsArray : "<<jobArgsArray<<std::endl; MString rbname = jobArgsArray[0]; MString attrAdded = jobArgsArray[1]; //char *added = (char *)attrAdded.asChar(); MString attrType; argParser->getFlagArgument("-type", 0, attrType); //char *type = (char *)attrType.asChar(); //std::cout<<"attrType : "<<attrType<<std::endl; shared_ptr<bSolverNode> b_solv = bSolverNode::get_bsolver_node(); bSolverNode::m_custom_data *data = b_solv->getdata(rbname); data->m_attr_name.append(attrAdded); data->m_attr_type.append(attrType); b_solv->saveAttrType(data, attrAdded, attrType); //std::cout<<"attr "<<aAttr<<" added"<<std::endl; //std::cout<<"data->m_attr_type : "<<data->m_attr_type<<std::endl; //std::cout<<"data->m_attr_name : "<<data->m_attr_name<<std::endl; } else if ( isGetAttr) { MString gAttr; shared_ptr<bSolverNode> b_solv = bSolverNode::get_bsolver_node(); argParser->getFlagArgument("getAttr", 0, gAttr); //std::cout<<gAttr<<std::endl; MStringArray jobArgsArray = parseArguments(gAttr, "."); MString rbname = jobArgsArray[0]; //std::cout<<"name : "<<rbname<<std::endl; if ( rbname == "" ) { MString errorMsg = "ERROR ! boing -getAttr must provide a rigid body name!"; displayWarning(errorMsg, true); return MS::kFailure; } MString attr = checkAttribute(jobArgsArray[1]); //std::cout<<"attr = "<<attr<<std::endl; if ( attr=="velocity" || attr=="position" || attr=="angularVelocity" ) { //MVector result = MDoubleArray dResult = getBulletVectorAttribute(rbname, attr); setResult(dResult); } else if (attr == "contactPositions") { bSolverNode::m_custom_data *data = b_solv->getdata(rbname); MDoubleArray d_points = MDoubleArray(); if ( data->m_contact_count > 0 ) { MPointArray points = data->m_contact_positions; for (int i=0; i<points.length();i++) { d_points.append(points[i].x); d_points.append(points[i].y); d_points.append(points[i].z); } } setResult(d_points); } else if (attr == "contactGeos") { MStringArray contact_objects = MStringArray(); bSolverNode::m_custom_data *data = b_solv->getdata(rbname); if ( data->m_contact_count > 0 ) { MStringArray contact_objects = data->m_contact_objects; } setResult(contact_objects); } else if (attr == "contactCount") { bSolverNode::m_custom_data *data = b_solv->getdata(rbname); int contact_count = data->m_contact_count; setResult(contact_count); } else if (attr == "name") { MStringArray result; MStringArray names = b_solv->get_all_keys(); //std::cout<<"names : "<<names<<std::endl; //std::cout<<"b_solv->getdatalength() : "<<b_solv->getdatalength()<<std::endl; for(int i=0; i < names.length(); i++) { bSolverNode::m_custom_data *data = b_solv->getdata(names[i]); if ( NULL != data) { //std::cout<<"data->name : "<<data->name<<std::endl; //std::cout<<"data->m_initial_position: "<<data->m_initial_position<<std::endl; result.append(data->name); } } setResult(result); } else if ( attr == "" ) { MString errorMsg = "ERROR ! boing -getAttr must provide an attribute name to query!"; displayWarning(errorMsg, true); return MS::kFailure; } else if ( attr == "custom" ){ // here we handle user attributes MString customAttr = jobArgsArray[1]; //char * custAttr = (char*)customAttr.asChar(); //std::cout<<"customAttr : "<<customAttr<<std::endl; MString type = b_solv->getAttrType(b_solv->getdata(rbname), customAttr); //bSolverNode::m_custom_data *data = b_solv->getdata(rbname); std::cout<<" type : "<<type<<std::endl; if (type == "string") { //char * result = static_cast<char*>(b_solv->get_custom_data(customAttr)); MString result = b_solv->get_custom_data_string(b_solv->getdata(rbname), customAttr); if (result != NULL) { //std::cout<<"result : "<<result<<std::endl; MString value(result); setResult(value); } else { displayError(MString("Error getting b_solv->get_custom_data_string(\"" + customAttr + "\")")); } } else if (type == "double") { //double *value = static_cast<double*>(b_solv->get_custom_data(customAttr)); double value = b_solv->get_custom_data_double(b_solv->getdata(rbname), customAttr); setResult(value); } else if (type == "int") { //int *value = static_cast<int*>(b_solv->get_custom_data(customAttr)); int value = b_solv->get_custom_data_int(b_solv->getdata(rbname), customAttr); setResult(value); } else if (type == "vector") { //void * result = b_solv->get_custom_data(customAttr); //MVector *vec_res = (MVector*)result; MVector result = b_solv->get_custom_data_vector(b_solv->getdata(rbname), customAttr); MDoubleArray value; value.append(result.x); value.append(result.y); value.append(result.z); setResult(value); } } } else if ( isCreate ) { MString aArgument; argParser->getFlagArgument("-create", 0, aArgument); MStringArray createArgs = parseArguments(aArgument,";"); int size = createArgs.length(); MString inputShape; MString rbname = "dummyRb"; MVector av; MVector vel; MVector pos; MVector rot; for (int i=0; i!=size; ++i) { MStringArray singleArg = parseArguments(createArgs[i],"="); //std::cout<<"singleArg : "<<singleArg<<std::endl; if (singleArg[0] == "name") { rbname = singleArg[1]; } else if (singleArg[0] == "geo") { //geo inputShape = singleArg[1]; //std::cout<<"geo = "<<inputShape<<std::endl; } else if (singleArg[0] == "vel") { //initialvelocity MStringArray velArray = parseArguments(singleArg[1], ","); vel = MVector(velArray[0].asDouble(), velArray[1].asDouble(), velArray[2].asDouble() ); //std::cout<<"velocity = "<<vel<<std::endl; } else if (singleArg[0] == "pos") { //initialposition MStringArray posArray = parseArguments(singleArg[1], ","); pos = MVector(posArray[0].asDouble(), posArray[1].asDouble(), posArray[2].asDouble() ); //std::cout<<"position = "<<pos<<std::endl; } else if (singleArg[0] == "rot") { //initialrotation MStringArray rotArray = parseArguments(singleArg[1], ","); rot = MVector(rotArray[0].asDouble(), rotArray[1].asDouble(), rotArray[2].asDouble() ); //std::cout<<"rotation = "<<rot<<std::endl; } else if (singleArg[0] == "av") { //initialAngularVelocity MStringArray avArray = parseArguments(singleArg[1], ","); av = MVector(avArray[0].asDouble(), avArray[1].asDouble(), avArray[2].asDouble() ); //std::cout<<"initialAngularVelocity = "<<av<<std::endl; } else { std::cout<<"Unrecognized parameter : "<<singleArg[0]<<std::endl; } } // create boing node shared_ptr<bSolverNode> b_solv = bSolverNode::get_bsolver_node(); MObject node = nameToNode(inputShape); float mass = 1.0f; MString tname = "boing"; MStatus stat = b_solv->createNode(node, rbname, tname, pos, vel, rot, av, mass); if (MS::kSuccess == stat) { setResult(rbname); } else { MGlobal::displayError(MString("Something went wrong when trying to create rigidbody : " + rbname + " .")); } } else if ( isDelete ) { MString aArgument; argParser->getFlagArgument("-delete", 0, aArgument); //std::cout<<"delete aArgument "<<aArgument<<std::endl; if (aArgument != "") { shared_ptr<bSolverNode> b_solv = bSolverNode::get_bsolver_node(); b_solv->deletedata(aArgument); MStatus stat = b_solv->delete_key(aArgument, -1); if (stat != MS::kSuccess) { std::cerr<<"error occurred deleting "<<aArgument<<" ."<<std::endl; setResult(1); } } } else if ( isExists ) { MString exArg; argParser->getFlagArgument("-exists", 0, exArg); //std::cout<<"exArg : "<<exArg<<std::endl; if (exArg != "") { shared_ptr<bSolverNode> b_solv = bSolverNode::get_bsolver_node(); bSolverNode::m_custom_data *data = b_solv->getdata(exArg); int result = false; if ( NULL != data ) { //setResult ( data->name ); result = true; } setResult(result); } } return MS::kSuccess; }