hschumann2/TempleOS-Source-Code
0847
1 2//Makes a mesh man.3 4#define VERTICES_NUM 10245#define TRIS_NUM 10246 7class Man8{9 I32 vertex_cnt;10 I32 tri_cnt;11 CD3I32 v[VERTICES_NUM];12 CMeshTri t[TRIS_NUM];13} *m;14 15class ManDefineStruct16{17 F64 head_rad format18 "$DA-TRM,A=\"Head Radius :%8.3f\"$\n";19 20 F64 torso_len format21 "$DA-TRM,A=\"Torso Length :%8.3f\"$\n";22 F64 arm_len format23 "$DA-TRM,A=\"Arm Length :%8.3f\"$\n";24 F64 hand_len format25 "$DA-TRM,A=\"Hand Length :%8.3f\"$\n";26 F64 leg_len format27 "$DA-TRM,A=\"Leg Length :%8.3f\"$\n";28 F64 foot_len format29 "$DA-TRM,A=\"Foot Length :%8.3f\"$\n";30 F64 torso_width format31 "$DA-TRM,A=\"Torso Width :%8.3f\"$\n";32 F64 torso_depth format33 "$DA-TRM,A=\"Torso Depth :%8.3f\"$\n";34 F64 arm_rad format35 "$DA-TRM,A=\"Arm Radius :%8.3f\"$\n";36 F64 hand_rad format37 "$DA-TRM,A=\"Hand Radius :%8.3f\"$\n";38 F64 leg_rad format39 "$DA-TRM,A=\"Leg Radius :%8.3f\"$\n";40 F64 foot_rad format41 "$DA-TRM,A=\"Foot Radius :%8.3f\"$\n\n";42 43 F64 r_shoulder_a1 format44 "$DA-TRM,A=\"R.Shoulder Front/Back Angle:%8.3f\"$\n";45 F64 l_shoulder_a1 format46 "$DA-TRM,A=\"L.Shoulder Front/Back Angle:%8.3f\"$\n";47 F64 r_hip_a1 format48 "$DA-TRM,A=\"R.Hip Front/Back Angle :%8.3f\"$\n";49 F64 l_hip_a1 format50 "$DA-TRM,A=\"L.Hip Front/Back Angle :%8.3f\"$\n";51 52 F64 r_shoulder_a2 format53 "$DA-TRM,A=\"R.Shoulder Side Angle :%8.3f\"$\n";54 F64 l_shoulder_a2 format55 "$DA-TRM,A=\"L.Shoulder Side Angle :%8.3f\"$\n";56 F64 r_hip_a2 format57 "$DA-TRM,A=\"R.Hip Side Angle :%8.3f\"$\n";58 F64 l_hip_a2 format59 "$DA-TRM,A=\"L.Hip Side Angle :%8.3f\"$\n";60 61 F64 r_elbow_a format62 "$DA-TRM,A=\"R.Elbow Angle :%8.3f\"$\n";63 F64 l_elbow_a format64 "$DA-TRM,A=\"L.Elbow Angle :%8.3f\"$\n";65 F64 r_knee_a format66 "$DA-TRM,A=\"R.Knee Angle :%8.3f\"$\n";67 F64 l_knee_a format68 "$DA-TRM,A=\"L.Knee Angle :%8.3f\"$\n";69 70 F64 r_wrist_a format71 "$DA-TRM,A=\"R.Wrist Angle :%8.3f\"$\n";72 F64 l_wrist_a format73 "$DA-TRM,A=\"L.Wrist Angle :%8.3f\"$\n";74 F64 r_ankle_a format75 "$DA-TRM,A=\"R.Ankle Angle :%8.3f\"$\n";76 F64 l_ankle_a format77 "$DA-TRM,A=\"L.Ankle Angle :%8.3f\"$\n";78 79};80 81U0 MDInit(ManDefineStruct *md)82{83 MemSet(md,0,sizeof(ManDefineStruct));84 85 md->head_rad =5.0;86 87 md->torso_len =35.0;88 md->arm_len =30.0;89 md->hand_len =8.0;90 md->leg_len =32.0;91 md->foot_len =16.0;92 md->torso_width=20.0;93 md->torso_depth=10.0;94 md->arm_rad =3.5;95 md->hand_rad =2.0;96 md->leg_rad =4.0;97 md->foot_rad =3.0;98 99 md->r_shoulder_a1 =30;100 md->l_shoulder_a1 =-30;101 md->r_hip_a1 =-45;102 md->l_hip_a1 =45;103 104 md->r_shoulder_a2 =10;105 md->l_shoulder_a2 =10;106 md->r_hip_a2 =-5;107 md->l_hip_a2 =-5;108 109 md->r_elbow_a =30;110 md->l_elbow_a =0;111 md->r_knee_a =0;112 md->l_knee_a =30;113 114 md->r_wrist_a =0;115 md->l_wrist_a =0;116 md->r_ankle_a =0;117 md->l_ankle_a =0;118}119 120U0 MDCorrect(ManDefineStruct *md)121{122 md->r_ankle_a =-md->r_ankle_a;123 md->l_ankle_a =-md->l_ankle_a;124 md->r_knee_a =-md->r_knee_a;125 md->l_knee_a =-md->l_knee_a;126 md->r_hip_a2 =-md->r_hip_a2;127 md->r_shoulder_a2=-md->r_shoulder_a2;128 md->r_ankle_a+=90;129 md->l_ankle_a+=90;130 131 md->foot_len-=md->leg_rad;132 133 md->r_elbow_a+=md->r_shoulder_a1;134 md->l_elbow_a+=md->l_shoulder_a1;135 md->r_knee_a+=md->r_hip_a1;136 md->l_knee_a+=md->l_hip_a1;137 138 md->r_wrist_a+=md->r_elbow_a;139 md->l_wrist_a+=md->l_elbow_a;140 md->r_ankle_a+=md->r_knee_a;141 md->l_ankle_a+=md->l_knee_a;142}143 144I64 AddVertex(ManDefineStruct *md,I64 x,I64 y,I64 z)145{146 I64 res=m->vertex_cnt++;147 m->v[res].x=-x;148 m->v[res].y=-y-md->leg_len-md->foot_rad*2;149 m->v[res].z=-z;150 return res;151}152 153I64 AddTri(ManDefineStruct *,I64 c,I64 n0,I64 n1,I64 n2)154{155 I64 res=m->tri_cnt++;156 m->t[res].color=c;157 m->t[res].nums[0]=n1;158 m->t[res].nums[1]=n0;159 m->t[res].nums[2]=n2;160 return res;161}162 163U0 AddBox(ManDefineStruct *md,I64 c,I64 x1,I64 y1,I64 z1,164 F64 w,F64 h,F64 d,F64 h2,F64 h3,F64 az,F64 ay,F64 ax,165 I64 *ox,I64 *oy,I64 *oz)166{167 I64 *r;168 I64 p1a,p2a,p3a,p4a;169 I64 p1b,p2b,p3b,p4b;170 I64 wx=w/2,wy=0,wz=0,hx=0,hy=h,hz=0,h2x=0,h2y=h2,h2z=0,171 h3x=0,h3y=h3,h3z=0,dx=0,dy=0,dz=d/2;172 173 r=Mat4x4IdentNew;174 Mat4x4RotZ(r,az*pi/180.0);175 Mat4x4RotY(r,ay*pi/180.0);176 Mat4x4RotX(r,ax*pi/180.0);177 Mat4x4MulXYZ(r,&wx,&wy,&wz);178 Mat4x4MulXYZ(r,&hx,&hy,&hz);179 Mat4x4MulXYZ(r,&h2x,&h2y,&h2z);180 Mat4x4MulXYZ(r,&h3x,&h3y,&h3z);181 Mat4x4MulXYZ(r,&dx,&dy,&dz);182 183 p1a=AddVertex(md,x1+dx -wx+h2x,y1+dy -wy+h2y,z1+dz -wz+h2z);184 p2a=AddVertex(md,x1+dx +wx+h2x,y1+dy +wy+h2y,z1+dz +wz+h2z);185 p3a=AddVertex(md,x1+dx+hx-wx ,y1+dy+hy-wy ,z1+dz+hz-wz);186 p4a=AddVertex(md,x1+dx+hx+wx ,y1+dy+hy+wy ,z1+dz+hz+wz);187 AddTri(md,c,p1a,p2a,p3a);188 AddTri(md,c,p4a,p3a,p2a);189 190 p1b=AddVertex(md,x1-dx -wx+h2x,y1-dy -wy+h2y,z1-dz -wz+h2z);191 p2b=AddVertex(md,x1-dx +wx+h2x,y1-dy +wy+h2y,z1-dz +wz+h2z);192 p3b=AddVertex(md,x1-dx+hx-wx ,y1-dy+hy-wy ,z1-dz+hz-wz);193 p4b=AddVertex(md,x1-dx+hx+wx ,y1-dy+hy+wy ,z1-dz+hz+wz);194 AddTri(md,c,p1b,p2b,p3b);195 AddTri(md,c,p4b,p3b,p2b);196 197 AddTri(md,c,p1a,p2a,p1b);198 AddTri(md,c,p2b,p1b,p2a);199 AddTri(md,c,p3a,p4a,p3b);200 AddTri(md,c,p4b,p3b,p4a);201 AddTri(md,c,p1a,p3a,p1b);202 AddTri(md,c,p3b,p1b,p3a);203 AddTri(md,c,p2a,p4a,p2b);204 AddTri(md,c,p4b,p2b,p4a);205 206 *ox=x1+hx-h3x;207 *oy=y1+hy-h3y;208 *oz=z1+hz-h3z;209 210 Free(r);211}212 213U8 *Man2CSprite()214{215//See ::/Adam/Gr/GrSpritePlot.HC for how CSprite are stored.216 U8 *res=MAlloc(sizeof(CSpriteMeshU8s)+217 m->vertex_cnt*sizeof(CD3I32)+m->tri_cnt*sizeof(CMeshTri)+218 sprite_elem_base_sizes[SPT_END]),219 *dst=res;220 *dst++ =SPT_MESH;221 *dst(I32 *)++ =m->vertex_cnt;222 *dst(I32 *)++ =m->tri_cnt;223 MemCpy(dst,&m->v,m->vertex_cnt*sizeof(CD3I32));224 dst+=m->vertex_cnt*sizeof(CD3I32);225 MemCpy(dst,&m->t,m->tri_cnt*sizeof(CMeshTri));226 dst+=m->tri_cnt*sizeof(CMeshTri);227 *dst++ =SPT_END;228 return res;229}230 231public U8 *ManGen()232{233 U8 *res;234 I64 x,y,z,c1,c2,c3,c4;235 ManDefineStruct md1,md2;236 MDInit(&md1);237 238 while (TRUE) {239 if (!DocForm(&md1))240 return NULL;241 MemCpy(&md2,&md1,sizeof(ManDefineStruct));242 MDCorrect(&md2);243 244 c1=PopUpColorLighting("$BK,1$Shirt$BK,0$\n");245 if (c1<0) return NULL;246 c2=PopUpColorLighting("$BK,1$Pants$BK,0$\n");247 if (c2<0) return NULL;248 c3=PopUpColorLighting("$BK,1$Skin$BK,0$\n");249 if (c3<0) return NULL;250 c4=PopUpColorLighting("$BK,1$Shoes$BK,0$\n");251 if (c4<0) return NULL;252 253 m=CAlloc(sizeof(Man));254 255 //Head256 AddBox(&md2,c3,0,md2.torso_len+md2.head_rad*2,0,257 md2.head_rad*2,-md2.head_rad*2,md2.head_rad*2,0,0, 0,0,0,258 &x,&y,&z);259 260 //Torso261 AddBox(&md2,c1,0,md2.torso_len,0,262 md2.torso_width,-md2.torso_len,md2.torso_depth,0,0, 0,0,0,263 &x,&y,&z);264 265 //Right Arm266 AddBox(&md2,c1,-md2.torso_width/2-md2.arm_rad,md2.torso_len-md2.arm_rad,0,267 md2.arm_rad*2,-md2.arm_len/2,md2.arm_rad*2,md2.arm_rad,0,268 md2.r_shoulder_a2,0,md2.r_shoulder_a1,&x,&y,&z);269 AddBox(&md2,c3,x,y,z,270 md2.arm_rad*2,-md2.arm_len/2,md2.arm_rad*2,0,0,271 md2.r_shoulder_a2,0,md2.r_elbow_a,&x,&y,&z);272 AddBox(&md2,c3,x,y,z,273 md2.arm_rad*2,-md2.hand_len,md2.hand_rad*2,0,0,274 md2.r_shoulder_a2,0,md2.r_wrist_a,&x,&y,&z);275 276 //Left Arm277 AddBox(&md2,c1,md2.torso_width/2+md2.arm_rad,md2.torso_len-md2.arm_rad,0,278 md2.arm_rad*2,-md2.arm_len/2,md2.arm_rad*2,md2.arm_rad,0,279 md2.l_shoulder_a2,0,md2.l_shoulder_a1,&x,&y,&z);280 AddBox(&md2,c3,x,y,z,281 md2.arm_rad*2,-md2.arm_len/2,md2.arm_rad*2,0,0,282 md2.l_shoulder_a2,0,md2.l_elbow_a,&x,&y,&z);283 AddBox(&md2,c3,x,y,z,284 md2.arm_rad*2,-md2.hand_len,md2.hand_rad*2,0,0,285 md2.l_shoulder_a2,0,md2.l_wrist_a,&x,&y,&z);286 287 //Right Leg288 AddBox(&md2,c2,-md2.torso_width/2+md2.leg_rad,0,0,289 md2.leg_rad*2,-md2.leg_len/2,md2.leg_rad*2,0,0,290 md2.r_hip_a2,0,md2.r_hip_a1,&x,&y,&z);291 AddBox(&md2,c3,x,y,z,292 md2.leg_rad*2,-md2.leg_len/2,md2.leg_rad*2,0,md2.foot_rad,293 md2.r_hip_a2,0,md2.r_knee_a,&x,&y,&z);294 AddBox(&md2,c4,x,y,z,295 md2.leg_rad*2,-md2.foot_len,md2.foot_rad*2,md2.leg_rad,0,296 md2.r_hip_a2,0,md2.r_ankle_a,&x,&y,&z);297 298 //Left Leg299 AddBox(&md2,c2,md2.torso_width/2-md2.leg_rad,0,0,300 md2.leg_rad*2,-md2.leg_len/2,md2.leg_rad*2,0,0,301 md2.l_hip_a2,0,md2.l_hip_a1,&x,&y,&z);302 AddBox(&md2,c3,x,y,z,303 md2.leg_rad*2,-md2.leg_len/2,md2.leg_rad*2,0,md2.foot_rad,304 md2.l_hip_a2,0,md2.l_knee_a,&x,&y,&z);305 AddBox(&md2,c4,x,y,z,306 md2.leg_rad*2,-md2.foot_len,md2.foot_rad*2,md2.leg_rad,0,307 md2.l_hip_a2,0,md2.l_ankle_a,&x,&y,&z);308 309 res=Man2CSprite;310 "%h7c",'\n';311 Sprite(res,"\t\t$SP,\"<1>\",BI=%d$");312 "%h7c",'\n';313 Free(m);314 "Do another";315 if (YorN)316 Free(res);317 else318 break;319 }320 return res;321}322 