diff -a -a -urN hmodel sample 3.0.4/common sources/common.c hmodel sample 3.0.5/common sources/common.c --- hmodel sample 3.0.4/common sources/common.c Sun May 28 00:43:15 2000 +++ hmodel sample 3.0.5/common sources/common.c Tue Jul 11 00:18:23 2000 @@ -670,25 +670,27 @@ int num, FILE *fp) { - short n; + short len,n; - fgets( str, num, fp); - n = strlen(str); + if( fgets( str, num, fp) == NULL ) + return 0; + len = strlen(str); - if( n != 0 ){ + if( len != 0 ){ // LFがない(Macの改行コード) if( strchr( str, '\n') == NULL ){ - for( n=0; str[n]!='\r' && nnvertex;i++){ @@ -410,6 +416,13 @@ return n; } + + +/* ============================================================ */ +#pragma mark - + +Boolean otherDrawHumanPartsProc( short pn){return false;} +void drawObjReratedVertex( short modelNo, short vertexNo, GLfloat x, GLfloat y, GLfloat z){} diff -a -a -urN hmodel sample 3.0.4/modelcompare.proto.h hmodel sample 3.0.5/modelcompare.proto.h --- hmodel sample 3.0.4/modelcompare.proto.h Wed Sep 29 01:01:12 1999 +++ hmodel sample 3.0.5/modelcompare.proto.h Tue Jul 11 00:18:38 2000 @@ -9,3 +9,5 @@ short searchTheTriangleHasTheLineAndGetTheLastVtx(col_trig_type **hCol_trig, short cnt, short vtx_a, short vtx_b); short getModelDiffsUnused2(model_obj_type *pModel1, model_obj_type *pModel2, short *attachNo, short *attach2to1, Boolean *fChanged); void getModelDiffsUnused3(model_obj_type *pModel1, model_obj_type *pModel2, short *attachNo, short *attach2to1, Boolean *fChanged); +Boolean otherDrawHumanPartsProc(short pn); +void drawObjReratedVertex(short modelNo, short vertexNo, GLfloat x, GLfloat y, GLfloat z); diff -a -a -urN hmodel sample 3.0.4/motionmaker.c hmodel sample 3.0.5/motionmaker.c --- hmodel sample 3.0.4/motionmaker.c Mon May 29 18:48:55 2000 +++ hmodel sample 3.0.5/motionmaker.c Tue Jul 11 00:18:38 2000 @@ -606,16 +606,16 @@ preFNo = (frameNo-1>=0) ? frameNo-1 : kMaxSPRA-1; for(d1=0,d2=0,j=0;j<3;j++){ n = partsList[i][j]; - v1 = (gMotStrm[preFNo].PRI[n].VR - kBP[n].PRI.VR); if( v1 > 180 ) v1 = 360-v1; - h1 = (gMotStrm[preFNo].PRI[n].HR - kBP[n].PRI.HR); if( h1 > 180 ) h1 = 360-h1; - p1 = (gMotStrm[preFNo].PRI[n].PR - kBP[n].PRI.PR); if( p1 > 180 ) p1 = 360-p1; - v2 = (gMotStrm[preFNo].PRI[n].VR - gMotStrm[frameNo].PRI[n].VR); if( v2 > 180 ) v2 = 360-v2; - h2 = (gMotStrm[preFNo].PRI[n].HR - gMotStrm[frameNo].PRI[n].HR); if( h2 > 180 ) h2 = 360-h2; - p2 = (gMotStrm[preFNo].PRI[n].PR - gMotStrm[frameNo].PRI[n].PR); if( p2 > 180 ) p2 = 360-p2; + v1 = (gMotStrm[preFNo].PRI[n].VR - kBP[n].PRI.VR); if( fabsf(v1) > 180 ) v1 = 360-v1; + h1 = (gMotStrm[preFNo].PRI[n].HR - kBP[n].PRI.HR); if( fabsf(h1) > 180 ) h1 = 360-h1; + p1 = (gMotStrm[preFNo].PRI[n].PR - kBP[n].PRI.PR); if( fabsf(p1) > 180 ) p1 = 360-p1; + v2 = (gMotStrm[preFNo].PRI[n].VR - gMotStrm[frameNo].PRI[n].VR); if( fabsf(v2) > 180 ) v2 = 360-v2; + h2 = (gMotStrm[preFNo].PRI[n].HR - gMotStrm[frameNo].PRI[n].HR); if( fabsf(h2) > 180 ) h2 = 360-h2; + p2 = (gMotStrm[preFNo].PRI[n].PR - gMotStrm[frameNo].PRI[n].PR); if( fabsf(p2) > 180 ) p2 = 360-p2; d1 += v1+h1+p1; d2 += v2+h2+p2; } - if( d1 < d2 ) // 関節角度が前のフレームのものに近い場合、 + if( frameNo!=gFrameNo || fabs(d1)r = getShtFromStr( str, &n); // 明るい色の方を出力 fgets4OtherPF( str, 256, fp); pRokPal->g = getShtFromStr( str, &n); @@ -428,6 +430,36 @@ } +// 六角大王のデフォルトパレットを設定する +short setRokDefalutPaletts( + rokpal *pRokPal) +{ + short pal[13][3] = { + {232,232,232}, + {152,255,255}, + {143,143,255}, + {255,174,175}, + {141,255,140}, + {253,250, 90}, + {255,232,217}, + {196, 93, 53}, + {255,255,255}, + { 0, 0, 0}, + {230,186,150}, + {255, 17, 17}, + {246,246,246}}; + short i; + + for(i=0;i<13;pRokPal++,i++){ + pRokPal->r = pal[i][0]; + pRokPal->g = pal[i][1]; + pRokPal->b = pal[i][2]; + } + + return 13; +} + + // 六角大王の法線をセットする Boolean setRokNormals( rokvtx *pRokVtxes, @@ -436,7 +468,10 @@ { static Boolean fInited = false; static short *pfNmlSet; - short vtx,face; + short face; + float mx1,mx2,mx3,ratio1,ratio2; + float tx1,tx2,tx3,tr1,tr2; + short cd; short v0,v1,v2; short u0,u1,u2; short xs,ys,zs; @@ -451,7 +486,7 @@ } // 一番左にある頂点を含む三角形を探す - for(face=vtx=-1,i=0;iv[0]; v1 = (pRokFaces+i)->v[1]; v2 = (pRokFaces+i)->v[2]; - if( vtx == -1 ) - vtx = v0; - - if( (pRokVtxes+v0)->x >= (pRokVtxes+vtx)->x ){ vtx = v0; face = i;} - if( (pRokVtxes+v1)->x >= (pRokVtxes+vtx)->x ){ vtx = v1; face = i;} - if( (pRokVtxes+v2)->x >= (pRokVtxes+vtx)->x ){ vtx = v2; face = i;} + if( (pRokVtxes+v0)->x < (pRokVtxes+v1)->x ) swap( &v0, &v1); + if( (pRokVtxes+v1)->x < (pRokVtxes+v2)->x ) swap( &v1, &v2); + if( (pRokVtxes+v0)->x < (pRokVtxes+v1)->x ) swap( &v0, &v1); + + tx1 = (pRokVtxes+v0)->x; + tx2 = (pRokVtxes+v1)->x; + tx3 = (pRokVtxes+v2)->x; + tr1 = fabsf( ((pRokVtxes+v2)->z-(pRokVtxes+v1)->z) / ((pRokVtxes+v2)->x-(pRokVtxes+v1)->x) ); + tr2 = fabsf( ((pRokVtxes+v2)->y-(pRokVtxes+v0)->y) / ((pRokVtxes+v2)->x-(pRokVtxes+v0)->x) ); + cd = (tx3>mx3) + (tr1>ratio1) + (tr2>ratio2); + + if( tx1>mx1 || // より頂点が左側にあるか、 + (tx1==mx1 && tx2>mx2) || // 他の頂点もより左にあるか、 + (tx1==mx1 && tx2==mx2 && cd>=2)){ // よりX軸に対して垂直なら + mx1 = tx1; + mx2 = tx2; + mx3 = tx3; + ratio1 = tr1; + ratio2 = tr2; + face = i; + } } if( face == -1 ){ // 見つからなければ終了 free( pfNmlSet ); @@ -471,7 +521,7 @@ return false; } - // 一番左にある頂点は法線のx軸が必ず正の値を + // 前述の条件の頂点は法線のx軸が必ず正の値を // 取ることを利用して、法線の方向を決定する getNormalsSign( pRokFaces+face, pRokVtxes, &xs, &ys, &zs); if( xs < 0 ) @@ -680,3 +730,8 @@ return true; } +/* ============================================================ */ +#pragma mark - + +Boolean otherDrawHumanPartsProc( short pn){return false;} +void drawObjReratedVertex( short modelNo, short vertexNo, GLfloat x, GLfloat y, GLfloat z){} diff -a -a -urN hmodel sample 3.0.4/rok2opengl.proto.h hmodel sample 3.0.5/rok2opengl.proto.h --- hmodel sample 3.0.4/rok2opengl.proto.h Tue May 16 01:01:25 2000 +++ hmodel sample 3.0.5/rok2opengl.proto.h Tue Jul 11 00:18:38 2000 @@ -6,7 +6,10 @@ short loadRokFace(FILE *fp, char *str, rokface *pRokFace, rokline *pRokLine, rokvtx *pRokVtx, short lineList[kMaxLoaded]); void alignTriangle(rokface *rface, short line1, short line2, rokline *pRokLine); short loadRokPalettes(FILE *fp, char *str, rokpal *pRokPal); +short setRokDefalutPaletts(rokpal *pRokPal); Boolean setRokNormals(rokvtx *pRokVtxes, rokface *pRokFaces, short faceNum); void getNormalsSign(rokface *pFace, rokvtx *pVtx, short *nsx, short *nsy, short *nsz); void convertOpenGLSavvyData(model_obj_type *pModel, short groupID, rokvtx *pRokVtxes, rokface *pRokFaces, rokpal *pRokPals, short fullVtxsNum, short fullFaceNum, short vnOnGroup, short fnOnGroup); Boolean saveOpenGLSavvyData(char *path, char *filename, model_obj_type *pModel, rokvtx *pRokVtxes, short vnOnGroup); +Boolean otherDrawHumanPartsProc(short pn); +void drawObjReratedVertex(short modelNo, short vertexNo, GLfloat x, GLfloat y, GLfloat z);