void CPreviewDlg::bone_ysdnm_node(ysdnm_t *dnm, struct ysdnm_srf *srf, ysdnmv_t *v0, const Mat4d &pmat){ int i; ysdnmv_t *v; /* for(v = v0; v; v = v->next){ const char **skipnames = v->skipnames; int skips = v->skips; for(i = 0; i < skips; i++) if(!strcmp(skipnames[i], srf->name)){ return; } }*/ Mat4d mat = pmat; for(v = v0; v; v = v->next){ ysdnm_bone_var *bonerot = v->bonevar; int bones = v->bones; for(i = 0; i < bones; i++) if(!strcmp(bonerot[i].name, srf->name)){ Mat4d rotmat = bonerot[i].rot.tomat4(); /* MAT4TRANSLATE(srf->pos[0], srf->pos[1], srf->pos[2]);*/ Mat4d amat = mat; amat.translatein(srf->pos); amat.translatein(bonerot[i].pos); Mat4d rmat = amat * rotmat; rmat.translate(-srf->pos); mat = rmat; } #if 0 if(v->fcla & (1 << srf->cla) && 2 <= srf->nst){ double f = v->cla[srf->cla]; avec3_t pos; gldTranslate3dv(srf->pos); for(i = 0; i < 3; i++) pos[i] = srf->sta[1][i] * f + srf->sta[0][i] * (1. - f); gldTranslate3dv(pos); glRotated(srf->sta[1][3] * f + srf->sta[0][3] * (1. - f), 0, -1, 0); /* heading */ glRotated(srf->sta[1][4] * f + srf->sta[0][4] * (1. - f), -1, 0, 0); /* pitch */ glRotated(srf->sta[1][5] * f + srf->sta[0][5] * (1. - f), 0, 0, 1); /* bank */ gldTranslaten3dv(srf->pos); } #endif } VECNULL(&mat[12]); mat4translate3dv(mat, srf->pos); for(i = 0; i < dnm->ns; i++) if(dnm->s[main.selectbone] == srf) break; if(i != dnm->ns) glColor4ub(255,255,255,255); else glColor4ub(0,255,0,255); glBegin(GL_LINES); glVertex3dv(pmat.vec3(3)); glVertex3dv(mat.vec3(3)); glEnd(); // callback(srf->name, hint); // mat4translaten3dv(mat, srf->pos); for(i = 0; i < srf->nch; i++){ if(srf->cld[i].srf){ bone_ysdnm_node(dnm, srf->cld[i].srf, v0, mat); } } }