Beispiel #1
0
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);
		}
	}
}