void max_jit_3m_mproc(t_max_jit_3m *x, void *mop) { t_jit_err err; if (err=(t_jit_err) jit_object_method( max_jit_obex_jitob_get(x), _jit_sym_matrix_calc, jit_object_method(mop,_jit_sym_getinputlist), jit_object_method(mop,_jit_sym_getoutputlist))) { jit_error_code(x,err); } else { max_jit_3m_bang(x); } }
void max_jit_submatrix_mproc(t_max_jit_submatrix *x, void *mop) { t_jit_err err; if (err=(t_jit_err) jit_object_method( max_jit_obex_jitob_get(x), _jit_sym_matrix_calc, jit_object_method(mop,_jit_sym_getinputlist), jit_object_method(mop,_jit_sym_getoutputlist))) { jit_error_code(x,err); } else { max_jit_mop_outputmatrix(x); jit_object_method(max_jit_mop_getoutput(x,1),_jit_sym_data,NULL); } }
void max_jit_ys_pixelweightmat_mproc(t_max_jit_ys_pixelweightmat *x, void *mop) { t_jit_err err; void *o; o=max_jit_obex_jitob_get(x); if (err=(t_jit_err) jit_object_method( o, _jit_sym_matrix_calc, jit_object_method(mop,_jit_sym_getinputlist), jit_object_method(mop,_jit_sym_getoutputlist))) { jit_error_code(x,err); } else { // bang method max_jit_ys_pixelweightmat_bang(x); } }
void max_jit_tml_particleFlow_mproc(t_max_jit_tml_particleFlow *x, void *mop) { t_jit_err err; void *o; o=max_jit_obex_jitob_get(x); if (err=(t_jit_err) jit_object_method( o, _jit_sym_matrix_calc, jit_object_method(mop,_jit_sym_getinputlist), jit_object_method(mop,_jit_sym_getoutputlist))) { jit_error_code(x,err); } else { // bang method max_jit_tml_particleFlow_bang(x); } }
void max_ta_jit_kinect2_outputmatrix(t_max_ta_jit_kinect2 *x) { void *mop=max_jit_obex_adornment_get(x,_jit_sym_jit_mop); t_jit_err err; if (mop) { //always output if (err=(t_jit_err)jit_object_method(max_jit_obex_jitob_get(x), _jit_sym_matrix_calc, jit_object_method(mop,_jit_sym_getinputlist), jit_object_method(mop,_jit_sym_getoutputlist))) { jit_error_code(x,err); } else { max_jit_mop_outputmatrix(x); } } }
void PenizeMaxMProc( msobPenize* me, void* mop) { t_jit_err err = (t_jit_err) jit_object_method( max_jit_obex_jitob_get(me), _jit_sym_matrix_calc, jit_object_method(mop, _jit_sym_getinputlist), jit_object_method(mop, _jit_sym_getoutputlist) ); if (err == JIT_ERR_NONE) PenizeBang(me); else jit_error_code(me, err); }
void max_jit_op_mproc(t_max_jit_op *x, void *mop) { t_jit_err err; t_jit_matrix_info tmpinfo; void *o; long changed=0,i; if (x->last==OP_LAST_VAL) { tmpinfo = x->lastinfo; o = max_jit_mop_getinput(x,2); jit_object_method(o,_jit_sym_getinfo,&x->lastinfo); if (tmpinfo.type!=x->lastinfo.type) changed = TRUE; else if (tmpinfo.planecount!=x->lastinfo.planecount) changed = TRUE; /* Already handled by resampling else if (tmpinfo.dimcount!=x->lastinfo.dimcount) changed = TRUE; else { for (i=0;i<tmpinfo.dimcount;i++) { if (tmpinfo.dim[i]!=x->lastinfo.dim[i]) changed=TRUE; } } */ if (changed) jit_object_method(o,_jit_sym_setall,0L,x->valcount,x->val); } if (err=(t_jit_err) jit_object_method( max_jit_obex_jitob_get(x), _jit_sym_matrix_calc, jit_object_method(mop,_jit_sym_getinputlist), jit_object_method(mop,_jit_sym_getoutputlist))) { jit_error_code(x,err); } else { max_jit_mop_outputmatrix(x); } }
void max_jit_SDIF_buffer_outputmatrix(t_max_jit_SDIF_buffer *x){ t_atom a; long outputmode=max_jit_mop_getoutputmode(x); void *mop=max_jit_obex_adornment_get(x,_jit_sym_jit_mop); t_jit_err err; if (outputmode&&mop) { //always output unless output mode is none if (outputmode==1) { if (err=(t_jit_err)jit_object_method( max_jit_obex_jitob_get(x), _jit_sym_matrix_calc, jit_object_method(mop,_jit_sym_getinputlist), jit_object_method(mop,_jit_sym_getoutputlist), x->t_matrix)) { jit_error_code(x,err); } else { max_jit_mop_outputmatrix(x); } } } }
void max_jit_findbounds_mproc(t_max_jit_findbounds *x, void *mop) { t_jit_err err; long ac=0; t_atom *av=NULL; void *o; o=max_jit_obex_jitob_get(x); if (err=(t_jit_err) jit_object_method( o, _jit_sym_matrix_calc, jit_object_method(mop,_jit_sym_getinputlist), jit_object_method(mop,_jit_sym_getoutputlist))) { jit_error_code(x,err); } else { jit_object_method(o,ps_getboundmax,&ac,&av); switch(ac) { case 1: outlet_float(x->maxout,jit_atom_getfloat(av)); break; default: outlet_anything(x->maxout,_jit_sym_list,ac,av); break; } if (av) jit_freebytes(av,(ac)*sizeof(t_atom)); av=NULL; ac=0; jit_object_method(o,ps_getboundmin,&ac,&av); switch(ac) { case 1: outlet_float(x->minout,jit_atom_getfloat(av)); break; default: outlet_anything(x->minout,_jit_sym_list,ac,av); break; } if (av) jit_freebytes(av,(ac)*sizeof(t_atom)); } }
t_jit_err max_jit_str_op_jit_matrix(void *x, t_symbol *s, long argc, t_atom *argv) { void *matrix,*matrixout,*mop,*o,*p,*m; t_atom a; t_symbol *matrixname; long err=JIT_ERR_NONE,inlet,i; method ioproc,mproc; if (!(mop=max_jit_obex_adornment_get(x,_jit_sym_jit_mop))) return JIT_ERR_GENERIC; if (argc&&argv) { //find matrix matrixname = jit_atom_getsym(argv); matrix = jit_object_findregistered(matrixname); if (matrix&&jit_object_method(matrix, _jit_sym_class_jit_matrix)) { if (inlet=max_jit_obex_inletnumber_get(x)) { //right inputs if ((p=jit_object_method(mop,_jit_sym_getinput,inlet+1)) && (m=jit_object_method(p,_jit_sym_getmatrix))) { if (ioproc=(method)jit_object_method(p,_jit_sym_getioproc)) (*ioproc)(mop,p,matrix); else jit_object_method(m,_jit_sym_frommatrix,matrix,NULL); } else { err=JIT_ERR_GENERIC; } } else { //calculate switch (jit_attr_getlong(mop,_jit_sym_outputmode)) { case 0: //nada break; case 2: //input(no calc) //pass input through leftmost output if ((p=jit_object_method(mop,_jit_sym_getoutput,1)) && (o=max_jit_mop_io_getoutlet(p))) { outlet_anything(o,_jit_sym_jit_matrix,1,argv); } break; case 3: //output(no calc) max_jit_mop_outputmatrix(x); break; default: //calc //if adapt, resize // if (jit_attr_getlong(mop,_jit_sym_adapt)) // max_jit_mop_adapt_matrix_all(x,matrix); if ((p=jit_object_method(mop,_jit_sym_getoutput,1))&& (ioproc=(method)jit_object_method(p,_jit_sym_getioproc))) { (*ioproc)(mop,p,matrix); } p = jit_object_method(mop,_jit_sym_getinput,1); jit_object_method(p,_jit_sym_matrix,matrix); jit_attr_setsym(p,_jit_sym_matrixname,matrixname); // if (mproc=(method)max_jit_mop_getmproc(mop)) { max_jit_str_op_mproc(x,mop); /* } else { if (err=(t_jit_err) jit_object_method( max_jit_obex_jitob_get(x), _jit_sym_matrix_calc, jit_object_method(mop,_jit_sym_getinputlist), jit_object_method(mop,_jit_sym_getoutputlist))) { jit_error_code(x,err); } else { max_jit_mop_outputmatrix(x); } }*/ break; } } } else { jit_error_code(x,JIT_ERR_MATRIX_UNKNOWN); } } return err; }
void max_jit_openni_outputmatrix(t_max_jit_openni *x) { long outputmode = max_jit_mop_getoutputmode(x); void *mop = max_jit_obex_adornment_get(x,_jit_sym_jit_mop); t_jit_openni *pJit_OpenNI = (t_jit_openni *)max_jit_obex_jitob_get(x); t_jit_err err; t_atom osc_argv[16]; // max number of atoms/values after the message selector char osc_string[MAX_LENGTH_STR_JOINT_NAME + 10]; // max joint string + 9 for "/skel/xx/" + terminating null char *msg_selector_string; int i, j, k; const char strSkelFormatOutput[3][12] = { "/skel/%u/%s", "skel", "/joint" }; // switchable skeleton output format selectors // the [2] format string below should be an unsigned %u, however OSCeleton codebase incorrectly uses %d so I also use it here for compatibility const char strUserCoMFormatOutput[3][9] = { "/user/%u", "user", "/user/%d" }; // switchable user CoM output format selectors const char strFloorFormatOutput[3][7] = { "/floor", "floor", "/floor" }; // switchable floor output format selectors LOG_DEBUG("starting custom outputmatrix()"); if (outputmode && mop) { //always output unless output mode is none if (outputmode==2) // pass input case, but since jit.openni has no input then this means no output { LOG_DEBUG("bypassing matrix_calc(), bypassing outputmatrix()"); return; } if (outputmode==1) { LOG_DEBUG("about to call matrix_calc from custom outputmatrix"); if (err = (t_jit_err)jit_object_method(max_jit_obex_jitob_get(x), _jit_sym_matrix_calc, jit_object_method(mop,_jit_sym_getinputlist), jit_object_method(mop,_jit_sym_getoutputlist))) { if (err != JIT_ERR_HW_UNAVAILABLE) jit_error_code(x,err); return; } } // output floor from scene generator if (pJit_OpenNI->hProductionNode[SCENE_GEN_INDEX] && pJit_OpenNI->bOutputSceneFloor) { msg_selector_string = (char *)strFloorFormatOutput[x->chrSkeletonOutputFormat]; atom_setfloat(&(osc_argv[0]), pJit_OpenNI->planeFloor.ptPoint.X); atom_setfloat(&(osc_argv[1]), pJit_OpenNI->planeFloor.ptPoint.Y); atom_setfloat(&(osc_argv[2]), pJit_OpenNI->planeFloor.ptPoint.Z); atom_setfloat(&(osc_argv[3]), pJit_OpenNI->planeFloor.vNormal.X); atom_setfloat(&(osc_argv[4]), pJit_OpenNI->planeFloor.vNormal.Y); atom_setfloat(&(osc_argv[5]), pJit_OpenNI->planeFloor.vNormal.Z); outlet_anything(x->osc_outlet, gensym(msg_selector_string), 6, osc_argv); } // output seen users' centers of mass and skeletons for (i=0; i<pJit_OpenNI->iNumUsersSeen; i++) { short iNumAtoms = 0; // output user center of mass switch (x->chrSkeletonOutputFormat) { case 0: // default jit.openni skeleton OSC output format case 2: // legacy OSCeleton format snprintf_zero(osc_string, sizeof(osc_string), strUserCoMFormatOutput[x->chrSkeletonOutputFormat], pJit_OpenNI->pUserSkeletonJoints[i].userID); msg_selector_string = osc_string; break; case 1: // native max route compatible format msg_selector_string = (char *)strUserCoMFormatOutput[1]; atom_setlong(osc_argv + (iNumAtoms++), pJit_OpenNI->pUserSkeletonJoints[i].userID); break; } atom_setfloat(osc_argv + (iNumAtoms++), pJit_OpenNI->pUserSkeletonJoints[i].userCoM.X); atom_setfloat(osc_argv + (iNumAtoms++), pJit_OpenNI->pUserSkeletonJoints[i].userCoM.Y); atom_setfloat(osc_argv + (iNumAtoms++), pJit_OpenNI->pUserSkeletonJoints[i].userCoM.Z); outlet_anything(x->osc_outlet, gensym(msg_selector_string), iNumAtoms, osc_argv); // output skeletons if (pJit_OpenNI->pUserSkeletonJoints[i].bUserSkeletonTracked) { for (j=1; j<= NUM_OF_SKELETON_JOINT_TYPES; j++) { if (pJit_OpenNI->pUserSkeletonJoints[i].jointTransform[j].position.fConfidence >= pJit_OpenNI->fPositionConfidenceFilter && ( pJit_OpenNI->bOutputSkeletonOrientation ? (pJit_OpenNI->pUserSkeletonJoints[i].jointTransform[j].orientation.fConfidence >= pJit_OpenNI->fOrientConfidenceFilter) : true)) { iNumAtoms = 0; switch (x->chrSkeletonOutputFormat) { case 0: // default jit.openni skeleton output format "/skel/%u/%s" snprintf_zero(osc_string, sizeof(osc_string), strSkelFormatOutput[0], pJit_OpenNI->pUserSkeletonJoints[i].userID, strJointNames[j]); msg_selector_string = osc_string; break; case 1: // skeleton output "skel %u %s" to easily use with standard max route object msg_selector_string = (char *)strSkelFormatOutput[1]; atom_setlong(osc_argv + (iNumAtoms++), pJit_OpenNI->pUserSkeletonJoints[i].userID); atom_setsym(osc_argv + (iNumAtoms++), gensym(strJointNames[j])); break; case 2: // skeleton output "/joint %s %u" same format as OSCeleton's default output with no orientation and no OSCeleton's legacy "normalized" values msg_selector_string = (char *)strSkelFormatOutput[2]; atom_setsym(osc_argv + (iNumAtoms++), gensym(strJointNames[j])); atom_setlong(osc_argv + (iNumAtoms++), pJit_OpenNI->pUserSkeletonJoints[i].userID); break; } atom_setfloat(osc_argv + (iNumAtoms++), pJit_OpenNI->pUserSkeletonJoints[i].jointTransform[j].position.position.X); atom_setfloat(osc_argv + (iNumAtoms++), pJit_OpenNI->pUserSkeletonJoints[i].jointTransform[j].position.position.Y); atom_setfloat(osc_argv + (iNumAtoms++), pJit_OpenNI->pUserSkeletonJoints[i].jointTransform[j].position.position.Z); if (x->chrSkeletonOutputFormat != 2) { atom_setfloat(osc_argv + (iNumAtoms++), pJit_OpenNI->pUserSkeletonJoints[i].jointTransform[j].position.fConfidence); } if (pJit_OpenNI->bOutputSkeletonOrientation && (x->chrSkeletonOutputFormat != 2)) { // General belief and https://groups.google.com/forum/#!topic/openni-dev/-ib1yX-o0lk say that OpenNI stores the // orientation matrix in row-major order. // X axis = (elements[0], elements[3], elements[6]) // Y axis = (elements[1], elements[4], elements[7]) // Z axis = (elements[2], elements[5], elements[8]) // Just in case, column major order is easy to substitute with: for (k=0; k<9; k++) atom_setfloat(osc_argv + iAtomOffset + 4 + k, pJit_OpenNI->pUserSkeletonJoints[i].jointTransform[j].orientation.orientation.elements[k]); for (k=0; k<3; k++) { atom_setfloat(osc_argv + (iNumAtoms++), pJit_OpenNI->pUserSkeletonJoints[i].jointTransform[j].orientation.orientation.elements[k]); atom_setfloat(osc_argv + (iNumAtoms++), pJit_OpenNI->pUserSkeletonJoints[i].jointTransform[j].orientation.orientation.elements[k+3]); atom_setfloat(osc_argv + (iNumAtoms++), pJit_OpenNI->pUserSkeletonJoints[i].jointTransform[j].orientation.orientation.elements[k+6]); } if (x->chrSkeletonOutputFormat != 2) { atom_setfloat(osc_argv + (iNumAtoms++), pJit_OpenNI->pUserSkeletonJoints[i].jointTransform[j].orientation.fConfidence); } } outlet_anything(x->osc_outlet, gensym(msg_selector_string), iNumAtoms, osc_argv); } } } } LOG_DEBUG("now calling outputmatrix()"); max_jit_mop_outputmatrix(x); LOG_DEBUG("called outputmatrix()"); } }
void max_jit_human_mproc(t_max_jit_human *x, void *mop) { t_jit_err err; long ac=0; t_atom *av=NULL; void *o; // t_atom temp[4]; // av = temp; o=max_jit_obex_jitob_get(x); if (err=(t_jit_err) jit_object_method( o, _jit_sym_matrix_calc, jit_object_method(mop,_jit_sym_getinputlist), jit_object_method(mop,_jit_sym_getoutputlist))) { jit_error_code(x,err); } else { // ac = 2; jit_object_method(o,ps_getstate,&ac,&av); outlet_int(x->out_state,jit_atom_getlong(av)); if (av) jit_freebytes(av,(ac)*sizeof(t_atom)); av=NULL; ac=0; jit_object_method(o,ps_getfoot_right,&ac,&av); outlet_anything(x->out_foot_right,_jit_sym_list,ac,av); if (av) jit_freebytes(av,(ac)*sizeof(t_atom)); av=NULL; ac=0; jit_object_method(o,ps_getfoot_left,&ac,&av); outlet_anything(x->out_foot_left,_jit_sym_list,ac,av); if (av) jit_freebytes(av,(ac)*sizeof(t_atom)); av=NULL; ac=0; // ac = 2; jit_object_method(o,ps_gethead,&ac,&av); outlet_anything(x->out_head,_jit_sym_list,ac,av); if (av) jit_freebytes(av,(ac)*sizeof(t_atom)); av=NULL; ac=0; // ac = 2; jit_object_method(o,ps_getarm_right,&ac,&av); outlet_anything(x->out_arm_right,_jit_sym_list,ac,av); if (av) jit_freebytes(av,(ac)*sizeof(t_atom)); av=NULL; ac=0; // ac = 2; jit_object_method(o,ps_getarm_left,&ac,&av); outlet_anything(x->out_arm_left,_jit_sym_list,ac,av); if (av) jit_freebytes(av,(ac)*sizeof(t_atom)); av=NULL; ac=0; // ac = 4; jit_object_method(o,ps_getbox_coords,&ac,&av); outlet_anything(x->out_box_coords,_jit_sym_list,ac,av); if (av) jit_freebytes(av,(ac)*sizeof(t_atom)); av=NULL; ac=0; // switch(ac) { // case 1: // outlet_float(x->maxout,jit_atom_getfloat(av)); // break; // default: // outlet_anything(x->maxout,_jit_sym_list,ac,av); // break; // } // if (av) jit_freebytes(av,(ac)*sizeof(t_atom)); // av=NULL; ac=0; } }