Thread: [brlcad-commits] SF.net SVN: brlcad:[35602] brlcad/trunk/src/libged/human.c
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <irp...@us...> - 2009-08-18 18:21:15
|
Revision: 35602 http://brlcad.svn.sourceforge.net/brlcad/?rev=35602&view=rev Author: irpguardian Date: 2009-08-18 18:21:07 +0000 (Tue, 18 Aug 2009) Log Message: ----------- Added human.c to libged to be used for archer plugin. Added Paths: ----------- brlcad/trunk/src/libged/human.c Added: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c (rev 0) +++ brlcad/trunk/src/libged/human.c 2009-08-18 18:21:07 UTC (rev 35602) @@ -0,0 +1,1942 @@ +/* H U M A N . C + * BRL-CAD + * + * Copyright (c) 2008-2009 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @file human.c + * + * Generator for human models based on height, and other stuff eventually, + * and for the humanwizard plugin (mostly) + */ + +#include "common.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> +#include "bu.h" +#include "vmath.h" +#include "bn.h" +#include "raytrace.h" +#include "wdb.h" +#include "ged.h" + +/* + * Default height is 5 feet, 8 inches, arbitrarily + */ +#define DEFAULT_HEIGHT_INCHES 68.0 +#define DEFAULT_FILENAME "human.g" +#define DEFAULT_HUMANNAME "Body.c" + +#define MAXLENGTH 64 /*Maxlength of things like object names, filenames */ +#define IN2MM 25.4 /*Convert an inch measurement to millimeters */ +#define CM2MM 10.0 /*Convert centimeters to millimeters */ + +char *progname = "Human Model"; +char filename[MAXLENGTH]=DEFAULT_FILENAME; +char humanName[MAXLENGTH]=DEFAULT_HUMANNAME; + +/** Human information structures */ +/** Location of all joints on the body located here */ +struct jointInfo +{ + point_t headJoint; + point_t neckJoint; + point_t leftShoulderJoint; + point_t rightShoulderJoint; + point_t elbowJoint; + point_t wristJoint; + point_t abdomenJoint; + point_t pelvisJoint; + point_t leftThighJoint; + point_t rightThighJoint; + point_t kneeJoint; + point_t ankleJoint; +}; + +/** Information for building the head */ +struct headInfo +{ + fastf_t headSize; + fastf_t neckLength, neckWidth; + + vect_t headVector; + vect_t neckVector; +}; + +/** All information needed to build the torso lies here */ +struct torsoInfo +{ + fastf_t torsoLength; + fastf_t topTorsoLength, lowTorsoLength; + fastf_t shoulderWidth; + fastf_t abWidth; + fastf_t pelvisWidth; + + vect_t topTorsoVector; + vect_t lowTorsoVector; +}; + +/** All information needed to build the arms lie here */ +struct armInfo +{ + fastf_t armLength; + fastf_t upperArmWidth; + fastf_t upperArmLength; + fastf_t lowerArmLength, elbowWidth; + fastf_t wristWidth; + fastf_t handLength, handWidth; + + vect_t armVector; + vect_t lArmDirection; /* Arm direction vectors */ + vect_t rArmDirection; + vect_t lElbowDirection; + vect_t rElbowDirection; + vect_t lWristDirection; + vect_t rWristDirection; +}; + +/** All information needed to build the legs lie here */ +struct legInfo +{ + fastf_t legLength; + fastf_t thighLength, thighWidth; + fastf_t calfLength, kneeWidth; + fastf_t footLength, ankleWidth; + fastf_t toeWidth; + + vect_t thighVector; + vect_t calfVector; + vect_t footVector; + vect_t lLegDirection; /* Leg direction vectors */ + vect_t rLegDirection; + vect_t lKneeDirection; + vect_t rKneeDirection; + vect_t lFootDirection; + vect_t rFootDirection; +}; + +enum genders { male, female }; +enum ethnicities { generic, white, black, hispanic, asian, other }; /* divisions taken from army demographic sheet */ + +struct human_data_t +{ + fastf_t height; /* Height of person standing, inches */ + int age; /* Age of person, (still relevant?) */ + enum genders gender; /* Gender of person */ + enum ethnicities ethnicity; /* Ethnicity of person */ + + /* Various part lengths */ + struct headInfo head; + struct torsoInfo torso; + struct armInfo arms; + struct legInfo legs; + struct jointInfo joints; +}; + +/** + * This function takes in a vector, then applies a new direction to it + * using x, y, and z degrees, and exports it to resultVect, and returns + * the distance of the vector. + */ +fastf_t setDirection(fastf_t *inVect, fastf_t *resultVect, fastf_t *outMatrix, fastf_t x, fastf_t y, fastf_t z) +{ + vect_t outVect; + mat_t rotMatrix; + MAT_ZERO(rotMatrix); + + /* + * x y z placed inside rotation matrix and applied to vector. + * bn_mat_angles(rotMatrix, x, y, z) matrix rot in degrees + * MAT4X3VEC(outVect, rotMatrix, inVect); + */ + bn_mat_angles(rotMatrix, x, y, z); + MAT3X3VEC(outVect, rotMatrix, inVect); + +/* Print rotation matrix + * int i=0; + * for(i=1; i<=16; i++){ + * bu_log("%3.4f\t", rotMatrix[(i-1)]); + * if(i%4==0) + * bu_log("\n"); + * } + */ + VMOVE(resultVect, outVect); + /*return MAGNITUDE(outVect);*/ + MAT_COPY(outMatrix, rotMatrix); + return *rotMatrix; +} + +void vectorTest(struct rt_wdb *file) +{ + /* + * This code here takes a direction vector, and then redirects it based on the angles given + * so it is as follows : startingVector, resultVector, xdegrees, ydegrees, zdegrees. + * and this will be used to position the arms and legs so they are joined yet flexable. + * Just a test with an rcc. + */ + + /*Vector shape modifying test */ + vect_t test1, test2; + point_t testpoint; + mat_t rotMatrix; + VSET(testpoint, 0.0, 0.0, 0.0); + VSET(test1, 0, 0, 200); + setDirection(test1, test2, rotMatrix, 0, 90, 0); + bu_log("%f, %f, %f\n", test1[X], test1[Y], test1[Z]); + bu_log("%f, %f, %f\n", test2[X], test2[Y], test2[Z]); + mk_rcc(file, "NormalTest.s", testpoint, test1, (5*IN2MM)); + mk_rcc(file, "ChangeTest.s", testpoint, test2, (5*IN2MM)); + /* See, now wasn't that easy? */ +} + +/* Find the hypotenuse of 2 lengths / length vectors */ +fastf_t findVector(fastf_t x, fastf_t y) +{ + fastf_t w; + fastf_t v; + v = x*x; + w = y*y; + return sqrt(v + w); +} + +/** Create a bounding box around the individual part, this one has only 1 value for depth and width */ +void boundingBox(struct rt_wdb *file, char *name, fastf_t *startPoint, fastf_t *lengthVector, fastf_t partWidth, fastf_t *rotMatrix) +{ + /* Make the arb8/rpp that will bound the part as it were straight up and down, + * And then rotate it to the current position as given in rotMatrix, + * followed by naming it by taking name, and cat-ing BOX to the end of it. + */ + vect_t vects[8]; + vect_t newVects[8]; + point_t finalPoints[8]; + vect_t distance; + char newName[MAXLENGTH] = "a"; + char debug[MAXLENGTH] = "a"; + int i = 0; + bu_strlcpy(newName, name, MAXLENGTH); + bu_strlcpy(debug, name, MAXLENGTH); + bu_strlcat(newName, "Box", MAXLENGTH); + bu_strlcat(debug, "Joint", MAXLENGTH); + + VADD2(distance, startPoint, lengthVector); + VSET(distance, distance[X], distance[Y], startPoint[Z]-lengthVector[Z]); + + VSET(vects[0], (-partWidth+startPoint[X]), (-partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[1], (-partWidth+startPoint[X]), (partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[2], (partWidth+startPoint[X]), (partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[3], (partWidth+startPoint[X]), (-partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[4], (-partWidth+startPoint[X]), (-partWidth+startPoint[Y]), (distance[Z])); + VSET(vects[5], (-partWidth+startPoint[X]), (partWidth+startPoint[Y]), (distance[Z])); + VSET(vects[6], (partWidth+startPoint[X]), (partWidth+startPoint[Y]), (distance[Z])); + VSET(vects[7], (partWidth+startPoint[X]), (-partWidth+startPoint[Y]), (distance[Z])); + + for(i = 0; i<8; i++) + { + vects[i][Y]*=-1; + } + +/* Print rotation matrix */ + int w=0; + for(w=1; w<=16; w++){ + /*Z rotation matrix */ +/* if(w==1 || w==2 || w== 5 || w== 6 || w==11) + rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; +*/ + /*Y rotation Matrix */ +/* if(w==1 || w==3 || w== 6 || w==9 || w==11) + rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; +*/ + /*X rotation Matrix */ + if(w==1 || w==6 || w== 7 || w==10 || w==11) + rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; +/* + bu_log("%3.4f\t", rotMatrix[(w-1)]); + if(w%4==0) + bu_log("\n"); +*/ + } +/* bu_log("-------------------------------+\n"); +*/ + /* MAT4X3VEC, rotate a vector about a center point, by a rotmatrix, MAT4X3VEC(new, rotmatrix, old) */ + for(i = 0; i < 8; i++){ + /* + MAT4X3VEC(newVects[i], rotMatrix, vects[i]); + */ + VEC3X3MAT(newVects[i], vects[i], rotMatrix); + } + point_t endPoint; + MAT4X3PNT(endPoint, rotMatrix, startPoint); + + /* Set points to be at end of each vector */ + for(i = 0; i < 8; i++){ + VMOVE(finalPoints[i], newVects[i]); + } +/* mk_trc_h(file, debug, endPoint, lengthVector, 2, 2); */ + mk_arb8(file, newName, *finalPoints); +} + +/** Create a bounding rectangle around the individual part, and this one has 2 separate values for depth and width */ +void boundingRectangle(struct rt_wdb *file, char *name, fastf_t *startPoint, fastf_t *lengthVector, fastf_t partWidth, fastf_t partDepth, fastf_t *rotMatrix) +{ + /* Make the arb8/rpp that will bound the part as it were straight up and down, + * And then rotate it to the current position as given in rotMatrix, + * followed by naming it by taking name, and cat-ing BOX to the end of it. + */ + vect_t vects[8]; + vect_t distance; + char newName[MAXLENGTH] = "a"; + + bu_strlcpy(newName, name, MAXLENGTH); + bu_strlcat(newName, "Box", MAXLENGTH); + + VADD2(distance, startPoint, lengthVector); + VSET(distance, distance[X], distance[Y], startPoint[Z]-lengthVector[Z]); + + /* Set first 4 points to be on the same plane as the starting point, and the last 4 points to be the distance vector point plane */ +/* +* fastf_t length=findVector(partWidth, partWidth); +*/ + VSET(vects[0], (-partDepth+startPoint[X]), (-partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[1], (-partDepth+startPoint[X]), (partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[2], (partDepth+startPoint[X]), (partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[3], (partDepth+startPoint[X]), (-partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[4], (-partDepth+startPoint[X]), (-partWidth+startPoint[Y]), (distance[Z])); + VSET(vects[5], (-partDepth+startPoint[X]), (partWidth+startPoint[Y]), (distance[Z])); + VSET(vects[6], (partDepth+startPoint[X]), (partWidth+startPoint[Y]), (distance[Z])); + VSET(vects[7], (partDepth+startPoint[X]), (-partWidth+startPoint[Y]), (distance[Z])); + + mk_arb8(file, newName, *vects); +} + +/******************************************/ +/***** Body Parts, from the head down *****/ +/******************************************/ + +fastf_t makeHead(struct rt_wdb (*file), char *name, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) +{ + fastf_t head = dude->head.headSize / 2; + vect_t startVector, lengthVector; + /*Length vector is just the diameter of the head, currently*/ + VSET(lengthVector, 0, 0, dude->head.headSize); + VSET(startVector, 0, 0, 0); + mat_t rotMatrix; + setDirection(startVector, dude->head.headVector, rotMatrix, direction[X], direction[Y], direction[Z]); + mk_sph(file, name, dude->joints.headJoint, head); + + point_t headFix; + VSET(headFix, dude->joints.headJoint[X], dude->joints.headJoint[Y], dude->joints.headJoint[Z]+head); + + if(showBoxes){ + boundingBox(file, name, headFix, lengthVector, (lengthVector[Z]/2), rotMatrix); + } + return 0; +} + +fastf_t makeNeck(struct rt_wdb *file, char *name, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) +{ + vect_t startVector; + mat_t rotMatrix; + VSET(startVector, 0, 0, dude->head.neckLength); + setDirection(startVector, dude->head.neckVector, rotMatrix, direction[X], direction[Y], direction[Z]); + VADD2(dude->joints.neckJoint, dude->joints.headJoint, dude->head.neckVector); + mk_rcc(file, name, dude->joints.headJoint, dude->head.neckVector, dude->head.neckWidth); + + if(showBoxes){ + boundingBox(file, name, dude->joints.headJoint, startVector, dude->head.neckWidth, rotMatrix); + } + return dude->head.neckWidth; +} + +fastf_t makeUpperTorso(struct rt_wdb *file, char *name, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) +{ + vect_t startVector; + vect_t a, b, c, d; + vect_t leftVector, rightVector; + mat_t rotMatrix; + + /* Set length of top torso portion */ + VSET(startVector, 0, 0, dude->torso.topTorsoLength); + setDirection(startVector, dude->torso.topTorsoVector, rotMatrix, direction[X], direction[Y], direction[Z]); + VADD2(dude->joints.abdomenJoint, dude->joints.neckJoint, dude->torso.topTorsoVector); + + /* change shoulder joints to match up to torso */ + VSET(leftVector, 0, (dude->torso.shoulderWidth+(dude->arms.upperArmWidth)), 0); + VSET(rightVector, 0, (dude->torso.shoulderWidth+(dude->arms.upperArmWidth))*-1, 0); + + VADD2(dude->joints.leftShoulderJoint, dude->joints.neckJoint, leftVector); + VADD2(dude->joints.rightShoulderJoint, dude->joints.neckJoint, rightVector); + + /*Take shoulder width, and abWidth and convert values to vectors for tgc */ + VSET(a, (dude->torso.shoulderWidth/2), 0, 0); + VSET(b, 0, dude->torso.shoulderWidth, 0); + VSET(c, (dude->torso.abWidth/2), 0, 0); + VSET(d, 0, (dude->torso.abWidth), 0); + + /* Torso will be an ellipsoidal tgc, for more realistic shape */ + mk_tgc(file, name, dude->joints.neckJoint, dude->torso.topTorsoVector, a, b, c, d); + + if(showBoxes){ + boundingRectangle(file, name, dude->joints.neckJoint, startVector, dude->torso.shoulderWidth, (dude->torso.shoulderWidth/2), rotMatrix); + } + return dude->torso.abWidth; +} + +fastf_t makeLowerTorso(struct rt_wdb *file, char *name, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) +{ + vect_t startVector, leftVector, rightVector; + vect_t a, b, c, d; + mat_t rotMatrix; + + VSET(startVector, 0, 0, dude->torso.lowTorsoLength); + setDirection(startVector, dude->torso.lowTorsoVector, rotMatrix, direction[X], direction[Y], direction[Z]); + VADD2(dude->joints.pelvisJoint, dude->joints.abdomenJoint, dude->torso.lowTorsoVector); + + /* Set locations of legs */ + VSET(leftVector, 0, (dude->torso.pelvisWidth/2), 0); + VSET(rightVector, 0, ((dude->torso.pelvisWidth/2)*-1), 0); + VADD2(dude->joints.leftThighJoint, dude->joints.pelvisJoint, leftVector); + VADD2(dude->joints.rightThighJoint, dude->joints.pelvisJoint, rightVector); + + VSET(a, (dude->torso.abWidth/2), 0, 0); + VSET(b, 0, dude->torso.abWidth, 0); + VSET(c, (dude->torso.pelvisWidth/2), 0, 0); + VSET(d, 0, dude->torso.pelvisWidth, 0); + + mk_tgc(file, name, dude->joints.abdomenJoint, dude->torso.lowTorsoVector, a, b, c, d); +/* + * mk_trc_h(file, name, abdomenJoint, lowTorsoVector, abWidth, pelvisWidth); + */ + if(showBoxes){ + boundingRectangle(file, name, dude->joints.abdomenJoint, startVector, dude->torso.pelvisWidth, (dude->torso.pelvisWidth/2), rotMatrix); + } + return dude->torso.pelvisWidth; +} + +fastf_t makeShoulderJoint(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) +{ + vect_t startVector, lengthVector; + VSET(startVector, 0, 0, dude->arms.upperArmWidth*2); + VSET(lengthVector, 0, 0, dude->arms.upperArmWidth); + mat_t rotMatrix; + fastf_t shoulder = dude->arms.upperArmWidth; + + if(isLeft) + mk_sph(file, name, dude->joints.leftShoulderJoint, (dude->arms.upperArmWidth)); + else + mk_sph(file, name, dude->joints.rightShoulderJoint, (dude->arms.upperArmWidth)); + + point_t leftFix, rightFix; + + if(showBoxes){ + if(isLeft){ + setDirection(startVector, lengthVector, rotMatrix, dude->arms.lArmDirection[X], dude->arms.lArmDirection[Y], dude->arms.lArmDirection[Z]); + VSET(leftFix, dude->joints.leftShoulderJoint[X], dude->joints.leftShoulderJoint[Y], (dude->joints.leftShoulderJoint[Z]-shoulder)); + boundingBox(file, name, leftFix, lengthVector, (lengthVector[Z]/2), rotMatrix); + } + else{ + setDirection(startVector, lengthVector, rotMatrix, dude->arms.rArmDirection[X], dude->arms.rArmDirection[Y], dude->arms.rArmDirection[Z]); + VSET(rightFix, dude->joints.rightShoulderJoint[X], dude->joints.rightShoulderJoint[Y], (dude->joints.rightShoulderJoint[Z]-shoulder)); + boundingBox(file, name, rightFix, lengthVector, (lengthVector[Z]/2), rotMatrix); + } + } + return dude->torso.shoulderWidth; +} + +fastf_t makeShoulder(struct rt_wdb *file, fastf_t isLeft, char *partName, struct human_data_t *dude, fastf_t showBoxes) +{ + return 1; +} + +fastf_t makeUpperArm(struct rt_wdb *file, fastf_t isLeft, char *partName, struct human_data_t *dude, fastf_t showBoxes) +{ + vect_t startVector; + mat_t rotMatrix; + + VSET(startVector, 0, 0, dude->arms.upperArmLength); + if(isLeft){ + setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.lArmDirection[X], dude->arms.lArmDirection[Y], dude->arms.lArmDirection[Z]); /* set y to 180 to point down */ + VADD2(dude->joints.elbowJoint, dude->joints.leftShoulderJoint, dude->arms.armVector); + mk_trc_h(file, partName, dude->joints.leftShoulderJoint, dude->arms.armVector, dude->arms.upperArmWidth, dude->arms.elbowWidth); + } + else{ + setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.rArmDirection[X], dude->arms.rArmDirection[Y], dude->arms.rArmDirection[Z]); /* set y to 180 to point down */ + VADD2(dude->joints.elbowJoint, dude->joints.rightShoulderJoint, dude->arms.armVector); + mk_trc_h(file, partName, dude->joints.rightShoulderJoint, dude->arms.armVector, dude->arms.upperArmWidth, dude->arms.elbowWidth); + } + +/* Vectors and equations for making TGC arms + * vect_t a, b, c, d; + * VSET(a, upperArmWidth, 0 , 0); + * VSET(b, 0, upperArmWidth, 0); + * VSET(c, ((elbowWidth*3)/4), 0, 0) + * VSET(d, 0, elbowWidth, 0); + * + * mk_tgc(file, partName, ShoulderJoint, armVector, a, b, c, d); + */ + + if(showBoxes){ + if(isLeft) + boundingBox(file, partName, dude->joints.leftShoulderJoint, startVector, dude->arms.upperArmWidth, rotMatrix); + else + boundingBox(file, partName, dude->joints.rightShoulderJoint, startVector, dude->arms.upperArmWidth, rotMatrix); + } + return dude->arms.elbowWidth; +} + +fastf_t makeElbow(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude) +{ + vect_t a, b, c; + VSET(a, (dude->arms.elbowWidth), 0, 0); + VSET(b, 0, (dude->arms.elbowWidth), 0); + VSET(c, 0, 0, dude->arms.elbowWidth); + + mk_ell(file, name, dude->joints.elbowJoint, a, b, c); +/* +* mk_sph(file, name, dude->joints.elbowJoint, dude->arms.elbowWidth); +*/ + return dude->arms.elbowWidth; +} + +fastf_t makeLowerArm(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) +{ + vect_t startVector; + mat_t rotMatrix; + + VSET(startVector, 0, 0, dude->arms.lowerArmLength); + if(isLeft){ + setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.lElbowDirection[X], dude->arms.lElbowDirection[Y], dude->arms.lElbowDirection[Z]); + VADD2(dude->joints.wristJoint, dude->joints.elbowJoint, dude->arms.armVector); + } + else{ + setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.rElbowDirection[X], dude->arms.rElbowDirection[Y], dude->arms.rElbowDirection[Z]); + VADD2(dude->joints.wristJoint, dude->joints.elbowJoint, dude->arms.armVector); + } + +/* vectors for building a tgc arm (which looks weird when rotated) */ +/* vect_t a, b, c, d; + * + * VSET(a, ((elbowWidth*3)/4), 0, 0); + * VSET(b, 0, (elbowWidth), 0); + * VSET(c, wristWidth, 0, 0); + * VSET(d, 0, wristWidth, 0); + * + * mk_tgc(file, name, elbowJoint, armVector, a, b, c, d); + */ + mk_trc_h(file, name, dude->joints.elbowJoint, dude->arms.armVector, dude->arms.elbowWidth, dude->arms.wristWidth); + + if(showBoxes){ + if(isLeft) + boundingBox(file, name, dude->joints.elbowJoint, startVector, dude->arms.elbowWidth, rotMatrix); + else + boundingBox(file, name, dude->joints.elbowJoint, startVector, dude->arms.elbowWidth, rotMatrix); + } + + return dude->arms.wristWidth; +} + +fastf_t makeWrist(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude) +{ + mk_sph(file, name, dude->joints.wristJoint, dude->arms.wristWidth); + return dude->arms.wristWidth; +} + +void makeHand(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) +{ + mat_t rotMatrix; + vect_t startVector; + VSET(startVector, 0, 0, dude->arms.handLength); + if(isLeft){ + setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.lWristDirection[X], dude->arms.lWristDirection[Y], dude->arms.lWristDirection[Z]); + } + else{ + setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.rWristDirection[X], dude->arms.rWristDirection[Y], dude->arms.rWristDirection[Z]); + } + + mk_sph(file, name, dude->joints.wristJoint, dude->arms.wristWidth); + + if(showBoxes) + { + boundingRectangle(file, name, dude->joints.wristJoint, startVector, dude->arms.handWidth, dude->arms.handLength, rotMatrix); + } +} + +fastf_t makeThighJoint(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude) +{ + if(isLeft) + mk_sph(file, name, dude->joints.leftThighJoint, dude->legs.thighWidth); + else + mk_sph(file, name, dude->joints.rightThighJoint, dude->legs.thighWidth); + + return dude->legs.thighWidth; +} + +fastf_t makeThigh(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) +{ + vect_t startVector; + VSET(startVector, 0, 0, dude->legs.thighLength); + mat_t rotMatrix; + + if(isLeft){ + setDirection(startVector, dude->legs.thighVector, rotMatrix, dude->legs.lLegDirection[X], dude->legs.lLegDirection[Y], dude->legs.lLegDirection[Z]); + VADD2(dude->joints.kneeJoint, dude->joints.leftThighJoint, dude->legs.thighVector); + mk_trc_h(file, name, dude->joints.leftThighJoint, dude->legs.thighVector, dude->legs.thighWidth, dude->legs.kneeWidth); + } + else{ + setDirection(startVector, dude->legs.thighVector, rotMatrix, dude->legs.rLegDirection[X], dude->legs.rLegDirection[Y], dude->legs.rLegDirection[Z]); + VADD2(dude->joints.kneeJoint, dude->joints.rightThighJoint, dude->legs.thighVector); + mk_trc_h(file, name, dude->joints.rightThighJoint, dude->legs.thighVector, dude->legs.thighWidth, dude->legs.kneeWidth); + } + if(showBoxes){ + if(isLeft) + boundingBox(file, name, dude->joints.leftThighJoint, startVector, dude->legs.thighWidth, rotMatrix); + else + boundingBox(file, name, dude->joints.rightThighJoint, startVector, dude->legs.thighWidth, rotMatrix); + } + return dude->legs.kneeWidth; +} + +fastf_t makeKnee(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude) +{ + mk_sph(file, name, dude->joints.kneeJoint, dude->legs.kneeWidth); + return dude->legs.kneeWidth; +} + +fastf_t makeCalf(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) +{ + vect_t startVector; + mat_t rotMatrix; + VSET(startVector, 0, 0, dude->legs.calfLength); + +/* +* Find a better way of error checking to see if the legs go thru the ground. +* if(ankleJoint[Y] <= 0){ +* ankleJoint[Y] = ankleWidth; +* } +*/ + if(isLeft) + setDirection(startVector, dude->legs.calfVector, rotMatrix, dude->legs.lKneeDirection[X], dude->legs.lKneeDirection[Y], dude->legs.lKneeDirection[Z]); + else + setDirection(startVector, dude->legs.calfVector, rotMatrix, dude->legs.rKneeDirection[X], dude->legs.rKneeDirection[Y], dude->legs.rKneeDirection[Z]); + + VADD2(dude->joints.ankleJoint, dude->joints.kneeJoint, dude->legs.calfVector); + mk_trc_h(file, name, dude->joints.kneeJoint, dude->legs.calfVector, dude->legs.kneeWidth, dude->legs.ankleWidth); + + if(showBoxes){ + if(isLeft) + boundingBox(file, name, dude->joints.kneeJoint, startVector, dude->legs.kneeWidth, rotMatrix); + else + boundingBox(file, name, dude->joints.kneeJoint, startVector, dude->legs.kneeWidth, rotMatrix); + } + return dude->legs.ankleWidth; +} + +fastf_t makeAnkle(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude) +{ + mk_sph(file, name, dude->joints.ankleJoint, dude->legs.ankleWidth); + return dude->legs.ankleWidth; +} + +fastf_t makeFoot(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) +{ + vect_t startVector, boxVector; + mat_t rotMatrix; + VSET(startVector, 0, 0, dude->legs.footLength); + VSET(boxVector, 0, 0, dude->legs.footLength + dude->legs.toeWidth); + + if(isLeft) + setDirection(startVector, dude->legs.footVector, rotMatrix, dude->legs.lFootDirection[X], dude->legs.lFootDirection[Y], dude->legs.lFootDirection[Z]); + else + setDirection(startVector, dude->legs.footVector, rotMatrix, dude->legs.rFootDirection[X], dude->legs.rFootDirection[Y], dude->legs.rFootDirection[Z]); + + mk_particle(file, name, dude->joints.ankleJoint, dude->legs.footVector, dude->legs.ankleWidth, dude->legs.toeWidth); + + if(showBoxes){ + if(isLeft) + boundingBox(file, name, dude->joints.ankleJoint, boxVector, dude->legs.toeWidth, rotMatrix); + else + boundingBox(file, name, dude->joints.ankleJoint, boxVector, dude->legs.toeWidth, rotMatrix); + } + return 0; +} + +/** + * Make profile makes the head and neck of the body + */ +void makeProfile(struct rt_wdb (*file), char *suffix, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) +{ + char headName[MAXLENGTH]="Head.s"; + char neckName[MAXLENGTH]="Neck.s"; + bu_strlcat(headName, suffix, MAXLENGTH); + bu_strlcat(neckName, suffix, MAXLENGTH); + dude->head.neckLength = dude->head.headSize / 2; + makeHead(file, headName, dude, direction, showBoxes); + makeNeck(file, neckName, dude, direction, showBoxes); +} + +/* + * Create all the torso parts, and set joint locations for each arm, and each leg. + */ +void makeTorso(struct rt_wdb (*file), char *suffix, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) +{ + char upperTorsoName[MAXLENGTH]="UpperTorso.s"; + char lowerTorsoName[MAXLENGTH]="LowerTorso.s"; + char leftShoulderName[MAXLENGTH]="LeftShoulder.s"; + char rightShoulderName[MAXLENGTH]="RightShoulder.s"; + + bu_strlcat(upperTorsoName, suffix, MAXLENGTH); + bu_strlcat(lowerTorsoName, suffix, MAXLENGTH); + bu_strlcat(leftShoulderName, suffix, MAXLENGTH); + bu_strlcat(rightShoulderName, suffix, MAXLENGTH); + + makeUpperTorso(file, upperTorsoName, dude, direction, showBoxes); + + makeShoulder(file, 1, leftShoulderName, dude, showBoxes); + makeShoulder(file, 0, rightShoulderName, dude, showBoxes); + + makeLowerTorso(file, lowerTorsoName, dude, direction, showBoxes); +} + +/** + * Make the 3 components of the arm:the upper arm, the lower arm, and the hand. + */ +void makeArm(struct rt_wdb (*file), char *suffix, int isLeft, struct human_data_t *dude, fastf_t showBoxes) +{ + char shoulderJointName[MAXLENGTH]; + char upperArmName[MAXLENGTH]; + char elbowName[MAXLENGTH]; + char lowerArmName[MAXLENGTH]; + char wristName[MAXLENGTH]; + char handName[MAXLENGTH]; + + if(isLeft){ + bu_strlcpy(shoulderJointName, "LeftShoulderJoint.s", MAXLENGTH); + bu_strlcpy(upperArmName, "LeftUpperArm.s", MAXLENGTH); + bu_strlcpy(elbowName, "LeftElbowJoint.s", MAXLENGTH); + bu_strlcpy(lowerArmName, "LeftLowerArm.s", MAXLENGTH); + bu_strlcpy(wristName, "LeftWristJoint.s", MAXLENGTH); + bu_strlcpy(handName, "LeftHand.s", MAXLENGTH); + } + else{ + bu_strlcpy(shoulderJointName, "RightShoulderJoint.s", MAXLENGTH); + bu_strlcpy(upperArmName, "RightUpperArm.s", MAXLENGTH); + bu_strlcpy(elbowName, "RightElbowJoint.s", MAXLENGTH); + bu_strlcpy(lowerArmName, "RightLowerArm.s", MAXLENGTH); + bu_strlcpy(wristName, "RightWristJoint.s", MAXLENGTH); + bu_strlcpy(handName, "RightHand.s", MAXLENGTH); + } + + bu_strlcat(shoulderJointName, suffix, MAXLENGTH); + bu_strlcat(upperArmName, suffix, MAXLENGTH); + bu_strlcat(elbowName, suffix, MAXLENGTH); + bu_strlcat(lowerArmName, suffix, MAXLENGTH); + bu_strlcat(wristName, suffix, MAXLENGTH); + bu_strlcat(handName, suffix, MAXLENGTH); + + makeShoulderJoint(file, isLeft, shoulderJointName, dude, showBoxes); + makeUpperArm(file, isLeft, upperArmName, dude, showBoxes); + makeElbow(file, isLeft, elbowName, dude); + + makeLowerArm(file, isLeft, lowerArmName, dude, showBoxes); + makeWrist(file, isLeft, wristName, dude); + makeHand(file, isLeft, handName, dude, showBoxes); +} + +/** + * Create the leg to be length 'legLength' by making a thigh, calf, and foot to meet requirements. + */ +void makeLeg(struct rt_wdb (*file), char *suffix, int isLeft, struct human_data_t *dude, fastf_t showBoxes) +{ + char thighJointName[MAXLENGTH]; + char thighName[MAXLENGTH]; + char kneeName[MAXLENGTH]; + char calfName[MAXLENGTH]; + char ankleName[MAXLENGTH]; + char footName[MAXLENGTH]; + + if(isLeft){ + bu_strlcpy(thighJointName, "LeftThighJoint.s", MAXLENGTH); + bu_strlcpy(thighName, "LeftThigh.s", MAXLENGTH); + bu_strlcpy(kneeName, "LeftKneeJoint.s", MAXLENGTH); + bu_strlcpy(calfName, "LeftCalf.s", MAXLENGTH); + bu_strlcpy(ankleName, "LeftAnkleJoint.s", MAXLENGTH); + bu_strlcpy(footName, "LeftFoot.s", MAXLENGTH); + } + else{ + bu_strlcpy(thighJointName, "RightThighJoint.s", MAXLENGTH); + bu_strlcpy(thighName, "RightThigh.s", MAXLENGTH); + bu_strlcpy(kneeName, "RightKneeJoint.s", MAXLENGTH); + bu_strlcpy(calfName, "RightCalf.s", MAXLENGTH); + bu_strlcpy(ankleName, "RightAnkleJoint.s", MAXLENGTH); + bu_strlcpy(footName, "RightFoot.s", MAXLENGTH); + } + bu_strlcat(thighJointName, suffix, MAXLENGTH); + bu_strlcat(thighName, suffix, MAXLENGTH); + bu_strlcat(kneeName, suffix, MAXLENGTH); + bu_strlcat(calfName, suffix, MAXLENGTH); + bu_strlcat(ankleName, suffix, MAXLENGTH); + bu_strlcat(footName, suffix, MAXLENGTH); + + makeThighJoint(file, isLeft, thighJointName, dude); + makeThigh(file, isLeft, thighName, dude, showBoxes); + makeKnee(file, isLeft, kneeName, dude); + makeCalf(file, isLeft, calfName, dude, showBoxes); + makeAnkle(file, isLeft, ankleName, dude); + makeFoot(file, isLeft, footName, dude, showBoxes); +} + +/** + * Make the head, shoulders knees and toes, so to speak. + * Head, neck, torso, arms, hands, legs, feet. + * And dude, a very technical term, is the human_data in a shorter, more readable name + */ +void makeBody(struct rt_wdb (*file), char *suffix, struct human_data_t *dude, fastf_t *location, fastf_t showBoxes) +{ + bu_log("Making Body\n"); + vect_t direction; + /* + * Make sure that vectors, points, and widths are sent to each function + * for direction, location, and correct sizing, respectivly. + */ + bu_log("Setting Direction\n"); + VSET(dude->joints.headJoint, location[X], location[Y], (location[Z]+((dude->height*IN2MM)-(dude->head.headSize/2)))); + VSET(direction, 180, 0, 0); /*Make the body build down, from head to toe. Or else it's upsidedown */ + + /** + * Head Parts + */ + /*makeProfile makes the head and the neck */ + makeProfile(file, suffix, dude, direction, showBoxes); + + /** + * Torso Parts + */ + makeTorso(file, suffix, dude, direction, showBoxes); + + /** + * Arm Parts + */ + /*The second argument is whether or not it is the left side, 1 = yes, 0 = no) */ + makeArm(file, suffix, 1, dude, showBoxes); + makeArm(file, suffix, 0, dude, showBoxes); + + /** + * Leg Parts + */ + makeLeg(file, suffix, 1, dude, showBoxes); + makeLeg(file, suffix, 0, dude, showBoxes); + bu_log("Body Built\n"); +} + +/** + * MakeArmy makes a square of persons n by n large, where n is the number of persons entered using -N + * if N is large (>= 20) Parts start disappearing, oddly enough. + */ +void makeArmy(struct rt_wdb (*file), struct human_data_t dude, int number, fastf_t showBoxes) +{ + point_t locations; + VSET(locations, 0, 0, 0); /* Starting location */ + int x = 0; + int y = 0; + int num; + char testname[10]={'0'}; + num = 0.0; + char suffix[MAXLENGTH]; + + for(x = 0; x<number; x++){ + for(y=0; y<number; y++){ + sprintf(testname, "%d", num); + bu_strlcpy(suffix, testname, MAXLENGTH); + makeBody(file, suffix, &dude, locations, showBoxes); + VSET(locations, (locations[X]- (dude.torso.shoulderWidth + dude.arms.upperArmWidth)*4), locations[Y], 0); + num++; + } + VSET(locations, 0, (locations[Y]- (dude.torso.shoulderWidth + dude.arms.upperArmWidth)*4), 0); + } +} +void grabCoordinates(fastf_t *positions) +{ + printf("X: "); + scanf("%lf", &positions[X]); + fflush(stdin); + printf("Y: "); + scanf("%lf", &positions[Y]); + fflush(stdin); + printf("Z: "); + scanf("%lf", &positions[Z]); + fflush(stdin); +} + +void manualPosition(struct human_data_t *dude) +{ + vect_t positions; + printf("Manually Setting All limb Positions in degrees\n"); + printf("Remember, a 180 value for Y means pointing down\nSo for your left arm, xyz of 0 180 0 would be on the side\n"); + printf("Head is always at standing height, at origin\n"); + + printf("Left Arm\n"); + printf("Upper Arm\n"); + grabCoordinates(positions); + VMOVE(dude->arms.lArmDirection, positions); + printf("Lower Arm\n"); + grabCoordinates(positions); + VMOVE(dude->arms.lElbowDirection, positions); + printf("Hand\n"); + grabCoordinates(positions); + VMOVE(dude->arms.lWristDirection, positions); + + printf("Right Arm\n"); + printf("Upper Arm\n"); + grabCoordinates(positions); + VMOVE(dude->arms.rArmDirection, positions); + printf("Lower Arm\n"); + grabCoordinates(positions); + VMOVE(dude->arms.rElbowDirection, positions); + printf("Hand\n"); + grabCoordinates(positions); + VMOVE(dude->arms.rWristDirection, positions); + + printf("Left Leg\n"); + printf("Thigh\n"); + grabCoordinates(positions); + VMOVE(dude->legs.lLegDirection, positions); + printf("Calf\n"); + grabCoordinates(positions); + VMOVE(dude->legs.lKneeDirection, positions); + printf("Foot\n"); + grabCoordinates(positions); + VMOVE(dude->legs.lFootDirection, positions); + + printf("Right Leg\n"); + printf("Thigh\n"); + grabCoordinates(positions); + VMOVE(dude->legs.rLegDirection, positions); + printf("Calf\n"); + grabCoordinates(positions); + VMOVE(dude->legs.rKneeDirection, positions); + printf("Foot\n"); + grabCoordinates(positions); + VMOVE(dude->legs.rFootDirection, positions); +} + +/* position limbs to fit stance input in command line (or just default to standing) */ +void setStance(fastf_t stance, struct human_data_t *dude) +{ + vect_t downVect, forwardVect, rightVect, leftVect; /* generic vectors for holding temp values */ + + /** + * The stances are the way the body is positioned via + * adjusting limbs and whatnot. THEY ARE: + * 0: Standing + * 1: Sitting + * 2: Driving + * 3: Arms Out + * 4: The Letterman + * 5: The Captain + * #: and more as needed + * 999: Custom (done interactivly) + */ + + VSET(downVect, 0, 180, 0); /*straight down*/ + VSET(forwardVect, 0, 90, 0); /*forwards, down X axis */ + VSET(rightVect, 90, 0, 0); /*Right, down Y axis */ + VSET(leftVect, -90, 0, 0); /*Left, up Y axis */ + + switch((int)stance) + { + case 0: + bu_log("Making it stand\n"); + VMOVE(dude->arms.lArmDirection, downVect); + VMOVE(dude->arms.rArmDirection, downVect); + VMOVE(dude->arms.lElbowDirection, downVect); + VMOVE(dude->arms.rElbowDirection, downVect); + VMOVE(dude->arms.lWristDirection, downVect); + VMOVE(dude->arms.rWristDirection, downVect); + VMOVE(dude->legs.lLegDirection, downVect); + VMOVE(dude->legs.rLegDirection, downVect); + VMOVE(dude->legs.lKneeDirection, downVect); + VMOVE(dude->legs.rKneeDirection, downVect); + VMOVE(dude->legs.lFootDirection, forwardVect); + VMOVE(dude->legs.rFootDirection, forwardVect); + bu_log("Standing\n"); + break; + case 1: + bu_log("Making it sit\n"); + VMOVE(dude->arms.lArmDirection, downVect); + VMOVE(dude->arms.rArmDirection, downVect); + VMOVE(dude->arms.lElbowDirection, downVect); + VMOVE(dude->arms.rElbowDirection, downVect); + VMOVE(dude->arms.lWristDirection, downVect); + VMOVE(dude->arms.rWristDirection, downVect); + VMOVE(dude->legs.lLegDirection, forwardVect); + VMOVE(dude->legs.rLegDirection, forwardVect); + VMOVE(dude->legs.lKneeDirection, downVect); + VMOVE(dude->legs.rKneeDirection, downVect); + VMOVE(dude->legs.lFootDirection, forwardVect); + VMOVE(dude->legs.rFootDirection, forwardVect); + break; + case 2: + bu_log("Making it Drive\n"); /* it's like sitting, but with the arms extended */ + VMOVE(dude->arms.lArmDirection, downVect); + VMOVE(dude->arms.rArmDirection, downVect); + VMOVE(dude->arms.lElbowDirection, forwardVect); + VMOVE(dude->arms.rElbowDirection, forwardVect); + VMOVE(dude->arms.lWristDirection, forwardVect); + VMOVE(dude->arms.rWristDirection, forwardVect); + VMOVE(dude->legs.lLegDirection, forwardVect); + VMOVE(dude->legs.rLegDirection, forwardVect); + VMOVE(dude->legs.lKneeDirection, downVect); + VMOVE(dude->legs.rKneeDirection, downVect); + VMOVE(dude->legs.lFootDirection, forwardVect); + VMOVE(dude->legs.rFootDirection, forwardVect); + break; + case 3: + bu_log("Making arms out (standing)\n"); + VMOVE(dude->arms.lArmDirection, leftVect); + VMOVE(dude->arms.rArmDirection, rightVect); + VMOVE(dude->arms.lElbowDirection, leftVect); + VMOVE(dude->arms.rElbowDirection, rightVect); + VMOVE(dude->arms.lWristDirection, leftVect); + VMOVE(dude->arms.rWristDirection, rightVect); + VMOVE(dude->legs.lLegDirection, downVect); + VMOVE(dude->legs.rLegDirection, downVect); + VMOVE(dude->legs.lKneeDirection, downVect); + VMOVE(dude->legs.rKneeDirection, downVect); + VMOVE(dude->legs.lFootDirection, forwardVect); + VMOVE(dude->legs.rFootDirection, forwardVect); + break; + case 4: + bu_log("Making the Letterman\n"); + vect_t larm4, rarm4, knee4, lleg4; + VSET(larm4, -32, 135, 0); + VSET(rarm4, 32, 135, 0); + VSET(knee4, 90, 5, 0); VSET(lleg4, 0, 75, 0); + VMOVE(dude->arms.lArmDirection, larm4); + VMOVE(dude->arms.rArmDirection, rarm4); + VMOVE(dude->arms.lElbowDirection, larm4); + VMOVE(dude->arms.rElbowDirection, rarm4); + VMOVE(dude->arms.lWristDirection, larm4); + VMOVE(dude->arms.rWristDirection, rarm4); + VMOVE(dude->legs.lLegDirection, lleg4); + VMOVE(dude->legs.rLegDirection, forwardVect); + VMOVE(dude->legs.lKneeDirection, knee4); + VMOVE(dude->legs.rKneeDirection, downVect); + VMOVE(dude->legs.lFootDirection, forwardVect); + VMOVE(dude->legs.rFootDirection, forwardVect); + break; + case 5: + bu_log("Making the Captain\n"); + vect_t larm5, rarm5, llower5, rlower5; + vect_t rthigh5; + VSET(larm5, 45, 180, 5); + VSET(rarm5, -45, 180, -5); + VSET(llower5, -45, 180, 5); + VSET(rlower5, 45, 180, -5); + VSET(rthigh5, 0, 85, 0); + VMOVE(dude->arms.lArmDirection, larm5); + VMOVE(dude->arms.lElbowDirection, llower5); + VMOVE(dude->arms.rArmDirection, rarm5); + VMOVE(dude->arms.rElbowDirection, rlower5); + VMOVE(dude->arms.lWristDirection, downVect); + VMOVE(dude->arms.rWristDirection, downVect); + VMOVE(dude->legs.lLegDirection, downVect); + VMOVE(dude->legs.rLegDirection, rthigh5); + VMOVE(dude->legs.lKneeDirection, downVect); + VMOVE(dude->legs.rKneeDirection, downVect); + VMOVE(dude->legs.lFootDirection, forwardVect); + VMOVE(dude->legs.rFootDirection, forwardVect); + break; + case 6: + bu_log("Making the Thinker\n"); + break; + + /*Following cases are tests */ + case 10: + bu_log("Test1 15 degree incs\n"); + vect_t test1; + vect_t test2; + vect_t test3; + vect_t test4; + vect_t test5; + VSET(test1, 0, 0, 0); + VSET(test2, 0, 15, 0); + VSET(test3, 0, 30, 0); + VSET(test4, 0, 60, 0); + VSET(test5, 0, 90, 0); + VMOVE(dude->arms.lArmDirection, test1); + VMOVE(dude->arms.lElbowDirection, test1); + VMOVE(dude->arms.rArmDirection, test2); + VMOVE(dude->arms.rElbowDirection, test2); + VMOVE(dude->arms.lWristDirection, test1); + VMOVE(dude->arms.rWristDirection, test2); + VMOVE(dude->legs.lLegDirection, test3); + VMOVE(dude->legs.rLegDirection, test4); + VMOVE(dude->legs.lKneeDirection, test3); + VMOVE(dude->legs.rKneeDirection, test4); + VMOVE(dude->legs.lFootDirection, test5); + VMOVE(dude->legs.rFootDirection, test5); + break; + + /* Additional Positions go here*/ + + case 999: + /* interactive position-setter-thingermajiger */ + manualPosition(dude); + break; + default: + bu_log("Bad Input, defaulting to Stand\n"); + VMOVE(dude->arms.lArmDirection, downVect); + VMOVE(dude->arms.rArmDirection, downVect); + VMOVE(dude->arms.lElbowDirection, downVect); + VMOVE(dude->arms.rElbowDirection, downVect); + VMOVE(dude->arms.lWristDirection, downVect); + VMOVE(dude->arms.rWristDirection, downVect); + VMOVE(dude->legs.lLegDirection, downVect); + VMOVE(dude->legs.rLegDirection, downVect); + VMOVE(dude->legs.lKneeDirection, downVect); + VMOVE(dude->legs.rKneeDirection, downVect); + VMOVE(dude->legs.lFootDirection, forwardVect); + VMOVE(dude->legs.rFootDirection, forwardVect); + break; + } + bu_log("Exiting stance maker\n"); +} + +/** + * Auto Set all data for all parts, in inches + */ +void Auto(struct human_data_t *dude) +{ + dude->torso.torsoLength = 0; + dude->head.headSize = (dude->height / 8) * IN2MM; + dude->arms.armLength = (dude->height / 2) * IN2MM; + dude->legs.legLength = ((dude->height * 4) / 8) * IN2MM; + dude->torso.torsoLength = ((dude->height * 3) / 8) * IN2MM; + dude->torso.topTorsoLength = (dude->torso.torsoLength *5) / 8; + dude->torso.lowTorsoLength = (dude->torso.torsoLength *3) / 8; + dude->torso.shoulderWidth = (dude->height / 8) *IN2MM; + dude->torso.abWidth=(dude->height / 9) * IN2MM; + dude->torso.pelvisWidth=(dude->height / 8) * IN2MM; + dude->legs.thighLength = dude->legs.legLength / 2; + dude->legs.calfLength = dude->legs.legLength / 2; + dude->legs.thighWidth = dude->legs.thighLength / 5; + dude->legs.kneeWidth = dude->legs.thighLength / 6; + dude->legs.ankleWidth = dude->legs.calfLength / 8; + dude->arms.upperArmWidth = dude->arms.armLength / 12; + dude->arms.elbowWidth = dude->arms.armLength / 13; + dude->arms.wristWidth = dude->arms.armLength / 15; + dude->legs.footLength = dude->legs.ankleWidth * 3; + dude->legs.toeWidth = dude->legs.ankleWidth * 1.2; + dude->arms.handLength = (dude->height / 16) * IN2MM; + dude->arms.handWidth = (dude->height / 32) * IN2MM; + dude->arms.upperArmLength = (dude->height / 4.5) * IN2MM; + dude->arms.lowerArmLength = (dude->height / 4.5) * IN2MM; + dude->head.neckWidth = dude->head.headSize / 4; +} + +/** + * Manually Set all data for all parts, in inches + */ +void Manual(struct human_data_t *dude) +{ + fastf_t x=0; /*Variable to be used for all input */ + bu_log("Manual Size Mode. All data to be entered is in inches\n"); + bu_log("HeadSize, radius\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->head.headSize=x; + bu_log("NeckLength\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->head.neckLength=x; + bu_log("NeckWidth, radius\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->head.neckWidth=x; + bu_log("Top Torso Length\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->torso.topTorsoLength=x; + bu_log("Shoulder Width\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->torso.shoulderWidth=x; + bu_log("Low Torso Length\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->torso.lowTorsoLength=x; + bu_log("Ab Width\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->torso.abWidth=x; + bu_log("Pelvis Width\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->torso.pelvisWidth=x; + bu_log("Upper Arm Length\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->arms.upperArmLength=x; + bu_log("Upper Arm Width\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->arms.upperArmWidth=x; + bu_log("Lower Arm Length\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->arms.lowerArmLength=x; + bu_log("Elbow Width, radius\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->arms.elbowWidth=x; + bu_log("Wrist Width, radius\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->arms.wristWidth=x; + bu_log("Hand Length\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->arms.handLength=x; + bu_log("Hand Width\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->arms.handWidth=x; + bu_log("Thigh Length\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->legs.thighLength=x; + bu_log("Thigh Width, radius\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->legs.thighWidth=x; + bu_log("Knee Width, radius\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->legs.kneeWidth=x; + bu_log("Calf Length\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->legs.calfLength=x; + bu_log("Ankle Width, radius\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->legs.ankleWidth=x; + bu_log("Foot Length\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->legs.footLength=x; + bu_log("Toe Width, radius\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->legs.toeWidth=x; + + dude->torso.torsoLength= dude->torso.topTorsoLength + dude->torso.lowTorsoLength; + dude->arms.armLength=dude->arms.upperArmLength + dude->arms.lowerArmLength + dude->arms.handLength; + dude->legs.legLength=dude->legs.thighLength + dude->legs.calfLength; + dude->height=0; + + dude->height=(dude->torso.torsoLength/IN2MM + dude->legs.legLength/IN2MM + dude->head.headSize/IN2MM); + + bu_log("Headsize=%lf\n", dude->head.headSize); + bu_log("Neck Length=%lf\n", dude->head.neckLength); + bu_log("Neck Width=%lf\n", dude->head.neckWidth); + + bu_log("Top Torso=%lf\n", dude->torso.topTorsoLength); + bu_log("Low Torso=%lf\n", dude->torso.lowTorsoLength); + bu_log("Shoulders=%lf\n", dude->torso.shoulderWidth); + bu_log("Abs=%lf\n", dude->torso.abWidth); + bu_log("Pelvis=%lf\n", dude->torso.pelvisWidth); + bu_log("Torso Length=%lf\n", dude->torso.torsoLength); + + bu_log("Upper Arm Width=%lf\n", dude->arms.upperArmWidth); + bu_log("Upper Arm Length=%lf\n", dude->arms.upperArmLength); + bu_log("Lower Arm Length=%lf\n", dude->arms.lowerArmLength); + bu_log("Elbow Width=%lf\n", dude->arms.elbowWidth); + bu_log("Wrist Width=%lf\n", dude->arms.wristWidth); + bu_log("Hand Length=%lf\n", dude->arms.handLength); + bu_log("Hand Width=%lf\n", dude->arms.handWidth); + bu_log("Arm Length=%lf\n", dude->arms.armLength); + + bu_log("Thigh Length=%lf\n", dude->legs.thighLength); + bu_log("Thigh Width=%lf\n", dude->legs.thighWidth); + bu_log("Calf Length=%lf\n", dude->legs.calfLength); + bu_log("Knee Width=%lf\n", dude->legs.kneeWidth); + bu_log("Foot Length=%lf\n", dude->legs.footLength); + bu_log("Ankle Width=%lf\n", dude->legs.ankleWidth); + bu_log("Toe Width=%lf\n", dude->legs.toeWidth); + bu_log("Leg Length=%lf\n", dude->legs.legLength); + bu_log("Height=%lf\n", dude->height); +} + +/** + * Goes through the human struct and sets all measurements to needed measurements, + * i.e. if certain percentile person is needed, those measurements are set. + */ +void setMeasurements(struct human_data_t *dude, fastf_t percentile) +{ + /* If percentile, load data from database or something */ + + /* Standing height from this point on will be derived from gathered values + * so it will be a combination of leglength, torsolength, and headsize. So standing + * height itself is now mostly irrelevant + */ + bu_log("Setting %.0f percentile data\n", percentile); + +/* Find a method of database storage first, then apply those values to here */ +/* + dude->head.headSize= + dude->head.neckLength= + dude->head.neckWidth= + + dude->torso.topTorsoLength= + dude->torso.lowTorsoLength= + dude->torso.shoulderWidth= + dude->torso.abWidth= + dude->torso.pelvisWidth= + dude->torso.torsoLength= dude->torso.topTorsoLength + dude->torso.lowTorsoLength; + + dude->arms.upperArmWidth= + dude->arms.upperArmLength= + dude->arms.lowerArmLength= + dude->arms.elbowWidth= + dude->arms.wristWidth= + dude->arms.handLength= + dude->arms.handWidth= + dude->arms.armLength=dude->arms.upperArmLength + dude->arms.lowerArmLength + dude->arms.handLength; + + dude->legs.thighLength= + dude->legs.thighWidth= + dude->legs.calfLength= + dude->legs.kneeWidth= + dude->legs.footLength= + dude->legs.ankleWidth= + dude->legs.toeWidth= + dude->legs.legLength=dude->legs.thighLength + dude->legs.calfLength; + + dude.height=(dude->torso.torsoLength + dude->legs.legLength + dude->head.headSize); +*/ +} + +/** + * Help message printed when -h/-? option is supplied + */ +void show_help(const char *name, const char *optstr) +{ + struct bu_vls str; + const char *cp = optstr; + + bu_vls_init(&str); + while (cp && *cp != '\0') { + if (*cp == ':') { + cp++; + continue; + } + bu_vls_strncat(&str, cp, 1); + cp++; + } + + bu_log("usage: %s [%s]\n", name, bu_vls_addr(&str)); + bu_log("options:\n" + "\t-h\t\tShow help\n" + "\t-?\t\tShow help\n" + "\t-A\t\tAutoMake defaults\n" + "\t-m\t\tManual sizing mode\n" + "\t-H\t\tSet Height in inches\n" + "\t-L\t\tSet Center Point in inches, at feet (default 0 0 0)\n" + "\t-o\t\tSet output file name\n" + "\t-b\t\tShow bounding Boxes\n" + "\t-n\t\tSet bounding region name, default Body.c\n" + "\t-N\t\tNumber to make (square)\n" + "\t-s\t\tStance to take 0-Stand 1-Sit 2-Drive 3-Arms out 4-Letterman 5-Captain 999-Custom\n" + "\t-p\t\tSet Percentile (not implemented yet) 1-99\n" + "\t 1 - 9, 0, Q, and special characters are used for wizard purposes\n" + ); + + bu_vls_free(&str); + return; +} + +void getLocation(fastf_t *location) +{ + fastf_t x, y, z; + bu_log("Enter center point\n"); + bu_log("X: "); + scanf("%lf", &x); + bu_log("Y: "); + scanf("%lf", &y); + bu_log("Z: "); + scanf("%lf", &z); + x*= IN2MM; + y*= IN2MM; + z*= IN2MM; + VSET(location, x, y, z); + fflush(stdin); +} + +/* Process command line arguments */ +int read_args(int argc, char **argv, struct human_data_t *dude, fastf_t *percentile, fastf_t *location, fastf_t *stance, fastf_t *troops, fastf_t *showBoxes) +{ + char c = 'A'; + char *options="AbH:hLlmn:N:O:o:p:s:w1:2:3:4:5:6:7:8:9:0:=:+:_:*:^:%:$:#:@:!:Q:~:"; + float height=0; + int soldiers=0; + int pose=0; + int percent=50; + fastf_t x = 0; + + /* don't report errors */ + bu_opterr = 0; + + while ((c=bu_getopt(argc, argv, options)) != EOF) { + /*bu_log("%c \n", c); Testing to see if args are getting read */ + switch (c) { + case 'A': + bu_log("AutoMode, making 50 percentile man\n"); + dude->height = DEFAULT_HEIGHT_INCHES; + *percentile=50; + Auto(dude); + fflush(stdin); + break; + + case 'b': + *showBoxes = 1; + bu_log("Drawing bounding boxes\n"); + fflush(stdin); + break; + + case 'H': + sscanf(bu_optarg, "%f", &height); + if(height <= 0.0) + { + bu_log("Impossible height, setting default height!\n"); + height = DEFAULT_HEIGHT_INCHES; + dude->height = DEFAULT_HEIGHT_INCHES; + bu_log("%.2f = height in inches\n", height); + } + else + { + dude->height = height; + bu_log("%.2f = height in inches\n", height); + } + fflush(stdin); + break; + + case 'h': + case '?': + show_help(*argv, options); + bu_exit(EXIT_SUCCESS, NULL); + fflush(stdin); + break; + + case 'L': + case 'l': + bu_log("Location\n"); + getLocation(location); + fflush(stdin); + break; + + case 'm': + bu_log("Manual Mode\n"); + Manual(dude); + break; + + case 'n': + memset(humanName, 0, MAXLENGTH); + bu_strlcpy(humanName, bu_optarg, MAXLENGTH); + fflush(stdin); + break; + + case 'N': + sscanf(bu_optarg, "%d", &soldiers); + if(soldiers <= 1){ + bu_log("Only 1 person. Making 16\n"); + soldiers = 4; + } + bu_log("Auto %d (squared) troop formation\n", soldiers); + *troops = (float)soldiers; + fflush(stdin); + break; + + case 'o': + case 'O': + memset(filename, 0, MAXLENGTH); + bu_strlcpy(filename, bu_optarg, MAXLENGTH); + fflush(stdin); + break; + + case 'p': + sscanf(bu_optarg, "%d", &percent); + if(percent < 1) + percent=1; + if(percent > 99) + percent=99; + *percentile=percent; + fflush(stdin); + break; + + case 's': + sscanf(bu_optarg, "%d", &pose); + if(pose < 0) + pose = 0; + *stance = (float)pose; + fflush(stdin); + break; + + /* These following arguments are for the wizard program, allowing easy access to each variable. + * as they will only be callable by using a number (eg 1 = head, 2=neck width, 3=neck height etc) + * and should not be called otherwise + */ + case '1': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->head.headSize = x; + break; + case '2': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->head.neckLength = x; + break; + case '3': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->head.neckWidth = x; + break; + case '4': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->torso.topTorsoLength=x; + break; + case '5': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->torso.lowTorsoLength=x; + dude->torso.torsoLength = dude->torso.topTorsoLength + dude->torso.lowTorsoLength; + break; + case '6': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->torso.shoulderWidth=x; + break; + case '7': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->torso.abWidth=x; + break; + case '8': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->torso.pelvisWidth=x; + break; + case '9': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->arms.upperArmWidth=x; + break; + case '0': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->arms.upperArmLength=x; + break; + case '=': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->arms.lowerArmLength=x; + break; + case '+': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->arms.elbowWidth=x; + break; + case '_': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->arms.wristWidth=x; + break; + case 'Q': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->arms.handLength=x; + dude->arms.armLength=dude->arms.upperArmLength + dude->arms.lowerArmLength + dude->arms.handLength; + break; + case '~': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->arms.handWidth=x; + break; + case '*': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->legs.thighLength=x; + break; + case '!': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->legs.thighWidth=x; + break; + case '^': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->legs.calfLength=x; + dude->legs.legLength = dude->legs.thighLength + dude->legs.calfLength; + break; + case '%': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->legs.kneeWidth=x; + break; + case '$': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->legs.footLength=x; + break; + case '#': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->legs.ankleWidth=x; + break; + case '@': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->legs.toeWidth=x; + break; + + default: + show_help(*argv, options); + bu_log("%s: illegal option -- %c\n", bu_getprogname(), c); + bu_exit(EXIT_SUCCESS, NULL); + fflush(stdin); + break; + } + dude->height = (dude->legs.legLength + dude->torso.torsoLength + dude->head.headSize) / IN2MM; + } + fflush(stdout); + return(bu_optind); +} + +int +ged_human(struct ged *gedp, int ac, char *av[]) +{ + struct rt_wdb *db_fp; + struct wmember human; + struct wmember boxes; + struct wmember hollow; + struct wmember crowd; + progname = *av; + struct bu_vls name; + struct bu_vls str; + struct human_data_t human_data; + human_data.height = DEFAULT_HEIGHT_INCHES; + fastf_t showBoxes = 0, troops = 0, stance = 0, percentile=50; + char suffix[MAXLENGTH]= ""; + point_t location; + VSET(location, 0, 0, 0); /* Default standing location */ + bu_vls_init(&name); + bu_vls_trunc(&name, 0); + bu_vls_init(&str); + bu_vls_trunc(&str, 0); + int ret; + + GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR); + GED_CHECK_READ_ONLY(gedp, GED_ERROR); + + /* Process command line arguments */ + ret = read_args(ac, av, &human_data, &percentile, location, &stance, &troops, &showBoxes); + + if (ret != GED_OK) { + bu_vls_free(&name); + bu_vls_free(&str); + return ret; + } + + GED_CHECK_EXISTS(gedp, bu_vls_addr(&name), LOOKUP_QUIET, GED_ERROR); + + db_fp = wdb_fopen(filename); + + bu_log("Center Location: "); + bu_log("%.2f %.2f %.2f\n", location[X], location[Y], location[Z]); + +/******MAGIC******/ +/*Magically set pose, and apply pose to human geometry*/ + //setMeasurements(&human_data, percentile); + setStance(stance, &human_data); + if(!troops){ + makeBody(db_fp, suffix, &human_data, location, showBoxes); + mk_id_units(db_fp, "A single Human", "in"); + } + if(troops){ + makeArmy(db_fp, human_data, troops, showBoxes); + mk_id_units(db_fp, "An army of people", "in"); + } +/****End Magic****/ + +/** Make the Regions (.r's) of the body */ +/* Make the .r for the real body */ + int is_region = 0; + unsigned char rgb[3], rgb2[3], rgb3[3]; + bu_log("Building Regions\n"); + if(!troops){ + BU_LIST_INIT(&human.l); + (void)mk_addmember("Head.s", &human.l, NULL, WMOP_UNION); + (void)mk_addmember("Neck.s", &human.l, NULL, WMOP_UNION); + (void)mk_addmember("UpperTorso.s", &human.l, NULL, WMOP_UNION); + (void)mk_addmember("LowerTorso.s", &human.l, NULL, WMOP_UNION); + (void)mk_addmember("LeftUpperArm.s", &human.l, NULL, WMOP_UNION); + (void)mk_addmember("RightUpperArm.s", &human.l, NULL, WMOP_UNION); + (void)mk_addmember("LeftShoulderJoint.s", &huma... [truncated message content] |
From: <d_r...@us...> - 2009-08-19 08:03:40
|
Revision: 35621 http://brlcad.svn.sourceforge.net/brlcad/?rev=35621&view=rev Author: d_rossberg Date: 2009-08-19 08:03:32 +0000 (Wed, 19 Aug 2009) Log Message: ----------- replaced c99 idiom with c89 compatible one (all declarations have to be on top of a block) Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-18 23:48:27 UTC (rev 35620) +++ brlcad/trunk/src/libged/human.c 2009-08-19 08:03:32 UTC (rev 35621) @@ -225,10 +225,12 @@ vect_t vects[8]; vect_t newVects[8]; point_t finalPoints[8]; + point_t endPoint; vect_t distance; char newName[MAXLENGTH] = "a"; char debug[MAXLENGTH] = "a"; int i = 0; + int w=0; bu_strlcpy(newName, name, MAXLENGTH); bu_strlcpy(debug, name, MAXLENGTH); bu_strlcat(newName, "Box", MAXLENGTH); @@ -252,7 +254,6 @@ } /* Print rotation matrix */ - int w=0; for(w=1; w<=16; w++){ /*Z rotation matrix */ /* if(w==1 || w==2 || w== 5 || w== 6 || w==11) @@ -280,7 +281,6 @@ */ VEC3X3MAT(newVects[i], vects[i], rotMatrix); } - point_t endPoint; MAT4X3PNT(endPoint, rotMatrix, startPoint); /* Set points to be at end of each vector */ @@ -332,14 +332,14 @@ { fastf_t head = dude->head.headSize / 2; vect_t startVector, lengthVector; + point_t headFix; + mat_t rotMatrix; /*Length vector is just the diameter of the head, currently*/ VSET(lengthVector, 0, 0, dude->head.headSize); VSET(startVector, 0, 0, 0); - mat_t rotMatrix; setDirection(startVector, dude->head.headVector, rotMatrix, direction[X], direction[Y], direction[Z]); mk_sph(file, name, dude->joints.headJoint, head); - point_t headFix; VSET(headFix, dude->joints.headJoint[X], dude->joints.headJoint[Y], dude->joints.headJoint[Z]+head); if(showBoxes){ @@ -431,18 +431,18 @@ fastf_t makeShoulderJoint(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) { vect_t startVector, lengthVector; + point_t leftFix, rightFix; + fastf_t shoulder; + mat_t rotMatrix; VSET(startVector, 0, 0, dude->arms.upperArmWidth*2); VSET(lengthVector, 0, 0, dude->arms.upperArmWidth); - mat_t rotMatrix; - fastf_t shoulder = dude->arms.upperArmWidth; + shoulder = dude->arms.upperArmWidth; if(isLeft) mk_sph(file, name, dude->joints.leftShoulderJoint, (dude->arms.upperArmWidth)); else mk_sph(file, name, dude->joints.rightShoulderJoint, (dude->arms.upperArmWidth)); - point_t leftFix, rightFix; - if(showBoxes){ if(isLeft){ setDirection(startVector, lengthVector, rotMatrix, dude->arms.lArmDirection[X], dude->arms.lArmDirection[Y], dude->arms.lArmDirection[Z]); @@ -589,8 +589,8 @@ fastf_t makeThigh(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) { vect_t startVector; + mat_t rotMatrix; VSET(startVector, 0, 0, dude->legs.thighLength); - mat_t rotMatrix; if(isLeft){ setDirection(startVector, dude->legs.thighVector, rotMatrix, dude->legs.lLegDirection[X], dude->legs.lLegDirection[Y], dude->legs.lLegDirection[Z]); @@ -807,8 +807,8 @@ */ void makeBody(struct rt_wdb (*file), char *suffix, struct human_data_t *dude, fastf_t *location, fastf_t showBoxes) { + vect_t direction; bu_log("Making Body\n"); - vect_t direction; /* * Make sure that vectors, points, and widths are sent to each function * for direction, location, and correct sizing, respectivly. @@ -850,13 +850,13 @@ void makeArmy(struct rt_wdb (*file), struct human_data_t dude, int number, fastf_t showBoxes) { point_t locations; - VSET(locations, 0, 0, 0); /* Starting location */ int x = 0; int y = 0; int num; char testname[10]={'0'}; + char suffix[MAXLENGTH]; + VSET(locations, 0, 0, 0); /* Starting location */ num = 0.0; - char suffix[MAXLENGTH]; for(x = 0; x<number; x++){ for(y=0; y<number; y++){ @@ -1020,9 +1020,9 @@ VMOVE(dude->legs.lFootDirection, forwardVect); VMOVE(dude->legs.rFootDirection, forwardVect); break; - case 4: + case 4: { + vect_t larm4, rarm4, knee4, lleg4; bu_log("Making the Letterman\n"); - vect_t larm4, rarm4, knee4, lleg4; VSET(larm4, -32, 135, 0); VSET(rarm4, 32, 135, 0); VSET(knee4, 90, 5, 0); VSET(lleg4, 0, 75, 0); @@ -1038,11 +1038,12 @@ VMOVE(dude->legs.rKneeDirection, downVect); VMOVE(dude->legs.lFootDirection, forwardVect); VMOVE(dude->legs.rFootDirection, forwardVect); + } break; - case 5: - bu_log("Making the Captain\n"); + case 5: { vect_t larm5, rarm5, llower5, rlower5; vect_t rthigh5; + bu_log("Making the Captain\n"); VSET(larm5, 45, 180, 5); VSET(rarm5, -45, 180, -5); VSET(llower5, -45, 180, 5); @@ -1060,19 +1061,20 @@ VMOVE(dude->legs.rKneeDirection, downVect); VMOVE(dude->legs.lFootDirection, forwardVect); VMOVE(dude->legs.rFootDirection, forwardVect); + } break; case 6: bu_log("Making the Thinker\n"); break; /*Following cases are tests */ - case 10: - bu_log("Test1 15 degree incs\n"); + case 10: { vect_t test1; vect_t test2; vect_t test3; vect_t test4; vect_t test5; + bu_log("Test1 15 degree incs\n"); VSET(test1, 0, 0, 0); VSET(test2, 0, 15, 0); VSET(test3, 0, 30, 0); @@ -1090,6 +1092,7 @@ VMOVE(dude->legs.rKneeDirection, test4); VMOVE(dude->legs.lFootDirection, test5); VMOVE(dude->legs.rFootDirection, test5); + } break; /* Additional Positions go here*/ @@ -1636,20 +1639,22 @@ struct wmember boxes; struct wmember hollow; struct wmember crowd; - progname = *av; struct bu_vls name; struct bu_vls str; struct human_data_t human_data; - human_data.height = DEFAULT_HEIGHT_INCHES; fastf_t showBoxes = 0, troops = 0, stance = 0, percentile=50; char suffix[MAXLENGTH]= ""; point_t location; + int ret; + int is_region = 0; + unsigned char rgb[3], rgb2[3], rgb3[3]; + progname = *av; + human_data.height = DEFAULT_HEIGHT_INCHES; VSET(location, 0, 0, 0); /* Default standing location */ bu_vls_init(&name); bu_vls_trunc(&name, 0); bu_vls_init(&str); bu_vls_trunc(&str, 0); - int ret; GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR); GED_CHECK_READ_ONLY(gedp, GED_ERROR); @@ -1686,8 +1691,6 @@ /** Make the Regions (.r's) of the body */ /* Make the .r for the real body */ - int is_region = 0; - unsigned char rgb[3], rgb2[3], rgb3[3]; bu_log("Building Regions\n"); if(!troops){ BU_LIST_INIT(&human.l); @@ -1838,7 +1841,6 @@ } } if(troops){ - bu_log("Naming\n"); /*Build body regions for each troop*/ /*append number to end of part name, (Head.s0, LeftElbowJoint.s99, etc) */ int num=0; @@ -1846,6 +1848,10 @@ int x=0; char holder[10]={'0'}; char suffix[MAXLENGTH]; + int z=0; + char thing[10]="0"; + char thing2[10]="0"; + bu_log("Naming\n"); for(w=0; w<(troops*troops); w++){ char names[MAXLENGTH][MAXLENGTH]={"Head.s", "Neck.s", "UpperTorso.s","LowerTorso.s", "LeftShoulderJoint.s","LeftUpperArm.s","LeftElbowJoint.s", @@ -1908,9 +1914,6 @@ num++; } is_region = 0; - int z=0; - char thing[10]="0"; - char thing2[10]="0"; for(z=0; z<(troops*troops); z++){ char comber[MAXLENGTH]="Body.r"; sprintf(thing, "%d", z); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-20 13:49:16
|
Revision: 35653 http://brlcad.svn.sourceforge.net/brlcad/?rev=35653&view=rev Author: irpguardian Date: 2009-08-20 13:49:09 +0000 (Thu, 20 Aug 2009) Log Message: ----------- Made human.c not open a database anymore. Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-20 13:27:39 UTC (rev 35652) +++ brlcad/trunk/src/libged/human.c 2009-08-20 13:49:09 UTC (rev 35653) @@ -1699,8 +1699,6 @@ GED_CHECK_EXISTS(gedp, bu_vls_addr(&name), LOOKUP_QUIET, GED_ERROR); - gedp->ged_wdbp = wdb_fopen(filename); - bu_log("Center Location: "); bu_log("%.2f %.2f %.2f\n", location[X], location[Y], location[Z]); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-20 20:44:00
|
Revision: 35669 http://brlcad.svn.sourceforge.net/brlcad/?rev=35669&view=rev Author: irpguardian Date: 2009-08-20 20:43:53 +0000 (Thu, 20 Aug 2009) Log Message: ----------- Changed some logic in regards to more than 1 model being created. Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-20 20:38:05 UTC (rev 35668) +++ brlcad/trunk/src/libged/human.c 2009-08-20 20:43:53 UTC (rev 35669) @@ -1709,12 +1709,11 @@ memset(humanName, 0, MAXLENGTH); bu_strlcpy(humanName, topLevel, MAXLENGTH); setStance(stance, &human_data); - if(!troops){ - Auto(&human_data); + if(troops <= 1){ makeBody(gedp->ged_wdbp, suffix, &human_data, location, showBoxes); mk_id_units(gedp->ged_wdbp, "A single Human", "in"); } - if(troops){ + if(troops > 1){ makeArmy(gedp->ged_wdbp, human_data, troops, showBoxes); mk_id_units(gedp->ged_wdbp, "An army of people", "in"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-21 14:17:47
|
Revision: 35674 http://brlcad.svn.sourceforge.net/brlcad/?rev=35674&view=rev Author: irpguardian Date: 2009-08-21 14:17:21 +0000 (Fri, 21 Aug 2009) Log Message: ----------- Added textfile dump of bounding boxes in human.c, accessable by using '-t' Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-21 04:11:11 UTC (rev 35673) +++ brlcad/trunk/src/libged/human.c 2009-08-21 14:17:21 UTC (rev 35674) @@ -85,8 +85,11 @@ fastf_t torsoLength; fastf_t topTorsoLength, lowTorsoLength; fastf_t shoulderWidth; + fastf_t topTorsoDepth; fastf_t abWidth; + fastf_t abDepth; fastf_t pelvisWidth; + fastf_t pelvisDepth; vect_t topTorsoVector; vect_t lowTorsoVector; @@ -383,9 +386,9 @@ VADD2(dude->joints.rightShoulderJoint, dude->joints.neckJoint, rightVector); /*Take shoulder width, and abWidth and convert values to vectors for tgc */ - VSET(a, (dude->torso.shoulderWidth/2), 0, 0); + VSET(a, (dude->torso.topTorsoDepth), 0, 0); VSET(b, 0, dude->torso.shoulderWidth, 0); - VSET(c, (dude->torso.abWidth/2), 0, 0); + VSET(c, (dude->torso.abDepth), 0, 0); VSET(d, 0, (dude->torso.abWidth), 0); /* Torso will be an ellipsoidal tgc, for more realistic shape */ @@ -413,9 +416,9 @@ VADD2(dude->joints.leftThighJoint, dude->joints.pelvisJoint, leftVector); VADD2(dude->joints.rightThighJoint, dude->joints.pelvisJoint, rightVector); - VSET(a, (dude->torso.abWidth/2), 0, 0); + VSET(a, (dude->torso.abDepth), 0, 0); VSET(b, 0, dude->torso.abWidth, 0); - VSET(c, (dude->torso.pelvisWidth/2), 0, 0); + VSET(c, (dude->torso.pelvisDepth), 0, 0); VSET(d, 0, dude->torso.pelvisWidth, 0); mk_tgc(file, name, dude->joints.abdomenJoint, dude->torso.lowTorsoVector, a, b, c, d); @@ -1134,8 +1137,11 @@ dude->torso.topTorsoLength = (dude->torso.torsoLength *5) / 8; dude->torso.lowTorsoLength = (dude->torso.torsoLength *3) / 8; dude->torso.shoulderWidth = (dude->height / 8) *IN2MM; + dude->torso.topTorsoDepth = dude->torso.shoulderWidth/2; dude->torso.abWidth=(dude->height / 9) * IN2MM; - dude->torso.pelvisWidth=(dude->height / 8) * IN2MM; + dude->torso.abDepth = dude->torso.abWidth / 2; + dude->torso.pelvisWidth=(dude->height / 8) * IN2MM; + dude->torso.pelvisDepth = dude->torso.pelvisWidth/2; dude->legs.thighLength = dude->legs.legLength / 2; dude->legs.calfLength = dude->legs.legLength / 2; dude->legs.thighWidth = dude->legs.thighLength / 5; @@ -1176,22 +1182,42 @@ scanf("%lf", &x); x=x*IN2MM; dude->torso.topTorsoLength=x; + bu_log("Shoulder Width\n"); scanf("%lf", &x); - x=x*IN2MM; + x=x*IN2MM; dude->torso.shoulderWidth=x; + + bu_log("upperTorsoDepth\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->torso.topTorsoDepth=x; + bu_log("Low Torso Length\n"); scanf("%lf", &x); x=x*IN2MM; dude->torso.lowTorsoLength=x; + bu_log("Ab Width\n"); scanf("%lf", &x); x=x*IN2MM; dude->torso.abWidth=x; + + bu_log("Ab Depth\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->torso.abDepth=x; + bu_log("Pelvis Width\n"); scanf("%lf", &x); x=x*IN2MM; dude->torso.pelvisWidth=x; + + bu_log("Pelvis Depth\n"); + scanf("%lf", &x); + x=x*IN2MM; + dude->torso.pelvisDepth=x; + bu_log("Upper Arm Length\n"); scanf("%lf", &x); x=x*IN2MM; @@ -1368,7 +1394,7 @@ "\t-N\t\tNumber to make (square)\n" "\t-s\t\tStance to take 0-Stand 1-Sit 2-Drive 3-Arms out 4-Letterman 5-Captain 999-Custom\n" "\t-p\t\tSet Percentile (not implemented yet) 1-99\n" - "\t 1 - 9, 0, Q, and special characters are used for wizard purposes\n" + "\t 1 - 9, 0, Q, and special characters are used for wizard purposes, ignore them.\n" ); bu_vls_free(&str); @@ -1393,16 +1419,17 @@ } /* Process command line arguments */ -int read_args(int argc, char **argv, char *topLevel, struct human_data_t *dude, fastf_t *percentile, fastf_t *location, fastf_t *stance, fastf_t *troops, fastf_t *showBoxes) +int read_args(int argc, char **argv, char *topLevel, struct human_data_t *dude, fastf_t *percentile, fastf_t *location, fastf_t *stance, fastf_t *troops, int *text, fastf_t *showBoxes) { char c = 'A'; - char *options="AbH:hLlmn:N:O:o:p:s:w1:2:3:4:5:6:7:8:9:0:=:+:_:*:^:%:$:#:@:!:Q:~:"; + char *options="AbH:hLlmn:N:O:o:p:s:tw1:2:3:4:5:6:7:8:9:0:=:+:_:*:^:%:$:#:@:!:Q:~:"; float height=0; int soldiers=0; int pose=0; int percent=50; fastf_t x = 0; int have_name = 0; + int textdump = 0; /* don't report errors */ bu_opterr = 0; @@ -1504,6 +1531,12 @@ fflush(stdin); break; + /*Output a text file with height x width x depth sizes for bounding boxes. */ + case 't': + textdump = 1; + break; + + /* These following arguments are for the wizard program, allowing easy access to each variable. * as they will only be callable by using a number (eg 1 = head, 2=neck width, 3=neck height etc) * and should not be called otherwise @@ -1653,10 +1686,132 @@ show_help(*argv, options); return GED_ERROR; } + *text = textdump; fflush(stdout); return(bu_optind); } +/** + * the text function takes the dimentions of each region on the body, and finds the measurements for each bounding box to be ouput + * to a text file. All dimentions are in mm, because it seems everyone just /loves/ millimeters for analytical purposes. + * Hard Coded to dump out everything. + */ +void text(struct human_data_t *dude) +{ + bu_log("Ouputting text file\n"); + fastf_t x=0, y=0, z=0; + + FILE *dump; + dump = fopen("Stats.txt", "w+"); + + + fprintf(dump, "Name, X, Y, Z, all in millimeters\n"); + + /*Head*/ + x = dude->head.headSize; + y = x; + z = x; + fprintf(dump, "Head\t\t%lf\t%lf\t%lf\n", x, y, z); + + /*Neck*/ + x = dude->head.neckWidth * 2; + y = x; + z = dude->head.neckLength; + fprintf(dump, "Neck\t\t%lf\t%lf\t%lf\n", x, y, z); + + /*Upper Torso*/ + if(dude->torso.topTorsoDepth > dude->torso.abDepth) + x = dude->torso.topTorsoDepth; + else + x = dude->torso.abDepth; + y = dude->torso.shoulderWidth; + z = dude->torso.topTorsoLength; + fprintf(dump, "UpperTorso\t\t%lf\t%lf\t%lf\n", x, y, z); + + /*Lower Torso*/ + if(dude->torso.abDepth > dude->torso.pelvisDepth) + x = dude->torso.abDepth; + else + x = dude->torso.pelvisDepth; + y = dude->torso.pelvisWidth; + z = dude->torso.lowTorsoLength; + fprintf(dump, "LowerTorso\t\t%lf\t%lf\t%lf\n", x, y, z); + + /*Shoulder*/ + x = dude->arms.upperArmWidth *2; + y = x; + z = y; + fprintf(dump, "ShoulderJoint\t\t%lf\t%lf\t%lf\n", x, y, z); + + /*Upper Arm*/ + x = dude->arms.upperArmWidth *2; + y = x; + z = dude->arms.upperArmLength; + fprintf(dump, "UpperArm\t\t%lf\t%lf\t%lf\n", x, y, z); + + /*Lower Arm*/ + x = dude->arms.elbowWidth * 2; + y = x; + z = dude->arms.lowerArmLength; + fprintf(dump, "LowerArm\t\t%lf\t%lf\t%lf\n", x, y, z); + + /*Elbow*/ + x = dude->arms.elbowWidth *2; + y = x; + z = y; + fprintf(dump, "Elbow\t\t%lf\t%lf\t%lf\n", x, y, z); + + /*Wrist*/ + x = dude->arms.wristWidth *2; + y = x; + z = y; + fprintf(dump, "Wrist\t\t%lf\t%lf\t%lf\n", x, y, z); + + /*Hand*/ + x = dude->arms.handWidth; + y = dude->arms.handWidth; + z = dude->arms.handLength; + fprintf(dump, "Hand\t\t%lf\t%lf\t%lf\n", x, y, z); + + /*Thigh Joint*/ + x = dude->legs.thighWidth*2; + y = x; + z = y; + fprintf(dump, "ThighJoint\t\t%lf\t%lf\t%lf\n", x, y, z); + + /*Thigh*/ + x = dude->legs.thighWidth*2; + y = x; + z = dude->legs.thighLength; + fprintf(dump, "Thigh\t\t%lf\t%lf\t%lf\n", x, y, z); + + /*Knee*/ + x = dude->legs.kneeWidth; + y = x; + z = y; + fprintf(dump, "Knee\t\t%lf\t%lf\t%lf\n", x, y, z); + + /*Calf*/ + x = dude->legs.kneeWidth*2; + y = x; + z = dude->legs.calfLength; + fprintf(dump, "Calf\t\t%lf\t%lf\t%lf\n", x, y, z); + + /*Ankle*/ + x = dude->legs.ankleWidth * 2; + y = x; + z = y; + fprintf(dump, "Ankle\t\t%lf\t%lf\t%lf\n", x, y, z); + + /*Foot*/ + x = dude->legs.footLength; + y = dude->legs.toeWidth * 2; + z = dude->legs.toeWidth * 2; + fprintf(dump, "Foot\t\t%lf\t%lf\t%lf\n", x, y, z); + + fclose(dump); +} + int ged_human(struct ged *gedp, int ac, const char *av[]) { @@ -1678,6 +1833,7 @@ human_data.height = DEFAULT_HEIGHT_INCHES; VSET(location, 0, 0, 0); /* Default standing location */ char topLevel[MAXLENGTH] = ""; + int textDump = 0; bu_vls_init(&name); bu_vls_init(&str); @@ -1686,7 +1842,7 @@ GED_CHECK_READ_ONLY(gedp, GED_ERROR); /* Process command line arguments */ - ret = read_args(ac, av, topLevel, &human_data, &percentile, location, &stance, &troops, &showBoxes); + ret = read_args(ac, av, topLevel, &human_data, &percentile, location, &stance, &troops, &textDump, &showBoxes); // if (ret != GED_OK) { // bu_log("Non GED_OK value\n"); @@ -1712,6 +1868,10 @@ if(troops <= 1){ makeBody(gedp->ged_wdbp, suffix, &human_data, location, showBoxes); mk_id_units(gedp->ged_wdbp, "A single Human", "in"); + + /*This function dumps out a text file of all dimentions of bounding boxes on human model.*/ + if(textDump) + text(&human_data); } if(troops > 1){ makeArmy(gedp->ged_wdbp, human_data, troops, showBoxes); @@ -1957,8 +2117,6 @@ /* Close database */ bu_log("Regions Built\n"); -/* wdb_close(gedp->ged_wdbp); -*/ bu_vls_free(&name); bu_vls_free(&str); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-21 17:18:26
|
Revision: 35675 http://brlcad.svn.sourceforge.net/brlcad/?rev=35675&view=rev Author: irpguardian Date: 2009-08-21 17:18:06 +0000 (Fri, 21 Aug 2009) Log Message: ----------- Added preliminary support for reading in text files for bounding boxes. (-T) Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-21 14:17:21 UTC (rev 35674) +++ brlcad/trunk/src/libged/human.c 2009-08-21 17:18:06 UTC (rev 35675) @@ -1394,6 +1394,8 @@ "\t-N\t\tNumber to make (square)\n" "\t-s\t\tStance to take 0-Stand 1-Sit 2-Drive 3-Arms out 4-Letterman 5-Captain 999-Custom\n" "\t-p\t\tSet Percentile (not implemented yet) 1-99\n" + "\t-t\t\tSave bounding box information to file Stats.txt\n" + "\t-T\t\tRead bounding box information from file Stats.txt\n" "\t 1 - 9, 0, Q, and special characters are used for wizard purposes, ignore them.\n" ); @@ -1419,10 +1421,10 @@ } /* Process command line arguments */ -int read_args(int argc, char **argv, char *topLevel, struct human_data_t *dude, fastf_t *percentile, fastf_t *location, fastf_t *stance, fastf_t *troops, int *text, fastf_t *showBoxes) +int read_args(int argc, char **argv, char *topLevel, struct human_data_t *dude, fastf_t *percentile, fastf_t *location, fastf_t *stance, fastf_t *troops, int *text, int *input, fastf_t *showBoxes) { char c = 'A'; - char *options="AbH:hLlmn:N:O:o:p:s:tw1:2:3:4:5:6:7:8:9:0:=:+:_:*:^:%:$:#:@:!:Q:~:"; + char *options="AbH:hLlmn:N:O:o:p:s:tTw1:2:3:4:5:6:7:8:9:0:=:+:_:*:^:%:$:#:@:!:Q:~:"; float height=0; int soldiers=0; int pose=0; @@ -1430,6 +1432,7 @@ fastf_t x = 0; int have_name = 0; int textdump = 0; + int textread = 0; /* don't report errors */ bu_opterr = 0; @@ -1535,8 +1538,12 @@ case 't': textdump = 1; break; - + /*Input a text file with height x width x depth sizes for bounding boxes. */ + case 'T': + textread = 1; + break; + /* These following arguments are for the wizard program, allowing easy access to each variable. * as they will only be callable by using a number (eg 1 = head, 2=neck width, 3=neck height etc) * and should not be called otherwise @@ -1687,6 +1694,7 @@ return GED_ERROR; } *text = textdump; + *input = textread; fflush(stdout); return(bu_optind); } @@ -1704,20 +1712,19 @@ FILE *dump; dump = fopen("Stats.txt", "w+"); - fprintf(dump, "Name, X, Y, Z, all in millimeters\n"); /*Head*/ x = dude->head.headSize; y = x; z = x; - fprintf(dump, "Head\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "Head\t%lf\t%lf\t%lf\n", x, y, z); /*Neck*/ x = dude->head.neckWidth * 2; y = x; z = dude->head.neckLength; - fprintf(dump, "Neck\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "Neck\t%lf\t%lf\t%lf\n", x, y, z); /*Upper Torso*/ if(dude->torso.topTorsoDepth > dude->torso.abDepth) @@ -1726,7 +1733,7 @@ x = dude->torso.abDepth; y = dude->torso.shoulderWidth; z = dude->torso.topTorsoLength; - fprintf(dump, "UpperTorso\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "UpperTorso\t%lf\t%lf\t%lf\n", x, y, z); /*Lower Torso*/ if(dude->torso.abDepth > dude->torso.pelvisDepth) @@ -1735,83 +1742,108 @@ x = dude->torso.pelvisDepth; y = dude->torso.pelvisWidth; z = dude->torso.lowTorsoLength; - fprintf(dump, "LowerTorso\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "LowerTorso\t%lf\t%lf\t%lf\n", x, y, z); /*Shoulder*/ x = dude->arms.upperArmWidth *2; y = x; z = y; - fprintf(dump, "ShoulderJoint\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "ShoulderJoint\t%lf\t%lf\t%lf\n", x, y, z); /*Upper Arm*/ x = dude->arms.upperArmWidth *2; y = x; z = dude->arms.upperArmLength; - fprintf(dump, "UpperArm\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "UpperArm\t%lf\t%lf\t%lf\n", x, y, z); /*Lower Arm*/ x = dude->arms.elbowWidth * 2; y = x; z = dude->arms.lowerArmLength; - fprintf(dump, "LowerArm\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "LowerArm\t%lf\t%lf\t%lf\n", x, y, z); /*Elbow*/ x = dude->arms.elbowWidth *2; y = x; z = y; - fprintf(dump, "Elbow\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "Elbow\t%lf\t%lf\t%lf\n", x, y, z); /*Wrist*/ x = dude->arms.wristWidth *2; y = x; z = y; - fprintf(dump, "Wrist\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "Wrist\t%lf\t%lf\t%lf\n", x, y, z); /*Hand*/ x = dude->arms.handWidth; y = dude->arms.handWidth; z = dude->arms.handLength; - fprintf(dump, "Hand\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "Hand\t%lf\t%lf\t%lf\n", x, y, z); /*Thigh Joint*/ x = dude->legs.thighWidth*2; y = x; z = y; - fprintf(dump, "ThighJoint\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "ThighJoint\t%lf\t%lf\t%lf\n", x, y, z); /*Thigh*/ x = dude->legs.thighWidth*2; y = x; z = dude->legs.thighLength; - fprintf(dump, "Thigh\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "Thigh\t%lf\t%lf\t%lf\n", x, y, z); /*Knee*/ x = dude->legs.kneeWidth; y = x; z = y; - fprintf(dump, "Knee\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "Knee\t%lf\t%lf\t%lf\n", x, y, z); /*Calf*/ x = dude->legs.kneeWidth*2; y = x; z = dude->legs.calfLength; - fprintf(dump, "Calf\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "Calf\t%lf\t%lf\t%lf\n", x, y, z); /*Ankle*/ x = dude->legs.ankleWidth * 2; y = x; z = y; - fprintf(dump, "Ankle\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "Ankle\t%lf\t%lf\t%lf\n", x, y, z); /*Foot*/ x = dude->legs.footLength; y = dude->legs.toeWidth * 2; z = dude->legs.toeWidth * 2; - fprintf(dump, "Foot\t\t%lf\t%lf\t%lf\n", x, y, z); + fprintf(dump, "Foot\t%lf\t%lf\t%lf\n", x, y, z); fclose(dump); } +/** + * This function reads in a file with bounding box information and inputs into the program, + * instead of manual mode or auto mode. + */ +void getText(struct human_data_t *dude) +{ + bu_log("\nReading Textfile for Input\n"); + char buffer[80]; + FILE *input; + + input = fopen("Stats.txt", "r"); + + if(input==NULL) { + bu_log("Non existant input file.\n"); + } + else { + bu_log("File opened, reading data\n"); + while(fgets(buffer, 80, input)!=NULL) { + bu_log("%s", buffer); + } + } + bu_log("Input file read.\n"); + fclose(input); +} + int ged_human(struct ged *gedp, int ac, const char *av[]) { @@ -1834,6 +1866,7 @@ VSET(location, 0, 0, 0); /* Default standing location */ char topLevel[MAXLENGTH] = ""; int textDump = 0; + int textRead = 0; bu_vls_init(&name); bu_vls_init(&str); @@ -1842,7 +1875,7 @@ GED_CHECK_READ_ONLY(gedp, GED_ERROR); /* Process command line arguments */ - ret = read_args(ac, av, topLevel, &human_data, &percentile, location, &stance, &troops, &textDump, &showBoxes); + ret = read_args(ac, av, topLevel, &human_data, &percentile, location, &stance, &troops, &textDump, &textRead, &showBoxes); // if (ret != GED_OK) { // bu_log("Non GED_OK value\n"); @@ -1865,6 +1898,11 @@ memset(humanName, 0, MAXLENGTH); bu_strlcpy(humanName, topLevel, MAXLENGTH); setStance(stance, &human_data); + + bu_log("Textread = %d\n", textRead); + if(textRead) + getText(&human_data); + if(troops <= 1){ makeBody(gedp->ged_wdbp, suffix, &human_data, location, showBoxes); mk_id_units(gedp->ged_wdbp, "A single Human", "in"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-21 20:10:42
|
Revision: 35678 http://brlcad.svn.sourceforge.net/brlcad/?rev=35678&view=rev Author: irpguardian Date: 2009-08-21 20:10:36 +0000 (Fri, 21 Aug 2009) Log Message: ----------- Reworking Bounding Box problem, added debugger bones as (Partname).sJoint Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-21 19:28:19 UTC (rev 35677) +++ brlcad/trunk/src/libged/human.c 2009-08-21 20:10:36 UTC (rev 35678) @@ -85,7 +85,7 @@ fastf_t torsoLength; fastf_t topTorsoLength, lowTorsoLength; fastf_t shoulderWidth; - fastf_t topTorsoDepth; + fastf_t shoulderDepth; fastf_t abWidth; fastf_t abDepth; fastf_t pelvisWidth; @@ -267,8 +267,9 @@ rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; */ /*X rotation Matrix */ - if(w==1 || w==6 || w== 7 || w==10 || w==11) +/* if(w==1 || w==6 || w== 7 || w==10 || w==11) rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; +*/ /* bu_log("%3.4f\t", rotMatrix[(w-1)]); if(w%4==0) @@ -279,18 +280,18 @@ */ /* MAT4X3VEC, rotate a vector about a center point, by a rotmatrix, MAT4X3VEC(new, rotmatrix, old) */ for(i = 0; i < 8; i++){ - /* MAT4X3VEC(newVects[i], rotMatrix, vects[i]); - */ - VEC3X3MAT(newVects[i], vects[i], rotMatrix); + /* VEC3X3MAT(newVects[i], vects[i], rotMatrix);*/ } - MAT4X3PNT(endPoint, rotMatrix, startPoint); +/* MAT4X3PNT(endPoint, rotMatrix, startPoint);*/ /* Set points to be at end of each vector */ for(i = 0; i < 8; i++){ VMOVE(finalPoints[i], newVects[i]); } -/* mk_trc_h(file, debug, endPoint, lengthVector, 2, 2); */ + vect_t JVEC; + MAT3X3VEC(JVEC, rotMatrix, lengthVector); + mk_trc_h(file, debug, startPoint, JVEC, 4, 1); mk_arb8(file, newName, *finalPoints); } @@ -386,7 +387,7 @@ VADD2(dude->joints.rightShoulderJoint, dude->joints.neckJoint, rightVector); /*Take shoulder width, and abWidth and convert values to vectors for tgc */ - VSET(a, (dude->torso.topTorsoDepth), 0, 0); + VSET(a, (dude->torso.shoulderDepth), 0, 0); VSET(b, 0, dude->torso.shoulderWidth, 0); VSET(c, (dude->torso.abDepth), 0, 0); VSET(d, 0, (dude->torso.abWidth), 0); @@ -1137,7 +1138,7 @@ dude->torso.topTorsoLength = (dude->torso.torsoLength *5) / 8; dude->torso.lowTorsoLength = (dude->torso.torsoLength *3) / 8; dude->torso.shoulderWidth = (dude->height / 8) *IN2MM; - dude->torso.topTorsoDepth = dude->torso.shoulderWidth/2; + dude->torso.shoulderDepth = dude->torso.shoulderWidth/2; dude->torso.abWidth=(dude->height / 9) * IN2MM; dude->torso.abDepth = dude->torso.abWidth / 2; dude->torso.pelvisWidth=(dude->height / 8) * IN2MM; @@ -1191,7 +1192,7 @@ bu_log("upperTorsoDepth\n"); scanf("%lf", &x); x=x*IN2MM; - dude->torso.topTorsoDepth=x; + dude->torso.shoulderDepth=x; bu_log("Low Torso Length\n"); scanf("%lf", &x); @@ -1686,6 +1687,7 @@ if(!have_name) { bu_log("%s: need top level object name\n", argv[0]); bu_log("Setting generic name, Body.c"); + Auto(dude); memset(humanName, 0, MAXLENGTH); memset(topLevel, 0, MAXLENGTH); bu_strlcpy(topLevel, "Body.c", MAXLENGTH); @@ -1727,8 +1729,8 @@ fprintf(dump, "Neck\t%lf\t%lf\t%lf\n", x, y, z); /*Upper Torso*/ - if(dude->torso.topTorsoDepth > dude->torso.abDepth) - x = dude->torso.topTorsoDepth; + if(dude->torso.shoulderDepth > dude->torso.abDepth) + x = dude->torso.shoulderDepth; else x = dude->torso.abDepth; y = dude->torso.shoulderWidth; @@ -1835,7 +1837,7 @@ bu_log("Non existant input file.\n"); } else { - bu_log("File opened, reading data\n"); + bu_log("File opened, reading data:\n"); while(fgets(buffer, 80, input)!=NULL) { bu_log("%s", buffer); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-21 20:54:50
|
Revision: 35679 http://brlcad.svn.sourceforge.net/brlcad/?rev=35679&view=rev Author: irpguardian Date: 2009-08-21 20:54:40 +0000 (Fri, 21 Aug 2009) Log Message: ----------- Bounding boxes dont fly off in wierd directions anymore, but are not accurate still. Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-21 20:10:36 UTC (rev 35678) +++ brlcad/trunk/src/libged/human.c 2009-08-21 20:54:40 UTC (rev 35679) @@ -260,20 +260,20 @@ for(w=1; w<=16; w++){ /*Z rotation matrix */ /* if(w==1 || w==2 || w== 5 || w== 6 || w==11) - rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; +* rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; */ /*Y rotation Matrix */ /* if(w==1 || w==3 || w== 6 || w==9 || w==11) - rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; +* rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; */ /*X rotation Matrix */ /* if(w==1 || w==6 || w== 7 || w==10 || w==11) - rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; +* rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; */ /* - bu_log("%3.4f\t", rotMatrix[(w-1)]); - if(w%4==0) - bu_log("\n"); +* bu_log("%3.4f\t", rotMatrix[(w-1)]); +* if(w%4==0) +* bu_log("\n"); */ } /* bu_log("-------------------------------+\n"); @@ -281,9 +281,7 @@ /* MAT4X3VEC, rotate a vector about a center point, by a rotmatrix, MAT4X3VEC(new, rotmatrix, old) */ for(i = 0; i < 8; i++){ MAT4X3VEC(newVects[i], rotMatrix, vects[i]); - /* VEC3X3MAT(newVects[i], vects[i], rotMatrix);*/ } -/* MAT4X3PNT(endPoint, rotMatrix, startPoint);*/ /* Set points to be at end of each vector */ for(i = 0; i < 8; i++){ @@ -292,7 +290,7 @@ vect_t JVEC; MAT3X3VEC(JVEC, rotMatrix, lengthVector); mk_trc_h(file, debug, startPoint, JVEC, 4, 1); - mk_arb8(file, newName, *finalPoints); + mk_arb8(file, newName, *vects); } /** Create a bounding rectangle around the individual part, and this one has 2 separate values for depth and width */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-24 13:43:55
|
Revision: 35688 http://brlcad.svn.sourceforge.net/brlcad/?rev=35688&view=rev Author: irpguardian Date: 2009-08-24 13:43:47 +0000 (Mon, 24 Aug 2009) Log Message: ----------- Allowed the human to be scaled by height again after breaking it. Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-23 09:52:27 UTC (rev 35687) +++ brlcad/trunk/src/libged/human.c 2009-08-24 13:43:47 UTC (rev 35688) @@ -1128,6 +1128,7 @@ void Auto(struct human_data_t *dude) { bu_log("Auto Setting\n"); + bu_log("Height=%lf\n", dude->height); dude->torso.torsoLength = 0; dude->head.headSize = (dude->height / 8) * IN2MM; dude->arms.armLength = (dude->height / 2) * IN2MM; @@ -1136,7 +1137,7 @@ dude->torso.topTorsoLength = (dude->torso.torsoLength *5) / 8; dude->torso.lowTorsoLength = (dude->torso.torsoLength *3) / 8; dude->torso.shoulderWidth = (dude->height / 8) *IN2MM; - dude->torso.shoulderDepth = dude->torso.shoulderWidth/2; + dude->torso.shoulderDepth = (dude->torso.shoulderWidth/2); dude->torso.abWidth=(dude->height / 9) * IN2MM; dude->torso.abDepth = dude->torso.abWidth / 2; dude->torso.pelvisWidth=(dude->height / 8) * IN2MM; @@ -1288,8 +1289,11 @@ bu_log("Top Torso=%lf\n", dude->torso.topTorsoLength); bu_log("Low Torso=%lf\n", dude->torso.lowTorsoLength); bu_log("Shoulders=%lf\n", dude->torso.shoulderWidth); - bu_log("Abs=%lf\n", dude->torso.abWidth); + bu_log("ShoulderDepth=%lf\n", dude->torso.shoulderDepth); + bu_log("Abs=%lf\n", dude->torso.abWidth); + bu_log("AbDepth=%lf\n", dude->torso.abDepth); bu_log("Pelvis=%lf\n", dude->torso.pelvisWidth); + bu_log("PelvisDepth=%lf\n", dude->torso.pelvisDepth); bu_log("Torso Length=%lf\n", dude->torso.torsoLength); bu_log("Upper Arm Width=%lf\n", dude->arms.upperArmWidth); @@ -1335,8 +1339,11 @@ dude->torso.topTorsoLength= dude->torso.lowTorsoLength= dude->torso.shoulderWidth= + dude->torso.shoulderDepth= dude->torso.abWidth= + dude->torso.abDepth= dude->torso.pelvisWidth= + dude->torso.pelvisDepth= dude->torso.torsoLength= dude->torso.topTorsoLength + dude->torso.lowTorsoLength; dude->arms.upperArmWidth= @@ -1441,7 +1448,6 @@ switch (c) { case 'A': bu_log("AutoMode, making 50 percentile man\n"); - dude->height = DEFAULT_HEIGHT_INCHES; *percentile=50; Auto(dude); fflush(stdin); @@ -1685,11 +1691,11 @@ if(!have_name) { bu_log("%s: need top level object name\n", argv[0]); bu_log("Setting generic name, Body.c"); - Auto(dude); memset(humanName, 0, MAXLENGTH); memset(topLevel, 0, MAXLENGTH); - bu_strlcpy(topLevel, "Body.c", MAXLENGTH); - bu_strlcpy(humanName, topLevel, MAXLENGTH); + bu_strlcpy(humanName, DEFAULT_HUMANNAME, MAXLENGTH); + bu_strlcpy(topLevel, DEFAULT_HUMANNAME, MAXLENGTH); + //Auto(dude); show_help(*argv, options); return GED_ERROR; } @@ -1816,6 +1822,9 @@ z = dude->legs.toeWidth * 2; fprintf(dump, "Foot\t%lf\t%lf\t%lf\n", x, y, z); + /*Total Height*/ + fprintf(dump, "Height\t%lf\n", dude->height); + fclose(dump); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-24 15:32:53
|
Revision: 35689 http://brlcad.svn.sourceforge.net/brlcad/?rev=35689&view=rev Author: irpguardian Date: 2009-08-24 15:32:45 +0000 (Mon, 24 Aug 2009) Log Message: ----------- Fixed problem where program tried to close a non-existant file Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-24 13:43:47 UTC (rev 35688) +++ brlcad/trunk/src/libged/human.c 2009-08-24 15:32:45 UTC (rev 35689) @@ -1461,7 +1461,7 @@ case 'H': sscanf(bu_optarg, "%f", &height); - if(height <= 0.0) + if(height < 1) { bu_log("Impossible height, setting default height!\n"); height = DEFAULT_HEIGHT_INCHES; @@ -1473,6 +1473,7 @@ dude->height = height; bu_log("%.2f = height in inches\n", height); } + Auto(dude); fflush(stdin); break; @@ -1513,13 +1514,13 @@ fflush(stdin); break; /* - case 'o': - case 'O': - memset(filename, 0, MAXLENGTH); - bu_strlcpy(filename, bu_optarg, MAXLENGTH); - fflush(stdin); - have_name = 1; - break; +* case 'o': +* case 'O': +* memset(filename, 0, MAXLENGTH); +* bu_strlcpy(filename, bu_optarg, MAXLENGTH); +* fflush(stdin); +* have_name = 1; +* break; */ case 'p': sscanf(bu_optarg, "%d", &percent); @@ -1695,9 +1696,7 @@ memset(topLevel, 0, MAXLENGTH); bu_strlcpy(humanName, DEFAULT_HUMANNAME, MAXLENGTH); bu_strlcpy(topLevel, DEFAULT_HUMANNAME, MAXLENGTH); - //Auto(dude); show_help(*argv, options); - return GED_ERROR; } *text = textdump; *input = textread; @@ -1823,7 +1822,7 @@ fprintf(dump, "Foot\t%lf\t%lf\t%lf\n", x, y, z); /*Total Height*/ - fprintf(dump, "Height\t%lf\n", dude->height); + fprintf(dump, "Height\t%lf\n", (dude->height * IN2MM)); fclose(dump); } @@ -1848,9 +1847,9 @@ while(fgets(buffer, 80, input)!=NULL) { bu_log("%s", buffer); } + bu_log("Input file read.\n"); + fclose(input); } - bu_log("Input file read.\n"); - fclose(input); } int @@ -1866,14 +1865,14 @@ struct bu_vls str; struct human_data_t human_data; fastf_t showBoxes = 0, troops = 0, stance = 0, percentile=50; - char suffix[MAXLENGTH]= ""; + char suffix[MAXLENGTH]; point_t location; int ret; int is_region = 0; unsigned char rgb[3], rgb2[3], rgb3[3]; human_data.height = DEFAULT_HEIGHT_INCHES; VSET(location, 0, 0, 0); /* Default standing location */ - char topLevel[MAXLENGTH] = ""; + char topLevel[MAXLENGTH]; int textDump = 0; int textRead = 0; @@ -1886,13 +1885,6 @@ /* Process command line arguments */ ret = read_args(ac, av, topLevel, &human_data, &percentile, location, &stance, &troops, &textDump, &textRead, &showBoxes); -// if (ret != GED_OK) { -// bu_log("Non GED_OK value\n"); -// bu_vls_free(&name); -// bu_vls_free(&str); -// return ret; -// } - GED_CHECK_EXISTS(gedp, bu_vls_addr(&name), LOOKUP_QUIET, GED_ERROR); bu_log("Center Location: "); @@ -1907,8 +1899,6 @@ memset(humanName, 0, MAXLENGTH); bu_strlcpy(humanName, topLevel, MAXLENGTH); setStance(stance, &human_data); - - bu_log("Textread = %d\n", textRead); if(textRead) getText(&human_data); @@ -1916,7 +1906,7 @@ makeBody(gedp->ged_wdbp, suffix, &human_data, location, showBoxes); mk_id_units(gedp->ged_wdbp, "A single Human", "in"); - /*This function dumps out a text file of all dimentions of bounding boxes on human model.*/ + /*This function dumps out a text file of all dimentions of bounding boxes/antrho-data/whatever on human model.*/ if(textDump) text(&human_data); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-24 23:22:24
|
Revision: 35694 http://brlcad.svn.sourceforge.net/brlcad/?rev=35694&view=rev Author: irpguardian Date: 2009-08-24 22:04:47 +0000 (Mon, 24 Aug 2009) Log Message: ----------- Fixed a problem where name holder variables were not being properly initialized. Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-24 21:56:40 UTC (rev 35693) +++ brlcad/trunk/src/libged/human.c 2009-08-24 22:04:47 UTC (rev 35694) @@ -1865,14 +1865,14 @@ struct bu_vls str; struct human_data_t human_data; fastf_t showBoxes = 0, troops = 0, stance = 0, percentile=50; - char suffix[MAXLENGTH]; + char suffix[MAXLENGTH]=""; point_t location; int ret; int is_region = 0; unsigned char rgb[3], rgb2[3], rgb3[3]; human_data.height = DEFAULT_HEIGHT_INCHES; VSET(location, 0, 0, 0); /* Default standing location */ - char topLevel[MAXLENGTH]; + char topLevel[MAXLENGTH]=""; int textDump = 0; int textRead = 0; @@ -2085,7 +2085,7 @@ "LeftLowerArm.s","LeftWristJoint.s","LeftHand.s","RightShoulderJoint.s","RightUpperArm.s","RightElbowJoint.s","RightLowerArm.s", "RightWristJoint.s","RightHand.s","LeftThighJoint.s","LeftThigh.s","LeftKneeJoint.s","LeftCalf.s","LeftAnkleJoint.s","LeftFoot.s", "RightThighJoint.s","RightThigh.s","RightKneeJoint.s","RightCalf.s","RightAnkleJoint.s","RightFoot.s","0"}; - char body[MAXLENGTH][MAXLENGTH]={*topLevel,}; + char body[MAXLENGTH][MAXLENGTH]={*topLevel}; char box[MAXLENGTH][MAXLENGTH]={"Box.r",}; bu_log("%d\n", w); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-25 14:53:41
|
Revision: 35704 http://brlcad.svn.sourceforge.net/brlcad/?rev=35704&view=rev Author: irpguardian Date: 2009-08-25 14:53:32 +0000 (Tue, 25 Aug 2009) Log Message: ----------- Added a new function which dumps out all measurements to a textfile, Verbose.txt, for debugging purposes. Automatically runs for now. Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-25 14:04:17 UTC (rev 35703) +++ brlcad/trunk/src/libged/human.c 2009-08-25 14:53:32 UTC (rev 35704) @@ -1430,7 +1430,7 @@ int read_args(int argc, char **argv, char *topLevel, struct human_data_t *dude, fastf_t *percentile, fastf_t *location, fastf_t *stance, fastf_t *troops, int *text, int *input, fastf_t *showBoxes) { char c = 'A'; - char *options="AbH:hLlmn:N:O:o:p:s:tTw1:2:3:4:5:6:7:8:9:0:=:+:_:*:^:%:$:#:@:!:Q:~:"; + char *options="AbH:hLlmn:N:O:o:p:s:tTw1:2:3:4:5:6:7:8:9:0:=:+:_:*:^:%:$:#:@:!:Q:~:Z:Y:X:"; float height=0; int soldiers=0; int pose=0; @@ -1473,9 +1473,9 @@ dude->height = height; bu_log("%.2f = height in inches\n", height); } - Auto(dude); fflush(stdin); - break; + Auto(dude); + break; case 'h': case '?': @@ -1486,7 +1486,8 @@ case 'L': case 'l': - bu_log("Location\n"); + bu_log("Location\n"); Auto(dude); + getLocation(location); fflush(stdin); break; @@ -1667,6 +1668,21 @@ x*=IN2MM; dude->legs.toeWidth=x; break; + case 'Z': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->torso.shoulderDepth=x; + break; + case 'Y': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->torso.abDepth=x; + break; + case 'W': + sscanf(bu_optarg, "%lf", &x); + x*=IN2MM; + dude->torso.pelvisDepth=x; + break; default: show_help(*argv, options); @@ -1681,7 +1697,6 @@ if((argc - bu_optind) == 1) { /* Yes, there is a top-level name at the end of this argument chain, lets dump it into the file*/ have_name = 1; - memset(humanName, 0, MAXLENGTH); memset(topLevel, 0, MAXLENGTH); bu_strlcpy(topLevel, argv[bu_optind], MAXLENGTH); @@ -1690,13 +1705,14 @@ bu_log("TopLevel2=%s\n", humanName); } if(!have_name) { - bu_log("%s: need top level object name\n", argv[0]); - bu_log("Setting generic name, Body.c"); + /*If there is no top level name at the end, go with a default */ + bu_log("Default top level object name\n"); + bu_log("Setting generic name, %s\n", DEFAULT_HUMANNAME); memset(humanName, 0, MAXLENGTH); memset(topLevel, 0, MAXLENGTH); bu_strlcpy(humanName, DEFAULT_HUMANNAME, MAXLENGTH); bu_strlcpy(topLevel, DEFAULT_HUMANNAME, MAXLENGTH); - show_help(*argv, options); + /* show_help(*argv, options);*/ } *text = textdump; *input = textread; @@ -1828,6 +1844,51 @@ } /** + * Spit out every measurement of the model in a textfile called Verbose.txt + * Includes all measurments, sans angles. + */ +void verbose(struct human_data_t *dude) +{ + bu_log("\nVerbose Text Dump\n"); + FILE *dump; + dump = fopen("Verbose.txt", "w+"); + + fprintf(dump, "headSize=%lf\n", dude->head.headSize); + fprintf(dump, "neckLength=%lf\n", dude->head.neckLength); + fprintf(dump, "neckWidth=%lf\n", dude->head.neckWidth); + + fprintf(dump, "topTorsoLength=%lf\n", dude->torso.topTorsoLength); + fprintf(dump, "lowTorsoLength=%lf\n", dude->torso.lowTorsoLength); + fprintf(dump, "shoulderWidth=%lf\n", dude->torso.shoulderWidth); + fprintf(dump, "shoulderDepth=%lf\n", dude->torso.shoulderDepth); + fprintf(dump, "abWidth=%lf\n", dude->torso.abWidth); + fprintf(dump, "abDepth=%lf\n", dude->torso.abDepth); + fprintf(dump, "pelvisWidth=%lf\n", dude->torso.pelvisWidth); + fprintf(dump, "pelvisDepth=%lf\n", dude->torso.pelvisDepth); + fprintf(dump, "torsoLength=%lf\n", dude->torso.torsoLength); + + fprintf(dump, "upperArmWidth=%lf\n", dude->arms.upperArmWidth); + fprintf(dump, "upperArmLength=%lf\n", dude->arms.upperArmLength); + fprintf(dump, "lowerArmLength=%lf\n", dude->arms.lowerArmLength); + fprintf(dump, "elbowWidth=%lf\n", dude->arms.elbowWidth); + fprintf(dump, "wristWidth=%lf\n", dude->arms.wristWidth); + fprintf(dump, "handLength=%lf\n", dude->arms.handLength); + fprintf(dump, "handWidth=%lf\n", dude->arms.handWidth); + fprintf(dump, "armLength=%lf\n", dude->arms.armLength); + + fprintf(dump, "thighLength=%lf\n", dude->legs.thighLength); + fprintf(dump, "thighWidth=%lf\n", dude->legs.thighWidth); + fprintf(dump, "calfLength=%lf\n", dude->legs.calfLength); + fprintf(dump, "kneeWidth=%lf\n", dude->legs.kneeWidth); + fprintf(dump, "footLength=%lf\n", dude->legs.footLength); + fprintf(dump, "ankleWidth=%lf\n", dude->legs.ankleWidth); + fprintf(dump, "toeWidth=%lf\n", dude->legs.toeWidth); + fprintf(dump, "legLength=%lf\n", dude->legs.legLength); + + fclose(dump); + bu_log("Verbose Output saved\n"); +} +/** * This function reads in a file with bounding box information and inputs into the program, * instead of manual mode or auto mode. */ @@ -1914,6 +1975,7 @@ makeArmy(gedp->ged_wdbp, human_data, troops, showBoxes); mk_id_units(gedp->ged_wdbp, "An army of people", "in"); } + verbose(&human_data); /****End Magic****/ /** Make the Regions (.r's) of the body */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-25 15:09:13
|
Revision: 35706 http://brlcad.svn.sourceforge.net/brlcad/?rev=35706&view=rev Author: irpguardian Date: 2009-08-25 15:09:07 +0000 (Tue, 25 Aug 2009) Log Message: ----------- Formatted verbose output to be more organized, and aligned Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-25 14:56:56 UTC (rev 35705) +++ brlcad/trunk/src/libged/human.c 2009-08-25 15:09:07 UTC (rev 35706) @@ -1853,37 +1853,37 @@ FILE *dump; dump = fopen("Verbose.txt", "w+"); - fprintf(dump, "headSize=%lf\n", dude->head.headSize); - fprintf(dump, "neckLength=%lf\n", dude->head.neckLength); - fprintf(dump, "neckWidth=%lf\n", dude->head.neckWidth); + fprintf(dump, "headSize=\t%lf\n", dude->head.headSize); + fprintf(dump, "neckLength=\t%lf\n", dude->head.neckLength); + fprintf(dump, "neckWidth=\t%lf\n", dude->head.neckWidth); - fprintf(dump, "topTorsoLength=%lf\n", dude->torso.topTorsoLength); - fprintf(dump, "lowTorsoLength=%lf\n", dude->torso.lowTorsoLength); - fprintf(dump, "shoulderWidth=%lf\n", dude->torso.shoulderWidth); - fprintf(dump, "shoulderDepth=%lf\n", dude->torso.shoulderDepth); - fprintf(dump, "abWidth=%lf\n", dude->torso.abWidth); - fprintf(dump, "abDepth=%lf\n", dude->torso.abDepth); - fprintf(dump, "pelvisWidth=%lf\n", dude->torso.pelvisWidth); - fprintf(dump, "pelvisDepth=%lf\n", dude->torso.pelvisDepth); - fprintf(dump, "torsoLength=%lf\n", dude->torso.torsoLength); + fprintf(dump, "topTorsoLength=\t%lf\n", dude->torso.topTorsoLength); + fprintf(dump, "lowTorsoLength=\t%lf\n", dude->torso.lowTorsoLength); + fprintf(dump, "shoulderWidth=\t%lf\n", dude->torso.shoulderWidth); + fprintf(dump, "shoulderDepth=\t%lf\n", dude->torso.shoulderDepth); + fprintf(dump, "abWidth=\t%lf\n", dude->torso.abWidth); + fprintf(dump, "abDepth=\t%lf\n", dude->torso.abDepth); + fprintf(dump, "pelvisWidth=\t%lf\n", dude->torso.pelvisWidth); + fprintf(dump, "pelvisDepth=\t%lf\n", dude->torso.pelvisDepth); + fprintf(dump, "torsoLength=\t%lf\n", dude->torso.torsoLength); - fprintf(dump, "upperArmWidth=%lf\n", dude->arms.upperArmWidth); - fprintf(dump, "upperArmLength=%lf\n", dude->arms.upperArmLength); - fprintf(dump, "lowerArmLength=%lf\n", dude->arms.lowerArmLength); - fprintf(dump, "elbowWidth=%lf\n", dude->arms.elbowWidth); - fprintf(dump, "wristWidth=%lf\n", dude->arms.wristWidth); - fprintf(dump, "handLength=%lf\n", dude->arms.handLength); - fprintf(dump, "handWidth=%lf\n", dude->arms.handWidth); - fprintf(dump, "armLength=%lf\n", dude->arms.armLength); + fprintf(dump, "upperArmWidth=\t%lf\n", dude->arms.upperArmWidth); + fprintf(dump, "upperArmLength=\t%lf\n", dude->arms.upperArmLength); + fprintf(dump, "lowerArmLength=\t%lf\n", dude->arms.lowerArmLength); + fprintf(dump, "elbowWidth=\t%lf\n", dude->arms.elbowWidth); + fprintf(dump, "wristWidth=\t%lf\n", dude->arms.wristWidth); + fprintf(dump, "handLength=\t%lf\n", dude->arms.handLength); + fprintf(dump, "handWidth=\t%lf\n", dude->arms.handWidth); + fprintf(dump, "armLength=\t%lf\n", dude->arms.armLength); - fprintf(dump, "thighLength=%lf\n", dude->legs.thighLength); - fprintf(dump, "thighWidth=%lf\n", dude->legs.thighWidth); - fprintf(dump, "calfLength=%lf\n", dude->legs.calfLength); - fprintf(dump, "kneeWidth=%lf\n", dude->legs.kneeWidth); - fprintf(dump, "footLength=%lf\n", dude->legs.footLength); - fprintf(dump, "ankleWidth=%lf\n", dude->legs.ankleWidth); - fprintf(dump, "toeWidth=%lf\n", dude->legs.toeWidth); - fprintf(dump, "legLength=%lf\n", dude->legs.legLength); + fprintf(dump, "thighLength=\t%lf\n", dude->legs.thighLength); + fprintf(dump, "thighWidth=\t%lf\n", dude->legs.thighWidth); + fprintf(dump, "calfLength=\t%lf\n", dude->legs.calfLength); + fprintf(dump, "kneeWidth=\t%lf\n", dude->legs.kneeWidth); + fprintf(dump, "footLength=\t%lf\n", dude->legs.footLength); + fprintf(dump, "ankleWidth=\t%lf\n", dude->legs.ankleWidth); + fprintf(dump, "toeWidth=\t%lf\n", dude->legs.toeWidth); + fprintf(dump, "legLength=\t%lf\n", dude->legs.legLength); fclose(dump); bu_log("Verbose Output saved\n"); @@ -1975,7 +1975,7 @@ makeArmy(gedp->ged_wdbp, human_data, troops, showBoxes); mk_id_units(gedp->ged_wdbp, "An army of people", "in"); } - verbose(&human_data); + verbose(&human_data); /*output a file, Verbose.txt, that contains all measurments of the body */ /****End Magic****/ /** Make the Regions (.r's) of the body */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-25 19:47:36
|
Revision: 35707 http://brlcad.svn.sourceforge.net/brlcad/?rev=35707&view=rev Author: irpguardian Date: 2009-08-25 19:47:17 +0000 (Tue, 25 Aug 2009) Log Message: ----------- Added text input for all body measurements, by the file Verbose.txt Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-25 15:09:07 UTC (rev 35706) +++ brlcad/trunk/src/libged/human.c 2009-08-25 19:47:17 UTC (rev 35707) @@ -150,6 +150,13 @@ struct armInfo arms; struct legInfo legs; struct jointInfo joints; + + /* Various triggers */ + int textread; + int textwrite; + int verbread; + int verbwrite; + }; /** @@ -1427,18 +1434,16 @@ } /* Process command line arguments */ -int read_args(int argc, char **argv, char *topLevel, struct human_data_t *dude, fastf_t *percentile, fastf_t *location, fastf_t *stance, fastf_t *troops, int *text, int *input, fastf_t *showBoxes) +int read_args(int argc, char **argv, char *topLevel, struct human_data_t *dude, fastf_t *percentile, fastf_t *location, fastf_t *stance, fastf_t *troops, fastf_t *showBoxes) { char c = 'A'; - char *options="AbH:hLlmn:N:O:o:p:s:tTw1:2:3:4:5:6:7:8:9:0:=:+:_:*:^:%:$:#:@:!:Q:~:Z:Y:X:"; + char *options="AbH:hLlmn:N:O:o:p:s:tTvVw1:2:3:4:5:6:7:8:9:0:=:+:_:*:^:%:$:#:@:!:Q:~:Z:Y:X:"; float height=0; int soldiers=0; int pose=0; int percent=50; fastf_t x = 0; int have_name = 0; - int textdump = 0; - int textread = 0; /* don't report errors */ bu_opterr = 0; @@ -1543,14 +1548,23 @@ /*Output a text file with height x width x depth sizes for bounding boxes. */ case 't': - textdump = 1; + dude->textwrite=1; break; /*Input a text file with height x width x depth sizes for bounding boxes. */ case 'T': - textread = 1; - break; + dude->textread=1; + break; + /*Output a text file with all measurements of the human model */ + case 'v': + dude->verbwrite=1; + break; + /*Input a text file with all measurements for a human model */ + case 'V': + dude->verbread=1; + break; + /* These following arguments are for the wizard program, allowing easy access to each variable. * as they will only be callable by using a number (eg 1 = head, 2=neck width, 3=neck height etc) * and should not be called otherwise @@ -1714,8 +1728,6 @@ bu_strlcpy(topLevel, DEFAULT_HUMANNAME, MAXLENGTH); /* show_help(*argv, options);*/ } - *text = textdump; - *input = textread; fflush(stdout); return(bu_optind); } @@ -1849,41 +1861,41 @@ */ void verbose(struct human_data_t *dude) { - bu_log("\nVerbose Text Dump\n"); + bu_log("Verbose Text Dump\n"); FILE *dump; dump = fopen("Verbose.txt", "w+"); - fprintf(dump, "headSize=\t%lf\n", dude->head.headSize); - fprintf(dump, "neckLength=\t%lf\n", dude->head.neckLength); - fprintf(dump, "neckWidth=\t%lf\n", dude->head.neckWidth); + fprintf(dump, "headSize\t%lf\n", dude->head.headSize); + fprintf(dump, "neckLength\t%lf\n", dude->head.neckLength); + fprintf(dump, "neckWidth\t%lf\n", dude->head.neckWidth); - fprintf(dump, "topTorsoLength=\t%lf\n", dude->torso.topTorsoLength); - fprintf(dump, "lowTorsoLength=\t%lf\n", dude->torso.lowTorsoLength); - fprintf(dump, "shoulderWidth=\t%lf\n", dude->torso.shoulderWidth); - fprintf(dump, "shoulderDepth=\t%lf\n", dude->torso.shoulderDepth); - fprintf(dump, "abWidth=\t%lf\n", dude->torso.abWidth); - fprintf(dump, "abDepth=\t%lf\n", dude->torso.abDepth); - fprintf(dump, "pelvisWidth=\t%lf\n", dude->torso.pelvisWidth); - fprintf(dump, "pelvisDepth=\t%lf\n", dude->torso.pelvisDepth); - fprintf(dump, "torsoLength=\t%lf\n", dude->torso.torsoLength); + fprintf(dump, "topTorsoLength\t%lf\n", dude->torso.topTorsoLength); + fprintf(dump, "lowTorsoLength\t%lf\n", dude->torso.lowTorsoLength); + fprintf(dump, "shoulderWidth\t%lf\n", dude->torso.shoulderWidth); + fprintf(dump, "shoulderDepth\t%lf\n", dude->torso.shoulderDepth); + fprintf(dump, "abWidth\t%lf\n", dude->torso.abWidth); + fprintf(dump, "abDepth\t%lf\n", dude->torso.abDepth); + fprintf(dump, "pelvisWidth\t%lf\n", dude->torso.pelvisWidth); + fprintf(dump, "pelvisDepth\t%lf\n", dude->torso.pelvisDepth); + fprintf(dump, "torsoLength\t%lf\n", dude->torso.torsoLength); - fprintf(dump, "upperArmWidth=\t%lf\n", dude->arms.upperArmWidth); - fprintf(dump, "upperArmLength=\t%lf\n", dude->arms.upperArmLength); - fprintf(dump, "lowerArmLength=\t%lf\n", dude->arms.lowerArmLength); - fprintf(dump, "elbowWidth=\t%lf\n", dude->arms.elbowWidth); - fprintf(dump, "wristWidth=\t%lf\n", dude->arms.wristWidth); - fprintf(dump, "handLength=\t%lf\n", dude->arms.handLength); - fprintf(dump, "handWidth=\t%lf\n", dude->arms.handWidth); - fprintf(dump, "armLength=\t%lf\n", dude->arms.armLength); + fprintf(dump, "upperArmWidth\t%lf\n", dude->arms.upperArmWidth); + fprintf(dump, "upperArmLength\t%lf\n", dude->arms.upperArmLength); + fprintf(dump, "lowerArmLength\t%lf\n", dude->arms.lowerArmLength); + fprintf(dump, "elbowWidth\t%lf\n", dude->arms.elbowWidth); + fprintf(dump, "wristWidth\t%lf\n", dude->arms.wristWidth); + fprintf(dump, "handLength\t%lf\n", dude->arms.handLength); + fprintf(dump, "handWidth\t%lf\n", dude->arms.handWidth); + fprintf(dump, "armLength\t%lf\n", dude->arms.armLength); - fprintf(dump, "thighLength=\t%lf\n", dude->legs.thighLength); - fprintf(dump, "thighWidth=\t%lf\n", dude->legs.thighWidth); - fprintf(dump, "calfLength=\t%lf\n", dude->legs.calfLength); - fprintf(dump, "kneeWidth=\t%lf\n", dude->legs.kneeWidth); - fprintf(dump, "footLength=\t%lf\n", dude->legs.footLength); - fprintf(dump, "ankleWidth=\t%lf\n", dude->legs.ankleWidth); - fprintf(dump, "toeWidth=\t%lf\n", dude->legs.toeWidth); - fprintf(dump, "legLength=\t%lf\n", dude->legs.legLength); + fprintf(dump, "thighLength\t%lf\n", dude->legs.thighLength); + fprintf(dump, "thighWidth\t%lf\n", dude->legs.thighWidth); + fprintf(dump, "calfLength\t%lf\n", dude->legs.calfLength); + fprintf(dump, "kneeWidth\t%lf\n", dude->legs.kneeWidth); + fprintf(dump, "footLength\t%lf\n", dude->legs.footLength); + fprintf(dump, "ankleWidth\t%lf\n", dude->legs.ankleWidth); + fprintf(dump, "toeWidth\t%lf\n", dude->legs.toeWidth); + fprintf(dump, "legLength\t%lf\n", dude->legs.legLength); fclose(dump); bu_log("Verbose Output saved\n"); @@ -1894,7 +1906,7 @@ */ void getText(struct human_data_t *dude) { - bu_log("\nReading Textfile for Input\n"); + bu_log("Reading Textfile for Input\n"); char buffer[80]; FILE *input; @@ -1905,7 +1917,12 @@ } else { bu_log("File opened, reading data:\n"); - while(fgets(buffer, 80, input)!=NULL) { + + /** + *Inside this while loop, values which are input will be placed into their respective holders + *in the human data type, based upon name. + */ + while(bu_fgets(buffer, 80, input)!=NULL) { bu_log("%s", buffer); } bu_log("Input file read.\n"); @@ -1913,6 +1930,97 @@ } } +void verbIn(struct human_data_t *dude) +{ + bu_log("Reading textfile for all measurements\n"); + char buffer[80]; + char s[80]; + fastf_t holder; + FILE *input; + + input = fopen("Verbose.txt", "r"); + if(input == NULL) { + bu_log("Non-existant input file\n"); + } + else { + bu_log("File opened, setting measurements\n"); + + /** + *Inside this while loop, values which are input will be placed into their respective holders + *in the human data type, based upon name. + */ + while(bu_fgets(buffer, 80, input)!=NULL) { + /*check string for comment symbols (#, ;, (whitespace) ) and ignore them.*/ + sscanf(buffer, "%c", s); + if(s[0] == '#'|| s[0] == ';') + /*bu_log("COMMENT!!\n");*/ + /*Go to next line...*/ + ; + else { + /*Then check remaining strings against existing variables*/ + sscanf(buffer, "%s %lf", s, &holder); + bu_log("%s, %lf\n", s, holder); + /*Big statement of matching names with variables*/ + if(strcmp(s,"headSize")==0) + dude->head.headSize = holder; + else if(strcmp(s,"neckWidth")==0) + dude->head.neckWidth = holder; + else if(strcmp(s,"neckLength")==0) + dude->head.neckLength = holder; + else if(strcmp(s,"topTorsoLength")==0) + dude->torso.topTorsoLength = holder; + else if(strcmp(s,"lowTorsoLength")==0) + dude->torso.lowTorsoLength = holder; + else if(strcmp(s,"shoulderWidth")==0) + dude->torso.shoulderWidth = holder; + else if(strcmp(s,"shoulderDepth")==0) + dude->torso.shoulderDepth = holder; + else if(strcmp(s,"abWidth")==0) + dude->torso.abWidth = holder; + else if(strcmp(s,"abDepth")==0) + dude->torso.abDepth = holder; + else if(strcmp(s,"pelvisWidth")==0) + dude->torso.pelvisWidth = holder; + else if(strcmp(s,"pelvisDepth")==0) + dude->torso.pelvisDepth = holder; + else if(strcmp(s,"upperArmWidth")==0) + dude->arms.upperArmWidth = holder; + else if(strcmp(s,"upperArmLength")==0) + dude->arms.upperArmLength = holder; + else if(strcmp(s,"lowerArmLength")==0) + dude->arms.lowerArmLength = holder; + else if(strcmp(s,"elbowWidth")==0) + dude->arms.elbowWidth = holder; + else if(strcmp(s,"wristWidth")==0) + dude->arms.wristWidth = holder; + else if(strcmp(s,"handLength")==0) + dude->arms.handLength = holder; + else if(strcmp(s,"handWidth")==0) + dude->arms.handWidth = holder; + else if(strcmp(s,"thighLength")==0) + dude->legs.thighLength = holder; + else if(strcmp(s,"thighWidth")==0) + dude->legs.thighWidth = holder; + else if(strcmp(s,"calfLength")==0) + dude->legs.calfLength = holder; + else if(strcmp(s,"kneeWidth")==0) + dude->legs.kneeWidth = holder; + else if(strcmp(s,"footLength")==0) + dude->legs.footLength = holder; + else if(strcmp(s,"ankleWidth")==0) + dude->legs.ankleWidth = holder; + else if(strcmp(s,"toeWidth")==0) + dude->legs.toeWidth = holder; + else + bu_log("Bad spelling somewhere\n"); + } + } + bu_log("File read\n"); + fclose(input); + } +} + + int ged_human(struct ged *gedp, int ac, const char *av[]) { @@ -1944,7 +2052,7 @@ GED_CHECK_READ_ONLY(gedp, GED_ERROR); /* Process command line arguments */ - ret = read_args(ac, av, topLevel, &human_data, &percentile, location, &stance, &troops, &textDump, &textRead, &showBoxes); + ret = read_args(ac, av, topLevel, &human_data, &percentile, location, &stance, &troops, &showBoxes); GED_CHECK_EXISTS(gedp, bu_vls_addr(&name), LOOKUP_QUIET, GED_ERROR); @@ -1953,29 +2061,31 @@ /******MAGIC******/ /*Magically set pose, and apply pose to human geometry*/ - //setMeasurements(&human_data, percentile); + /*setMeasurements(&human_data, percentile);*/ /*humanName[MAXLENGTH]*/ /* This applies the generic end-name to the high-level object */ bu_log("%s\n", topLevel); memset(humanName, 0, MAXLENGTH); bu_strlcpy(humanName, topLevel, MAXLENGTH); setStance(stance, &human_data); - if(textRead) + if(human_data.textread==1) getText(&human_data); - + if(human_data.verbread==1) + verbIn(&human_data); if(troops <= 1){ makeBody(gedp->ged_wdbp, suffix, &human_data, location, showBoxes); mk_id_units(gedp->ged_wdbp, "A single Human", "in"); /*This function dumps out a text file of all dimentions of bounding boxes/antrho-data/whatever on human model.*/ - if(textDump) + if(human_data.textwrite==1) text(&human_data); + if(human_data.verbwrite==1) + verbose(&human_data); } if(troops > 1){ makeArmy(gedp->ged_wdbp, human_data, troops, showBoxes); mk_id_units(gedp->ged_wdbp, "An army of people", "in"); } - verbose(&human_data); /*output a file, Verbose.txt, that contains all measurments of the body */ /****End Magic****/ /** Make the Regions (.r's) of the body */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-25 20:33:01
|
Revision: 35708 http://brlcad.svn.sourceforge.net/brlcad/?rev=35708&view=rev Author: irpguardian Date: 2009-08-25 20:32:55 +0000 (Tue, 25 Aug 2009) Log Message: ----------- Added help on text input/output on the -? command Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-25 19:47:17 UTC (rev 35707) +++ brlcad/trunk/src/libged/human.c 2009-08-25 20:32:55 UTC (rev 35708) @@ -1409,6 +1409,8 @@ "\t-p\t\tSet Percentile (not implemented yet) 1-99\n" "\t-t\t\tSave bounding box information to file Stats.txt\n" "\t-T\t\tRead bounding box information from file Stats.txt\n" + "\t-v\t\tGenerate verbose output of all data used to build human model, to Verbose.txt\n" + "\t-V\t\tRead verbose input of all data used to build human model, using Verbose.txt\n" "\t 1 - 9, 0, Q, and special characters are used for wizard purposes, ignore them.\n" ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-26 13:09:44
|
Revision: 35715 http://brlcad.svn.sourceforge.net/brlcad/?rev=35715&view=rev Author: irpguardian Date: 2009-08-26 13:09:32 +0000 (Wed, 26 Aug 2009) Log Message: ----------- Various changes to reflect new verbose setting Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-26 12:58:07 UTC (rev 35714) +++ brlcad/trunk/src/libged/human.c 2009-08-26 13:09:32 UTC (rev 35715) @@ -1087,8 +1087,8 @@ VSET(test1, 0, 0, 0); VSET(test2, 0, 15, 0); VSET(test3, 0, 30, 0); - VSET(test4, 0, 60, 0); - VSET(test5, 0, 90, 0); + VSET(test4, 0, 45, 0); + VSET(test5, 0, 60, 0); VMOVE(dude->arms.lArmDirection, test1); VMOVE(dude->arms.lElbowDirection, test1); VMOVE(dude->arms.rArmDirection, test2); @@ -1195,7 +1195,7 @@ x=x*IN2MM; dude->torso.shoulderWidth=x; - bu_log("upperTorsoDepth\n"); + bu_log("Shoulder Depth\n"); scanf("%lf", &x); x=x*IN2MM; dude->torso.shoulderDepth=x; @@ -1410,7 +1410,7 @@ "\t-t\t\tSave bounding box information to file Stats.txt\n" "\t-T\t\tRead bounding box information from file Stats.txt\n" "\t-v\t\tGenerate verbose output of all data used to build human model, to Verbose.txt\n" - "\t-V\t\tRead verbose input of all data used to build human model, using Verbose.txt\n" + "\t-V\t\tRead verbose input of all data and build a human model, using Verbose.txt\n" "\t 1 - 9, 0, Q, and special characters are used for wizard purposes, ignore them.\n" ); @@ -1562,6 +1562,7 @@ case 'v': dude->verbwrite=1; break; + /*Input a text file with all measurements for a human model */ case 'V': dude->verbread=1; @@ -1735,9 +1736,9 @@ } /** - * the text function takes the dimentions of each region on the body, and finds the measurements for each bounding box to be ouput + * The text function takes the dimentions of each region on the body, and finds the measurements for each bounding box to be ouput * to a text file. All dimentions are in mm, because it seems everyone just /loves/ millimeters for analytical purposes. - * Hard Coded to dump out everything. + * Hard Coded to dump out everything related to boundingboxes. */ void text(struct human_data_t *dude) { @@ -1866,6 +1867,7 @@ bu_log("Verbose Text Dump\n"); FILE *dump; dump = fopen("Verbose.txt", "w+"); + fprintf(dump, "#All Sizes are in mm\n"); fprintf(dump, "headSize\t%lf\n", dude->head.headSize); fprintf(dump, "neckLength\t%lf\n", dude->head.neckLength); @@ -1879,7 +1881,6 @@ fprintf(dump, "abDepth\t%lf\n", dude->torso.abDepth); fprintf(dump, "pelvisWidth\t%lf\n", dude->torso.pelvisWidth); fprintf(dump, "pelvisDepth\t%lf\n", dude->torso.pelvisDepth); - fprintf(dump, "torsoLength\t%lf\n", dude->torso.torsoLength); fprintf(dump, "upperArmWidth\t%lf\n", dude->arms.upperArmWidth); fprintf(dump, "upperArmLength\t%lf\n", dude->arms.upperArmLength); @@ -1888,7 +1889,6 @@ fprintf(dump, "wristWidth\t%lf\n", dude->arms.wristWidth); fprintf(dump, "handLength\t%lf\n", dude->arms.handLength); fprintf(dump, "handWidth\t%lf\n", dude->arms.handWidth); - fprintf(dump, "armLength\t%lf\n", dude->arms.armLength); fprintf(dump, "thighLength\t%lf\n", dude->legs.thighLength); fprintf(dump, "thighWidth\t%lf\n", dude->legs.thighWidth); @@ -1897,7 +1897,6 @@ fprintf(dump, "footLength\t%lf\n", dude->legs.footLength); fprintf(dump, "ankleWidth\t%lf\n", dude->legs.ankleWidth); fprintf(dump, "toeWidth\t%lf\n", dude->legs.toeWidth); - fprintf(dump, "legLength\t%lf\n", dude->legs.legLength); fclose(dump); bu_log("Verbose Output saved\n"); @@ -1961,7 +1960,7 @@ else { /*Then check remaining strings against existing variables*/ sscanf(buffer, "%s %lf", s, &holder); - bu_log("%s, %lf\n", s, holder); + /*bu_log("%s, %lf\n", s, holder);*/ /*Big statement of matching names with variables*/ if(strcmp(s,"headSize")==0) dude->head.headSize = holder; @@ -2022,7 +2021,6 @@ } } - int ged_human(struct ged *gedp, int ac, const char *av[]) { @@ -2064,11 +2062,12 @@ /******MAGIC******/ /*Magically set pose, and apply pose to human geometry*/ /*setMeasurements(&human_data, percentile);*/ - /*humanName[MAXLENGTH]*/ + /* This applies the generic end-name to the high-level object */ bu_log("%s\n", topLevel); memset(humanName, 0, MAXLENGTH); bu_strlcpy(humanName, topLevel, MAXLENGTH); + setStance(stance, &human_data); if(human_data.textread==1) getText(&human_data); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-26 21:00:09
|
Revision: 35723 http://brlcad.svn.sourceforge.net/brlcad/?rev=35723&view=rev Author: irpguardian Date: 2009-08-26 20:59:58 +0000 (Wed, 26 Aug 2009) Log Message: ----------- Made the make-army command generate an army with variance in height. Heights from 56 inches to 66 inches currently. Automatic with the -N# command. Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-26 20:26:23 UTC (rev 35722) +++ brlcad/trunk/src/libged/human.c 2009-08-26 20:59:58 UTC (rev 35723) @@ -871,6 +871,8 @@ for(y=0; y<number; y++){ sprintf(testname, "%d", num); bu_strlcpy(suffix, testname, MAXLENGTH); + RandAuto(&dude); + Auto(&dude); makeBody(file, suffix, &dude, locations, showBoxes); VSET(locations, (locations[X]- (dude.torso.shoulderWidth + dude.arms.upperArmWidth)*4), locations[Y], 0); num++; @@ -1166,6 +1168,14 @@ dude->head.neckWidth = dude->head.headSize / 4; } +void RandAuto(struct human_data_t *dude) +{ + fastf_t X = 0; + X = ((rand()%10)+56); + dude->height = X; +} + + /** * Manually Set all data for all parts, in inches */ @@ -1961,6 +1971,8 @@ /*Then check remaining strings against existing variables*/ sscanf(buffer, "%s %lf", s, &holder); /*bu_log("%s, %lf\n", s, holder);*/ + if(holder <= 0) + bu_log("Bad inputs, zero and non-negative values for inputs!\n"); /*Big statement of matching names with variables*/ if(strcmp(s,"headSize")==0) dude->head.headSize = holder; @@ -2025,6 +2037,7 @@ ged_human(struct ged *gedp, int ac, const char *av[]) { bu_log("Entering Human Builder\n"); + srand(time(NULL)); struct wmember human; struct wmember boxes; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-26 22:07:04
|
Revision: 35724 http://brlcad.svn.sourceforge.net/brlcad/?rev=35724&view=rev Author: irpguardian Date: 2009-08-26 22:06:58 +0000 (Wed, 26 Aug 2009) Log Message: ----------- More tweaks to random army stuff. Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-26 20:59:58 UTC (rev 35723) +++ brlcad/trunk/src/libged/human.c 2009-08-26 22:06:58 UTC (rev 35724) @@ -1171,7 +1171,7 @@ void RandAuto(struct human_data_t *dude) { fastf_t X = 0; - X = ((rand()%10)+56); + X = ((rand()%12)+54); dude->height = X; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-27 13:05:37
|
Revision: 35725 http://brlcad.svn.sourceforge.net/brlcad/?rev=35725&view=rev Author: irpguardian Date: 2009-08-27 13:05:30 +0000 (Thu, 27 Aug 2009) Log Message: ----------- Fixed bug where '-n' command didn't properly rename toplevel combination. Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-26 22:06:58 UTC (rev 35724) +++ brlcad/trunk/src/libged/human.c 2009-08-27 13:05:30 UTC (rev 35725) @@ -871,7 +871,7 @@ for(y=0; y<number; y++){ sprintf(testname, "%d", num); bu_strlcpy(suffix, testname, MAXLENGTH); - RandAuto(&dude); + RandAuto(&dude); /*Generates random heights for random height, and thus random size, creation. */ Auto(&dude); makeBody(file, suffix, &dude, locations, showBoxes); VSET(locations, (locations[X]- (dude.torso.shoulderWidth + dude.arms.upperArmWidth)*4), locations[Y], 0); @@ -880,6 +880,8 @@ VSET(locations, 0, (locations[Y]- (dude.torso.shoulderWidth + dude.arms.upperArmWidth)*4), 0); } } + +/* User inputs X, Y, Z coordinates for use in manual positioning */ void grabCoordinates(fastf_t *positions) { printf("X: "); @@ -893,6 +895,9 @@ fflush(stdin); } +/** + * User manual poses the human model by inputting absolute angles for limb positions. + */ void manualPosition(struct human_data_t *dude) { vect_t positions; @@ -1074,9 +1079,6 @@ VMOVE(dude->legs.rFootDirection, forwardVect); } break; - case 6: - bu_log("Making the Thinker\n"); - break; /*Following cases are tests */ case 10: { @@ -1168,6 +1170,9 @@ dude->head.neckWidth = dude->head.headSize / 4; } +/** + * Random height generator + */ void RandAuto(struct human_data_t *dude) { fastf_t X = 0; @@ -1428,6 +1433,9 @@ return; } +/** + * User inputs the XYZ coordinates of the center point of the human model. + */ void getLocation(fastf_t *location) { fastf_t x, y, z; @@ -1445,7 +1453,7 @@ fflush(stdin); } -/* Process command line arguments */ +/* Process command line arguments, all 43 of them */ int read_args(int argc, char **argv, char *topLevel, struct human_data_t *dude, fastf_t *percentile, fastf_t *location, fastf_t *stance, fastf_t *troops, fastf_t *showBoxes) { char c = 'A'; @@ -1476,7 +1484,7 @@ fflush(stdin); break; - case 'H': + case 'H': sscanf(bu_optarg, "%f", &height); if(height < 1) { @@ -1517,6 +1525,7 @@ case 'n': memset(humanName, 0, MAXLENGTH); bu_strlcpy(humanName, bu_optarg, MAXLENGTH); + bu_strlcpy(topLevel, humanName, MAXLENGTH); fflush(stdin); have_name = 1; break; @@ -1739,7 +1748,6 @@ memset(topLevel, 0, MAXLENGTH); bu_strlcpy(humanName, DEFAULT_HUMANNAME, MAXLENGTH); bu_strlcpy(topLevel, DEFAULT_HUMANNAME, MAXLENGTH); - /* show_help(*argv, options);*/ } fflush(stdout); return(bu_optind); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-27 19:13:49
|
Revision: 35729 http://brlcad.svn.sourceforge.net/brlcad/?rev=35729&view=rev Author: irpguardian Date: 2009-08-27 19:13:41 +0000 (Thu, 27 Aug 2009) Log Message: ----------- Fixed a problem when reading in a Verbose.txt file and not properly updating some variables. Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-27 19:05:31 UTC (rev 35728) +++ brlcad/trunk/src/libged/human.c 2009-08-27 19:13:41 UTC (rev 35729) @@ -114,7 +114,7 @@ vect_t rWristDirection; }; -/** All information needed to build the legs lie here */ +/** All information needed to build the legs lies here */ struct legInfo { fastf_t legLength; @@ -137,6 +137,7 @@ enum genders { male, female }; enum ethnicities { generic, white, black, hispanic, asian, other }; /* divisions taken from army demographic sheet */ +/*Top level struct that holds all body information */ struct human_data_t { fastf_t height; /* Height of person standing, inches */ @@ -225,7 +226,10 @@ return sqrt(v + w); } -/** Create a bounding box around the individual part, this one has only 1 value for depth and width */ +/** Create a bounding box around the individual part, this one has only 1 value for depth and width. + * Currently is a big mess, as the boxes dont want to rotate in the correct mannor, and insit upon + * rotating around an incorrect vertex. + */ void boundingBox(struct rt_wdb *file, char *name, fastf_t *startPoint, fastf_t *lengthVector, fastf_t partWidth, fastf_t *rotMatrix) { /* Make the arb8/rpp that will bound the part as it were straight up and down, @@ -265,6 +269,8 @@ /* Print rotation matrix */ for(w=1; w<=16; w++){ + +/*These z,y,x, rot matrices were for debugging purposes but didn't help. */ /*Z rotation matrix */ /* if(w==1 || w==2 || w== 5 || w== 6 || w==11) * rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; @@ -334,7 +340,9 @@ } /******************************************/ +/* */ /***** Body Parts, from the head down *****/ +/* */ /******************************************/ fastf_t makeHead(struct rt_wdb (*file), char *name, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) @@ -1427,6 +1435,7 @@ "\t-v\t\tGenerate verbose output of all data used to build human model, to Verbose.txt\n" "\t-V\t\tRead verbose input of all data and build a human model, using Verbose.txt\n" "\t 1 - 9, 0, Q, and special characters are used for wizard purposes, ignore them.\n" + "\t Last word on command line is also top level object. No argument needed!\n" ); bu_vls_free(&str); @@ -1511,8 +1520,7 @@ case 'L': case 'l': - bu_log("Location\n"); Auto(dude); - + bu_log("Location\n"); getLocation(location); fflush(stdin); break; @@ -1878,7 +1886,7 @@ /** * Spit out every measurement of the model in a textfile called Verbose.txt - * Includes all measurments, sans angles. + * Includes all measurments: sans angles, joint information */ void verbose(struct human_data_t *dude) { @@ -2037,10 +2045,18 @@ } } bu_log("File read\n"); + dude->legs.legLength = dude->legs.thighLength + dude->legs.calfLength; + dude->torso.torsoLength = dude->torso.topTorsoLength + dude->torso.lowTorsoLength; + dude->height = (dude->legs.legLength + dude->torso.torsoLength + dude->head.headSize) / IN2MM; + bu_log("In Height = %lf\n", dude->height); fclose(input); } } +/** + * ged_human is the function which is called from an outside function in the /shapes directory. It's essentially a main function witout + * main. + */ int ged_human(struct ged *gedp, int ac, const char *av[]) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <irp...@us...> - 2009-08-27 21:24:48
|
Revision: 35732 http://brlcad.svn.sourceforge.net/brlcad/?rev=35732&view=rev Author: irpguardian Date: 2009-08-27 21:24:36 +0000 (Thu, 27 Aug 2009) Log Message: ----------- Various tweaks, and added comments Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-27 21:23:52 UTC (rev 35731) +++ brlcad/trunk/src/libged/human.c 2009-08-27 21:24:36 UTC (rev 35732) @@ -1188,7 +1188,6 @@ dude->height = X; } - /** * Manually Set all data for all parts, in inches */ @@ -1212,42 +1211,34 @@ scanf("%lf", &x); x=x*IN2MM; dude->torso.topTorsoLength=x; - bu_log("Shoulder Width\n"); scanf("%lf", &x); x=x*IN2MM; dude->torso.shoulderWidth=x; - bu_log("Shoulder Depth\n"); scanf("%lf", &x); x=x*IN2MM; dude->torso.shoulderDepth=x; - bu_log("Low Torso Length\n"); scanf("%lf", &x); x=x*IN2MM; dude->torso.lowTorsoLength=x; - bu_log("Ab Width\n"); scanf("%lf", &x); x=x*IN2MM; dude->torso.abWidth=x; - bu_log("Ab Depth\n"); scanf("%lf", &x); x=x*IN2MM; dude->torso.abDepth=x; - bu_log("Pelvis Width\n"); scanf("%lf", &x); x=x*IN2MM; dude->torso.pelvisWidth=x; - bu_log("Pelvis Depth\n"); scanf("%lf", &x); x=x*IN2MM; dude->torso.pelvisDepth=x; - bu_log("Upper Arm Length\n"); scanf("%lf", &x); x=x*IN2MM; @@ -1730,7 +1721,7 @@ default: show_help(*argv, options); - bu_log("%s: illegal option -- %c\n", bu_getprogname(), c); + bu_log("%s: illegal option, yes, there is a couple. -- %c\n", bu_getprogname(), c); bu_exit(EXIT_SUCCESS, NULL); fflush(stdin); break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bo...@us...> - 2009-08-31 21:37:40
|
Revision: 35804 http://brlcad.svn.sourceforge.net/brlcad/?rev=35804&view=rev Author: bob1961 Date: 2009-08-31 21:37:13 +0000 (Mon, 31 Aug 2009) Log Message: ----------- Move variable declarations to the tops of their respective code blocks (i.e. make it compile as a C file). Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-08-31 21:35:49 UTC (rev 35803) +++ brlcad/trunk/src/libged/human.c 2009-08-31 21:37:13 UTC (rev 35804) @@ -29,6 +29,7 @@ #include <stdlib.h> #include <string.h> #include <math.h> +#include <time.h> #include "bu.h" #include "vmath.h" #include "bn.h" @@ -160,6 +161,9 @@ }; +static void Auto(struct human_data_t *dude); +static void RandAuto(struct human_data_t *dude); + /** * This function takes in a vector, then applies a new direction to it * using x, y, and z degrees, and exports it to resultVect, and returns @@ -239,12 +243,13 @@ vect_t vects[8]; vect_t newVects[8]; point_t finalPoints[8]; - point_t endPoint; vect_t distance; + vect_t JVEC; char newName[MAXLENGTH] = "a"; char debug[MAXLENGTH] = "a"; int i = 0; int w=0; + bu_strlcpy(newName, name, MAXLENGTH); bu_strlcpy(debug, name, MAXLENGTH); bu_strlcat(newName, "Box", MAXLENGTH); @@ -300,7 +305,7 @@ for(i = 0; i < 8; i++){ VMOVE(finalPoints[i], newVects[i]); } - vect_t JVEC; + MAT3X3VEC(JVEC, rotMatrix, lengthVector); mk_trc_h(file, debug, startPoint, JVEC, 4, 1); mk_arb8(file, newName, *vects); @@ -1144,7 +1149,8 @@ /** * Auto Set all data for all parts, in inches */ -void Auto(struct human_data_t *dude) +static void +Auto(struct human_data_t *dude) { bu_log("Auto Setting\n"); bu_log("Height=%lf\n", dude->height); @@ -1181,7 +1187,8 @@ /** * Random height generator */ -void RandAuto(struct human_data_t *dude) +static void +RandAuto(struct human_data_t *dude) { fastf_t X = 0; X = ((rand()%12)+54); @@ -1454,7 +1461,7 @@ } /* Process command line arguments, all 43 of them */ -int read_args(int argc, char **argv, char *topLevel, struct human_data_t *dude, fastf_t *percentile, fastf_t *location, fastf_t *stance, fastf_t *troops, fastf_t *showBoxes) +int read_args(int argc, const char **argv, char *topLevel, struct human_data_t *dude, fastf_t *percentile, fastf_t *location, fastf_t *stance, fastf_t *troops, fastf_t *showBoxes) { char c = 'A'; char *options="AbH:hLlmn:N:O:o:p:s:tTvVw1:2:3:4:5:6:7:8:9:0:=:+:_:*:^:%:$:#:@:!:Q:~:Z:Y:X:"; @@ -1759,10 +1766,11 @@ */ void text(struct human_data_t *dude) { - bu_log("Ouputting text file\n"); fastf_t x=0, y=0, z=0; + FILE *dump; - FILE *dump; + bu_log("Ouputting text file\n"); + dump = fopen("Stats.txt", "w+"); fprintf(dump, "Name, X, Y, Z, all in millimeters\n"); @@ -1881,8 +1889,9 @@ */ void verbose(struct human_data_t *dude) { + FILE *dump; + bu_log("Verbose Text Dump\n"); - FILE *dump; dump = fopen("Verbose.txt", "w+"); fprintf(dump, "#All Sizes are in mm\n"); @@ -1924,10 +1933,11 @@ */ void getText(struct human_data_t *dude) { - bu_log("Reading Textfile for Input\n"); char buffer[80]; FILE *input; + bu_log("Reading Textfile for Input\n"); + input = fopen("Stats.txt", "r"); if(input==NULL) { @@ -1950,12 +1960,13 @@ void verbIn(struct human_data_t *dude) { - bu_log("Reading textfile for all measurements\n"); char buffer[80]; char s[80]; fastf_t holder; FILE *input; + bu_log("Reading textfile for all measurements\n"); + input = fopen("Verbose.txt", "r"); if(input == NULL) { bu_log("Non-existant input file\n"); @@ -2051,9 +2062,6 @@ int ged_human(struct ged *gedp, int ac, const char *av[]) { - bu_log("Entering Human Builder\n"); - srand(time(NULL)); - struct wmember human; struct wmember boxes; struct wmember hollow; @@ -2067,12 +2075,15 @@ int ret; int is_region = 0; unsigned char rgb[3], rgb2[3], rgb3[3]; - human_data.height = DEFAULT_HEIGHT_INCHES; - VSET(location, 0, 0, 0); /* Default standing location */ char topLevel[MAXLENGTH]=""; int textDump = 0; int textRead = 0; + bu_log("Entering Human Builder\n"); + srand(time(NULL)); + human_data.height = DEFAULT_HEIGHT_INCHES; + VSET(location, 0, 0, 0); /* Default standing location */ + bu_vls_init(&name); bu_vls_init(&str); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-11-10 23:38:01
|
Revision: 36467 http://brlcad.svn.sourceforge.net/brlcad/?rev=36467&view=rev Author: brlcad Date: 2009-11-10 23:37:42 +0000 (Tue, 10 Nov 2009) Log Message: ----------- looks like human has the same problem as kill, need to init bu_getopt() Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-11-10 22:17:13 UTC (rev 36466) +++ brlcad/trunk/src/libged/human.c 2009-11-10 23:37:42 UTC (rev 36467) @@ -1474,7 +1474,7 @@ /* don't report errors */ bu_opterr = 0; - + bu_optind = 1; while ((c=bu_getopt(argc, (char * const *)argv, options)) != EOF) { /*bu_log("%c \n", c); Testing to see if args are getting read */ switch (c) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-12-11 03:36:36
|
Revision: 36883 http://brlcad.svn.sourceforge.net/brlcad/?rev=36883&view=rev Author: brlcad Date: 2009-12-11 03:36:28 +0000 (Fri, 11 Dec 2009) Log Message: ----------- include documentation provided by rain weaver on where the articulation points should be for the various joints. Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2009-12-11 03:29:51 UTC (rev 36882) +++ brlcad/trunk/src/libged/human.c 2009-12-11 03:36:28 UTC (rev 36883) @@ -20,7 +20,59 @@ /** @file human.c * * Generator for human models based on height, and other stuff eventually, - * and for the humanwizard plugin (mostly) + * and for the humanwizard plugin (mostly). + * + * Here is a description of where the bounding boxes should be + * pivoting for each joint during articulation: + * + * head.r and neck.r + * - the pivot point is located on the XY center of the top of the + * neck.r. + * + * neck.r and upperchest.r + * - The neck.r pivots from the top XY center of the upperchest.r. + * + * shoulder*.r + * - The shoulder*.r pivots around the X-axis in its XYZ center (half + * the distance in each axis to reach the center of the box). + * + * upperchest.r and lowerchest.r + * - No movement, but the upperchest.r is specifically centered above + * the lowerchest.r. + * + * shoulder*.r and lowerchest.r + * - No movement, but the shoulder*.r and upperchest.r align + * horizontally (along the X-axis) and are together centered over + * the lowerchest.r. + * + * lowerchest.r and hips.r + * - No movement, but the lowerchest.r is aligned specifically + * centered above the hips.r. + * + * hips.r and thigh*.r + * - There are two pivot points, one for the thighL.r and the other + * for the thighR.r Divide the hips.r box in half in the X + * direction, and find the XY centers of each. These pivot points + * are at the base of the hips.r. + * + * thigh*.r and calf*.r + * - The pivot point occurs at the XY center of the thigh*.r base. + * + * calf*.r and foot*r + * - The pivot point of the foot*.r is located in XYZ center of the + * overlap, meaning half way across the X-axis, Y-axis, and Z-axis + * of all area of the foot*.r overlapped by the calf*.r. + * + * shoulder*.r and upperarm*.r + * - The pivot point occurs at the XY center of the top of the + * upperarm*.r. + * + * upperarm*.r and forearm*.r + * - The pivot point occurs at the XY center of the upperarm*.r base. + * + * forearm*.r and hand*.r + * - The pivot point occurs at the XY center of the forearm*.r base. + * */ #include "common.h" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2010-04-22 19:17:09
|
Revision: 38757 http://brlcad.svn.sourceforge.net/brlcad/?rev=38757&view=rev Author: brlcad Date: 2010-04-22 19:17:00 +0000 (Thu, 22 Apr 2010) Log Message: ----------- ws, style, indent, consistency fixes. add HIDDEN to all of the local funcs and remove forward decls. Modified Paths: -------------- brlcad/trunk/src/libged/human.c Modified: brlcad/trunk/src/libged/human.c =================================================================== --- brlcad/trunk/src/libged/human.c 2010-04-22 19:08:56 UTC (rev 38756) +++ brlcad/trunk/src/libged/human.c 2010-04-22 19:17:00 UTC (rev 38757) @@ -108,148 +108,157 @@ /** Location of all joints on the body located here */ struct jointInfo { - point_t headJoint; - point_t neckJoint; - point_t leftShoulderJoint; - point_t rightShoulderJoint; - point_t elbowJoint; - point_t wristJoint; - point_t abdomenJoint; - point_t pelvisJoint; - point_t leftThighJoint; - point_t rightThighJoint; - point_t kneeJoint; - point_t ankleJoint; + point_t headJoint; + point_t neckJoint; + point_t leftShoulderJoint; + point_t rightShoulderJoint; + point_t elbowJoint; + point_t wristJoint; + point_t abdomenJoint; + point_t pelvisJoint; + point_t leftThighJoint; + point_t rightThighJoint; + point_t kneeJoint; + point_t ankleJoint; }; + /** Information for building the head */ struct headInfo { - fastf_t headSize; - fastf_t neckLength, neckWidth; + fastf_t headSize; + fastf_t neckLength, neckWidth; - vect_t headVector; - vect_t neckVector; + vect_t headVector; + vect_t neckVector; }; + /** All information needed to build the torso lies here */ struct torsoInfo { - fastf_t torsoLength; - fastf_t topTorsoLength, lowTorsoLength; - fastf_t shoulderWidth; - fastf_t shoulderDepth; - fastf_t abWidth; - fastf_t abDepth; - fastf_t pelvisWidth; - fastf_t pelvisDepth; + fastf_t torsoLength; + fastf_t topTorsoLength, lowTorsoLength; + fastf_t shoulderWidth; + fastf_t shoulderDepth; + fastf_t abWidth; + fastf_t abDepth; + fastf_t pelvisWidth; + fastf_t pelvisDepth; - vect_t topTorsoVector; - vect_t lowTorsoVector; + vect_t topTorsoVector; + vect_t lowTorsoVector; }; + /** All information needed to build the arms lie here */ struct armInfo { - fastf_t armLength; - fastf_t upperArmWidth; - fastf_t upperArmLength; - fastf_t lowerArmLength, elbowWidth; - fastf_t wristWidth; - fastf_t handLength, handWidth; + fastf_t armLength; + fastf_t upperArmWidth; + fastf_t upperArmLength; + fastf_t lowerArmLength, elbowWidth; + fastf_t wristWidth; + fastf_t handLength, handWidth; - vect_t armVector; - vect_t lArmDirection; /* Arm direction vectors */ - vect_t rArmDirection; - vect_t lElbowDirection; - vect_t rElbowDirection; - vect_t lWristDirection; - vect_t rWristDirection; + vect_t armVector; + vect_t lArmDirection; /* Arm direction vectors */ + vect_t rArmDirection; + vect_t lElbowDirection; + vect_t rElbowDirection; + vect_t lWristDirection; + vect_t rWristDirection; }; + /** All information needed to build the legs lies here */ struct legInfo { - fastf_t legLength; - fastf_t thighLength, thighWidth; - fastf_t calfLength, kneeWidth; - fastf_t footLength, ankleWidth; - fastf_t toeWidth; + fastf_t legLength; + fastf_t thighLength, thighWidth; + fastf_t calfLength, kneeWidth; + fastf_t footLength, ankleWidth; + fastf_t toeWidth; - vect_t thighVector; - vect_t calfVector; - vect_t footVector; - vect_t lLegDirection; /* Leg direction vectors */ - vect_t rLegDirection; - vect_t lKneeDirection; - vect_t rKneeDirection; - vect_t lFootDirection; - vect_t rFootDirection; + vect_t thighVector; + vect_t calfVector; + vect_t footVector; + vect_t lLegDirection; /* Leg direction vectors */ + vect_t rLegDirection; + vect_t lKneeDirection; + vect_t rKneeDirection; + vect_t lFootDirection; + vect_t rFootDirection; }; + enum genders { male, female }; enum ethnicities { generic, white, black, hispanic, asian, other }; /* divisions taken from army demographic sheet */ /*Top level struct that holds all body information */ struct human_data_t { - fastf_t height; /* Height of person standing, inches */ - int age; /* Age of person, (still relevant?) */ - enum genders gender; /* Gender of person */ - enum ethnicities ethnicity; /* Ethnicity of person */ + fastf_t height; /* Height of person standing, inches */ + int age; /* Age of person, (still relevant?) */ + enum genders gender; /* Gender of person */ + enum ethnicities ethnicity; /* Ethnicity of person */ - /* Various part lengths */ - struct headInfo head; - struct torsoInfo torso; - struct armInfo arms; - struct legInfo legs; - struct jointInfo joints; + /* Various part lengths */ + struct headInfo head; + struct torsoInfo torso; + struct armInfo arms; + struct legInfo legs; + struct jointInfo joints; - /* Various triggers */ - int textread; - int textwrite; - int verbread; - int verbwrite; + /* Various triggers */ + int textread; + int textwrite; + int verbread; + int verbwrite; }; -static void Auto(struct human_data_t *dude); -static void RandAuto(struct human_data_t *dude); +HIDDEN void Auto(struct human_data_t *dude); +HIDDEN void RandAuto(struct human_data_t *dude); + /** * This function takes in a vector, then applies a new direction to it - * using x, y, and z degrees, and exports it to resultVect, and returns - * the distance of the vector. + * using x, y, and z degrees, and exports it to resultVect, and + * returns the distance of the vector. */ -fastf_t setDirection(fastf_t *inVect, fastf_t *resultVect, fastf_t *outMatrix, fastf_t x, fastf_t y, fastf_t z) +HIDDEN fastf_t +setDirection(fastf_t *inVect, fastf_t *resultVect, fastf_t *outMatrix, fastf_t x, fastf_t y, fastf_t z) { - vect_t outVect; - mat_t rotMatrix; - MAT_ZERO(rotMatrix); + vect_t outVect; + mat_t rotMatrix; + MAT_ZERO(rotMatrix); - /* - * x y z placed inside rotation matrix and applied to vector. - * bn_mat_angles(rotMatrix, x, y, z) matrix rot in degrees - * MAT4X3VEC(outVect, rotMatrix, inVect); - */ - bn_mat_angles(rotMatrix, x, y, z); - MAT3X3VEC(outVect, rotMatrix, inVect); + /* + * x y z placed inside rotation matrix and applied to vector. + * bn_mat_angles(rotMatrix, x, y, z) matrix rot in degrees + * MAT4X3VEC(outVect, rotMatrix, inVect); + */ + bn_mat_angles(rotMatrix, x, y, z); + MAT3X3VEC(outVect, rotMatrix, inVect); /* Print rotation matrix * int i=0; - * for(i=1; i<=16; i++){ + * for (i=1; i<=16; i++) { * bu_log("%3.4f\t", rotMatrix[(i-1)]); - * if(i%4==0) + * if (i%4==0) * bu_log("\n"); * } */ - VMOVE(resultVect, outVect); - /*return MAGNITUDE(outVect);*/ - MAT_COPY(outMatrix, rotMatrix); - return *rotMatrix; + VMOVE(resultVect, outVect); + /*return MAGNITUDE(outVect);*/ + MAT_COPY(outMatrix, rotMatrix); + return *rotMatrix; } -void vectorTest(struct rt_wdb *file) + +HIDDEN void +vectorTest(struct rt_wdb *file) { /* * This code here takes a direction vector, and then redirects it based on the angles given @@ -272,287 +281,310 @@ /* See, now wasn't that easy? */ } + /* Find the hypotenuse of 2 lengths / length vectors */ -fastf_t findVector(fastf_t x, fastf_t y) +HIDDEN fastf_t +findVector(fastf_t x, fastf_t y) { - fastf_t w; - fastf_t v; - v = x*x; - w = y*y; - return sqrt(v + w); + fastf_t w; + fastf_t v; + v = x*x; + w = y*y; + return sqrt(v + w); } -/** Create a bounding box around the individual part, this one has only 1 value for depth and width. - * Currently is a big mess, as the boxes dont want to rotate in the correct mannor, and insit upon - * rotating around an incorrect vertex. + +/** + * Create a bounding box around the individual part, this one has only + * 1 value for depth and width. Currently is a big mess, as the boxes + * dont want to rotate in the correct mannor, and insit upon rotating + * around an incorrect vertex. */ -void boundingBox(struct rt_wdb *file, char *name, fastf_t *startPoint, fastf_t *lengthVector, fastf_t partWidth, fastf_t *rotMatrix) +HIDDEN void +boundingBox(struct rt_wdb *file, char *name, fastf_t *startPoint, fastf_t *lengthVector, fastf_t partWidth, fastf_t *rotMatrix) { - /* Make the arb8/rpp that will bound the part as it were straight up and down, - * And then rotate it to the current position as given in rotMatrix, - * followed by naming it by taking name, and cat-ing BOX to the end of it. - */ - vect_t vects[8]; - vect_t newVects[8]; - point_t finalPoints[8]; - vect_t distance; - vect_t JVEC; - char newName[MAXLENGTH] = "a"; - char debug[MAXLENGTH] = "a"; - int i = 0; - int w=0; + /* Make the arb8/rpp that will bound the part as it were straight up and down, + * And then rotate it to the current position as given in rotMatrix, + * followed by naming it by taking name, and cat-ing BOX to the end of it. + */ + vect_t vects[8]; + vect_t newVects[8]; + point_t finalPoints[8]; + vect_t distance; + vect_t JVEC; + char newName[MAXLENGTH] = "a"; + char debug[MAXLENGTH] = "a"; + int i = 0; + int w=0; - bu_strlcpy(newName, name, MAXLENGTH); - bu_strlcpy(debug, name, MAXLENGTH); - bu_strlcat(newName, "Box", MAXLENGTH); - bu_strlcat(debug, "Joint", MAXLENGTH); + bu_strlcpy(newName, name, MAXLENGTH); + bu_strlcpy(debug, name, MAXLENGTH); + bu_strlcat(newName, "Box", MAXLENGTH); + bu_strlcat(debug, "Joint", MAXLENGTH); - VADD2(distance, startPoint, lengthVector); - VSET(distance, distance[X], distance[Y], startPoint[Z]-lengthVector[Z]); + VADD2(distance, startPoint, lengthVector); + VSET(distance, distance[X], distance[Y], startPoint[Z]-lengthVector[Z]); - VSET(vects[0], (-partWidth+startPoint[X]), (-partWidth+startPoint[Y]), (startPoint[Z])); - VSET(vects[1], (-partWidth+startPoint[X]), (partWidth+startPoint[Y]), (startPoint[Z])); - VSET(vects[2], (partWidth+startPoint[X]), (partWidth+startPoint[Y]), (startPoint[Z])); - VSET(vects[3], (partWidth+startPoint[X]), (-partWidth+startPoint[Y]), (startPoint[Z])); - VSET(vects[4], (-partWidth+startPoint[X]), (-partWidth+startPoint[Y]), (distance[Z])); - VSET(vects[5], (-partWidth+startPoint[X]), (partWidth+startPoint[Y]), (distance[Z])); - VSET(vects[6], (partWidth+startPoint[X]), (partWidth+startPoint[Y]), (distance[Z])); - VSET(vects[7], (partWidth+startPoint[X]), (-partWidth+startPoint[Y]), (distance[Z])); + VSET(vects[0], (-partWidth+startPoint[X]), (-partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[1], (-partWidth+startPoint[X]), (partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[2], (partWidth+startPoint[X]), (partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[3], (partWidth+startPoint[X]), (-partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[4], (-partWidth+startPoint[X]), (-partWidth+startPoint[Y]), (distance[Z])); + VSET(vects[5], (-partWidth+startPoint[X]), (partWidth+startPoint[Y]), (distance[Z])); + VSET(vects[6], (partWidth+startPoint[X]), (partWidth+startPoint[Y]), (distance[Z])); + VSET(vects[7], (partWidth+startPoint[X]), (-partWidth+startPoint[Y]), (distance[Z])); - for(i = 0; i<8; i++) - { - vects[i][Y]*=-1; - } + for (i = 0; i<8; i++) { + vects[i][Y]*=-1; + } /* Print rotation matrix */ - for(w=1; w<=16; w++){ + for (w=1; w<=16; w++) { -/*These z,y,x, rot matrices were for debugging purposes but didn't help. */ +/*These z, y, x, rot matrices were for debugging purposes but didn't help. */ /*Z rotation matrix */ -/* if(w==1 || w==2 || w== 5 || w== 6 || w==11) -* rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; -*/ +/* if (w==1 || w==2 || w== 5 || w== 6 || w==11) + * rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; + */ /*Y rotation Matrix */ -/* if(w==1 || w==3 || w== 6 || w==9 || w==11) -* rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; -*/ +/* if (w==1 || w==3 || w== 6 || w==9 || w==11) + * rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; + */ /*X rotation Matrix */ -/* if(w==1 || w==6 || w== 7 || w==10 || w==11) -* rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; -*/ +/* if (w==1 || w==6 || w== 7 || w==10 || w==11) + * rotMatrix[(w-1)] = rotMatrix[(w-1)] * -1; + */ /* -* bu_log("%3.4f\t", rotMatrix[(w-1)]); -* if(w%4==0) -* bu_log("\n"); -*/ - } + * bu_log("%3.4f\t", rotMatrix[(w-1)]); + * if (w%4==0) + * bu_log("\n"); + */ + } /* bu_log("-------------------------------+\n"); -*/ - /* MAT4X3VEC, rotate a vector about a center point, by a rotmatrix, MAT4X3VEC(new, rotmatrix, old) */ - for(i = 0; i < 8; i++){ - MAT4X3VEC(newVects[i], rotMatrix, vects[i]); - } + */ + /* MAT4X3VEC, rotate a vector about a center point, by a rotmatrix, MAT4X3VEC(new, rotmatrix, old) */ + for (i = 0; i < 8; i++) { + MAT4X3VEC(newVects[i], rotMatrix, vects[i]); + } - /* Set points to be at end of each vector */ - for(i = 0; i < 8; i++){ - VMOVE(finalPoints[i], newVects[i]); - } + /* Set points to be at end of each vector */ + for (i = 0; i < 8; i++) { + VMOVE(finalPoints[i], newVects[i]); + } - MAT3X3VEC(JVEC, rotMatrix, lengthVector); - mk_trc_h(file, debug, startPoint, JVEC, 4, 1); - mk_arb8(file, newName, *vects); + MAT3X3VEC(JVEC, rotMatrix, lengthVector); + mk_trc_h(file, debug, startPoint, JVEC, 4, 1); + mk_arb8(file, newName, *vects); } -/** Create a bounding rectangle around the individual part, and this one has 2 separate values for depth and width */ -void boundingRectangle(struct rt_wdb *file, char *name, fastf_t *startPoint, fastf_t *lengthVector, fastf_t partWidth, fastf_t partDepth, fastf_t *rotMatrix) + +/** + * Create a bounding rectangle around the individual part, and this + * one has 2 separate values for depth and width + */ +HIDDEN void +boundingRectangle(struct rt_wdb *file, char *name, fastf_t *startPoint, fastf_t *lengthVector, fastf_t partWidth, fastf_t partDepth, fastf_t *rotMatrix) { - /* Make the arb8/rpp that will bound the part as it were straight up and down, - * And then rotate it to the current position as given in rotMatrix, - * followed by naming it by taking name, and cat-ing BOX to the end of it. - */ - vect_t vects[8]; - vect_t distance; - char newName[MAXLENGTH] = "a"; + /* Make the arb8/rpp that will bound the part as it were straight + * up and down, And then rotate it to the current position as + * given in rotMatrix, followed by naming it by taking name, and + * cat-ing BOX to the end of it. + */ + vect_t vects[8]; + vect_t distance; + char newName[MAXLENGTH] = "a"; - bu_strlcpy(newName, name, MAXLENGTH); - bu_strlcat(newName, "Box", MAXLENGTH); + bu_strlcpy(newName, name, MAXLENGTH); + bu_strlcat(newName, "Box", MAXLENGTH); - VADD2(distance, startPoint, lengthVector); - VSET(distance, distance[X], distance[Y], startPoint[Z]-lengthVector[Z]); + VADD2(distance, startPoint, lengthVector); + VSET(distance, distance[X], distance[Y], startPoint[Z]-lengthVector[Z]); - /* Set first 4 points to be on the same plane as the starting point, and the last 4 points to be the distance vector point plane */ + /* Set first 4 points to be on the same plane as the starting point, and the last 4 points to be the distance vector point plane */ /* -* fastf_t length=findVector(partWidth, partWidth); -*/ - VSET(vects[0], (-partDepth+startPoint[X]), (-partWidth+startPoint[Y]), (startPoint[Z])); - VSET(vects[1], (-partDepth+startPoint[X]), (partWidth+startPoint[Y]), (startPoint[Z])); - VSET(vects[2], (partDepth+startPoint[X]), (partWidth+startPoint[Y]), (startPoint[Z])); - VSET(vects[3], (partDepth+startPoint[X]), (-partWidth+startPoint[Y]), (startPoint[Z])); - VSET(vects[4], (-partDepth+startPoint[X]), (-partWidth+startPoint[Y]), (distance[Z])); - VSET(vects[5], (-partDepth+startPoint[X]), (partWidth+startPoint[Y]), (distance[Z])); - VSET(vects[6], (partDepth+startPoint[X]), (partWidth+startPoint[Y]), (distance[Z])); - VSET(vects[7], (partDepth+startPoint[X]), (-partWidth+startPoint[Y]), (distance[Z])); + * fastf_t length=findVector(partWidth, partWidth); + */ + VSET(vects[0], (-partDepth+startPoint[X]), (-partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[1], (-partDepth+startPoint[X]), (partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[2], (partDepth+startPoint[X]), (partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[3], (partDepth+startPoint[X]), (-partWidth+startPoint[Y]), (startPoint[Z])); + VSET(vects[4], (-partDepth+startPoint[X]), (-partWidth+startPoint[Y]), (distance[Z])); + VSET(vects[5], (-partDepth+startPoint[X]), (partWidth+startPoint[Y]), (distance[Z])); + VSET(vects[6], (partDepth+startPoint[X]), (partWidth+startPoint[Y]), (distance[Z])); + VSET(vects[7], (partDepth+startPoint[X]), (-partWidth+startPoint[Y]), (distance[Z])); - mk_arb8(file, newName, *vects); + mk_arb8(file, newName, *vects); } + /******************************************/ /* */ /***** Body Parts, from the head down *****/ /* */ /******************************************/ -fastf_t makeHead(struct rt_wdb (*file), char *name, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) +HIDDEN fastf_t +makeHead(struct rt_wdb (*file), char *name, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) { - fastf_t head = dude->head.headSize / 2; - vect_t startVector, lengthVector; - point_t headFix; - mat_t rotMatrix; - /*Length vector is just the diameter of the head, currently*/ - VSET(lengthVector, 0, 0, dude->head.headSize); - VSET(startVector, 0, 0, 0); - setDirection(startVector, dude->head.headVector, rotMatrix, direction[X], direction[Y], direction[Z]); - mk_sph(file, name, dude->joints.headJoint, head); + fastf_t head = dude->head.headSize / 2; + vect_t startVector, lengthVector; + point_t headFix; + mat_t rotMatrix; + /*Length vector is just the diameter of the head, currently*/ + VSET(lengthVector, 0, 0, dude->head.headSize); + VSET(startVector, 0, 0, 0); + setDirection(startVector, dude->head.headVector, rotMatrix, direction[X], direction[Y], direction[Z]); + mk_sph(file, name, dude->joints.headJoint, head); - VSET(headFix, dude->joints.headJoint[X], dude->joints.headJoint[Y], dude->joints.headJoint[Z]+head); + VSET(headFix, dude->joints.headJoint[X], dude->joints.headJoint[Y], dude->joints.headJoint[Z]+head); - if(showBoxes){ - boundingBox(file, name, headFix, lengthVector, (lengthVector[Z]/2), rotMatrix); - } - return 0; + if (showBoxes) { + boundingBox(file, name, headFix, lengthVector, (lengthVector[Z]/2), rotMatrix); + } + return 0; } -fastf_t makeNeck(struct rt_wdb *file, char *name, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) + +HIDDEN fastf_t +makeNeck(struct rt_wdb *file, char *name, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) { - vect_t startVector; - mat_t rotMatrix; - VSET(startVector, 0, 0, dude->head.neckLength); - setDirection(startVector, dude->head.neckVector, rotMatrix, direction[X], direction[Y], direction[Z]); - VADD2(dude->joints.neckJoint, dude->joints.headJoint, dude->head.neckVector); - mk_rcc(file, name, dude->joints.headJoint, dude->head.neckVector, dude->head.neckWidth); + vect_t startVector; + mat_t rotMatrix; + VSET(startVector, 0, 0, dude->head.neckLength); + setDirection(startVector, dude->head.neckVector, rotMatrix, direction[X], direction[Y], direction[Z]); + VADD2(dude->joints.neckJoint, dude->joints.headJoint, dude->head.neckVector); + mk_rcc(file, name, dude->joints.headJoint, dude->head.neckVector, dude->head.neckWidth); - if(showBoxes){ - boundingBox(file, name, dude->joints.headJoint, startVector, dude->head.neckWidth, rotMatrix); - } - return dude->head.neckWidth; + if (showBoxes) { + boundingBox(file, name, dude->joints.headJoint, startVector, dude->head.neckWidth, rotMatrix); + } + return dude->head.neckWidth; } -fastf_t makeUpperTorso(struct rt_wdb *file, char *name, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) + +HIDDEN fastf_t +makeUpperTorso(struct rt_wdb *file, char *name, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) { - vect_t startVector; - vect_t a, b, c, d; - vect_t leftVector, rightVector; - mat_t rotMatrix; + vect_t startVector; + vect_t a, b, c, d; + vect_t leftVector, rightVector; + mat_t rotMatrix; - /* Set length of top torso portion */ - VSET(startVector, 0, 0, dude->torso.topTorsoLength); - setDirection(startVector, dude->torso.topTorsoVector, rotMatrix, direction[X], direction[Y], direction[Z]); - VADD2(dude->joints.abdomenJoint, dude->joints.neckJoint, dude->torso.topTorsoVector); + /* Set length of top torso portion */ + VSET(startVector, 0, 0, dude->torso.topTorsoLength); + setDirection(startVector, dude->torso.topTorsoVector, rotMatrix, direction[X], direction[Y], direction[Z]); + VADD2(dude->joints.abdomenJoint, dude->joints.neckJoint, dude->torso.topTorsoVector); - /* change shoulder joints to match up to torso */ - VSET(leftVector, 0, (dude->torso.shoulderWidth+(dude->arms.upperArmWidth)), 0); - VSET(rightVector, 0, (dude->torso.shoulderWidth+(dude->arms.upperArmWidth))*-1, 0); + /* change shoulder joints to match up to torso */ + VSET(leftVector, 0, (dude->torso.shoulderWidth+(dude->arms.upperArmWidth)), 0); + VSET(rightVector, 0, (dude->torso.shoulderWidth+(dude->arms.upperArmWidth))*-1, 0); - VADD2(dude->joints.leftShoulderJoint, dude->joints.neckJoint, leftVector); - VADD2(dude->joints.rightShoulderJoint, dude->joints.neckJoint, rightVector); + VADD2(dude->joints.leftShoulderJoint, dude->joints.neckJoint, leftVector); + VADD2(dude->joints.rightShoulderJoint, dude->joints.neckJoint, rightVector); - /*Take shoulder width, and abWidth and convert values to vectors for tgc */ - VSET(a, (dude->torso.shoulderDepth), 0, 0); - VSET(b, 0, dude->torso.shoulderWidth, 0); - VSET(c, (dude->torso.abDepth), 0, 0); - VSET(d, 0, (dude->torso.abWidth), 0); + /*Take shoulder width, and abWidth and convert values to vectors for tgc */ + VSET(a, (dude->torso.shoulderDepth), 0, 0); + VSET(b, 0, dude->torso.shoulderWidth, 0); + VSET(c, (dude->torso.abDepth), 0, 0); + VSET(d, 0, (dude->torso.abWidth), 0); - /* Torso will be an ellipsoidal tgc, for more realistic shape */ - mk_tgc(file, name, dude->joints.neckJoint, dude->torso.topTorsoVector, a, b, c, d); + /* Torso will be an ellipsoidal tgc, for more realistic shape */ + mk_tgc(file, name, dude->joints.neckJoint, dude->torso.topTorsoVector, a, b, c, d); - if(showBoxes){ - boundingRectangle(file, name, dude->joints.neckJoint, startVector, dude->torso.shoulderWidth, (dude->torso.shoulderWidth/2), rotMatrix); - } - return dude->torso.abWidth; + if (showBoxes) { + boundingRectangle(file, name, dude->joints.neckJoint, startVector, dude->torso.shoulderWidth, (dude->torso.shoulderWidth/2), rotMatrix); + } + return dude->torso.abWidth; } -fastf_t makeLowerTorso(struct rt_wdb *file, char *name, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) + +HIDDEN fastf_t +makeLowerTorso(struct rt_wdb *file, char *name, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) { - vect_t startVector, leftVector, rightVector; - vect_t a, b, c, d; - mat_t rotMatrix; + vect_t startVector, leftVector, rightVector; + vect_t a, b, c, d; + mat_t rotMatrix; - VSET(startVector, 0, 0, dude->torso.lowTorsoLength); - setDirection(startVector, dude->torso.lowTorsoVector, rotMatrix, direction[X], direction[Y], direction[Z]); - VADD2(dude->joints.pelvisJoint, dude->joints.abdomenJoint, dude->torso.lowTorsoVector); + VSET(startVector, 0, 0, dude->torso.lowTorsoLength); + setDirection(startVector, dude->torso.lowTorsoVector, rotMatrix, direction[X], direction[Y], direction[Z]); + VADD2(dude->joints.pelvisJoint, dude->joints.abdomenJoint, dude->torso.lowTorsoVector); - /* Set locations of legs */ - VSET(leftVector, 0, (dude->torso.pelvisWidth/2), 0); - VSET(rightVector, 0, ((dude->torso.pelvisWidth/2)*-1), 0); - VADD2(dude->joints.leftThighJoint, dude->joints.pelvisJoint, leftVector); - VADD2(dude->joints.rightThighJoint, dude->joints.pelvisJoint, rightVector); + /* Set locations of legs */ + VSET(leftVector, 0, (dude->torso.pelvisWidth/2), 0); + VSET(rightVector, 0, ((dude->torso.pelvisWidth/2)*-1), 0); + VADD2(dude->joints.leftThighJoint, dude->joints.pelvisJoint, leftVector); + VADD2(dude->joints.rightThighJoint, dude->joints.pelvisJoint, rightVector); - VSET(a, (dude->torso.abDepth), 0, 0); - VSET(b, 0, dude->torso.abWidth, 0); - VSET(c, (dude->torso.pelvisDepth), 0, 0); - VSET(d, 0, dude->torso.pelvisWidth, 0); + VSET(a, (dude->torso.abDepth), 0, 0); + VSET(b, 0, dude->torso.abWidth, 0); + VSET(c, (dude->torso.pelvisDepth), 0, 0); + VSET(d, 0, dude->torso.pelvisWidth, 0); - mk_tgc(file, name, dude->joints.abdomenJoint, dude->torso.lowTorsoVector, a, b, c, d); + mk_tgc(file, name, dude->joints.abdomenJoint, dude->torso.lowTorsoVector, a, b, c, d); /* * mk_trc_h(file, name, abdomenJoint, lowTorsoVector, abWidth, pelvisWidth); */ - if(showBoxes){ - boundingRectangle(file, name, dude->joints.abdomenJoint, startVector, dude->torso.pelvisWidth, (dude->torso.pelvisWidth/2), rotMatrix); - } - return dude->torso.pelvisWidth; + if (showBoxes) { + boundingRectangle(file, name, dude->joints.abdomenJoint, startVector, dude->torso.pelvisWidth, (dude->torso.pelvisWidth/2), rotMatrix); + } + return dude->torso.pelvisWidth; } -fastf_t makeShoulderJoint(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) + +HIDDEN fastf_t +makeShoulderJoint(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) { - vect_t startVector, lengthVector; - point_t leftFix, rightFix; - fastf_t shoulder; - mat_t rotMatrix; - VSET(startVector, 0, 0, dude->arms.upperArmWidth*2); - VSET(lengthVector, 0, 0, dude->arms.upperArmWidth); - shoulder = dude->arms.upperArmWidth; + vect_t startVector, lengthVector; + point_t leftFix, rightFix; + fastf_t shoulder; + mat_t rotMatrix; + VSET(startVector, 0, 0, dude->arms.upperArmWidth*2); + VSET(lengthVector, 0, 0, dude->arms.upperArmWidth); + shoulder = dude->arms.upperArmWidth; - if(isLeft) - mk_sph(file, name, dude->joints.leftShoulderJoint, (dude->arms.upperArmWidth)); - else - mk_sph(file, name, dude->joints.rightShoulderJoint, (dude->arms.upperArmWidth)); + if (isLeft) + mk_sph(file, name, dude->joints.leftShoulderJoint, (dude->arms.upperArmWidth)); + else + mk_sph(file, name, dude->joints.rightShoulderJoint, (dude->arms.upperArmWidth)); - if(showBoxes){ - if(isLeft){ - setDirection(startVector, lengthVector, rotMatrix, dude->arms.lArmDirection[X], dude->arms.lArmDirection[Y], dude->arms.lArmDirection[Z]); - VSET(leftFix, dude->joints.leftShoulderJoint[X], dude->joints.leftShoulderJoint[Y], (dude->joints.leftShoulderJoint[Z]-shoulder)); - boundingBox(file, name, leftFix, lengthVector, (lengthVector[Z]/2), rotMatrix); - } - else{ - setDirection(startVector, lengthVector, rotMatrix, dude->arms.rArmDirection[X], dude->arms.rArmDirection[Y], dude->arms.rArmDirection[Z]); - VSET(rightFix, dude->joints.rightShoulderJoint[X], dude->joints.rightShoulderJoint[Y], (dude->joints.rightShoulderJoint[Z]-shoulder)); - boundingBox(file, name, rightFix, lengthVector, (lengthVector[Z]/2), rotMatrix); - } - } - return dude->torso.shoulderWidth; + if (showBoxes) { + if (isLeft) { + setDirection(startVector, lengthVector, rotMatrix, dude->arms.lArmDirection[X], dude->arms.lArmDirection[Y], dude->arms.lArmDirection[Z]); + VSET(leftFix, dude->joints.leftShoulderJoint[X], dude->joints.leftShoulderJoint[Y], (dude->joints.leftShoulderJoint[Z]-shoulder)); + boundingBox(file, name, leftFix, lengthVector, (lengthVector[Z]/2), rotMatrix); + } else{ + setDirection(startVector, lengthVector, rotMatrix, dude->arms.rArmDirection[X], dude->arms.rArmDirection[Y], dude->arms.rArmDirection[Z]); + VSET(rightFix, dude->joints.rightShoulderJoint[X], dude->joints.rightShoulderJoint[Y], (dude->joints.rightShoulderJoint[Z]-shoulder)); + boundingBox(file, name, rightFix, lengthVector, (lengthVector[Z]/2), rotMatrix); + } + } + return dude->torso.shoulderWidth; } -fastf_t makeShoulder(struct rt_wdb *file, fastf_t isLeft, char *partName, struct human_data_t *dude, fastf_t showBoxes) + +HIDDEN fastf_t +makeShoulder(struct rt_wdb *file, fastf_t isLeft, char *partName, struct human_data_t *dude, fastf_t showBoxes) { - return 1; + return 1; } -fastf_t makeUpperArm(struct rt_wdb *file, fastf_t isLeft, char *partName, struct human_data_t *dude, fastf_t showBoxes) + +HIDDEN fastf_t +makeUpperArm(struct rt_wdb *file, fastf_t isLeft, char *partName, struct human_data_t *dude, fastf_t showBoxes) { - vect_t startVector; - mat_t rotMatrix; + vect_t startVector; + mat_t rotMatrix; - VSET(startVector, 0, 0, dude->arms.upperArmLength); - if(isLeft){ - setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.lArmDirection[X], dude->arms.lArmDirection[Y], dude->arms.lArmDirection[Z]); /* set y to 180 to point down */ - VADD2(dude->joints.elbowJoint, dude->joints.leftShoulderJoint, dude->arms.armVector); - mk_trc_h(file, partName, dude->joints.leftShoulderJoint, dude->arms.armVector, dude->arms.upperArmWidth, dude->arms.elbowWidth); - } - else{ - setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.rArmDirection[X], dude->arms.rArmDirection[Y], dude->arms.rArmDirection[Z]); /* set y to 180 to point down */ - VADD2(dude->joints.elbowJoint, dude->joints.rightShoulderJoint, dude->arms.armVector); - mk_trc_h(file, partName, dude->joints.rightShoulderJoint, dude->arms.armVector, dude->arms.upperArmWidth, dude->arms.elbowWidth); - } + VSET(startVector, 0, 0, dude->arms.upperArmLength); + if (isLeft) { + setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.lArmDirection[X], dude->arms.lArmDirection[Y], dude->arms.lArmDirection[Z]); /* set y to 180 to point down */ + VADD2(dude->joints.elbowJoint, dude->joints.leftShoulderJoint, dude->arms.armVector); + mk_trc_h(file, partName, dude->joints.leftShoulderJoint, dude->arms.armVector, dude->arms.upperArmWidth, dude->arms.elbowWidth); + } else{ + setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.rArmDirection[X], dude->arms.rArmDirection[Y], dude->arms.rArmDirection[Z]); /* set y to 180 to point down */ + VADD2(dude->joints.elbowJoint, dude->joints.rightShoulderJoint, dude->arms.armVector); + mk_trc_h(file, partName, dude->joints.rightShoulderJoint, dude->arms.armVector, dude->arms.upperArmWidth, dude->arms.elbowWidth); + } /* Vectors and equations for making TGC arms * vect_t a, b, c, d; @@ -564,43 +596,46 @@ * mk_tgc(file, partName, ShoulderJoint, armVector, a, b, c, d); */ - if(showBoxes){ - if(isLeft) - boundingBox(file, partName, dude->joints.leftShoulderJoint, startVector, dude->arms.upperArmWidth, rotMatrix); - else - boundingBox(file, partName, dude->joints.rightShoulderJoint, startVector, dude->arms.upperArmWidth, rotMatrix); - } - return dude->arms.elbowWidth; + if (showBoxes) { + if (isLeft) + boundingBox(file, partName, dude->joints.leftShoulderJoint, startVector, dude->arms.upperArmWidth, rotMatrix); + else + boundingBox(file, partName, dude->joints.rightShoulderJoint, startVector, dude->arms.upperArmWidth, rotMatrix); + } + return dude->arms.elbowWidth; } -fastf_t makeElbow(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude) + +HIDDEN fastf_t +makeElbow(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude) { - vect_t a, b, c; - VSET(a, (dude->arms.elbowWidth), 0, 0); - VSET(b, 0, (dude->arms.elbowWidth), 0); - VSET(c, 0, 0, dude->arms.elbowWidth); + vect_t a, b, c; + VSET(a, (dude->arms.elbowWidth), 0, 0); + VSET(b, 0, (dude->arms.elbowWidth), 0); + VSET(c, 0, 0, dude->arms.elbowWidth); - mk_ell(file, name, dude->joints.elbowJoint, a, b, c); + mk_ell(file, name, dude->joints.elbowJoint, a, b, c); /* -* mk_sph(file, name, dude->joints.elbowJoint, dude->arms.elbowWidth); -*/ - return dude->arms.elbowWidth; + * mk_sph(file, name, dude->joints.elbowJoint, dude->arms.elbowWidth); + */ + return dude->arms.elbowWidth; } -fastf_t makeLowerArm(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) + +HIDDEN fastf_t +makeLowerArm(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) { - vect_t startVector; - mat_t rotMatrix; + vect_t startVector; + mat_t rotMatrix; - VSET(startVector, 0, 0, dude->arms.lowerArmLength); - if(isLeft){ - setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.lElbowDirection[X], dude->arms.lElbowDirection[Y], dude->arms.lElbowDirection[Z]); - VADD2(dude->joints.wristJoint, dude->joints.elbowJoint, dude->arms.armVector); - } - else{ - setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.rElbowDirection[X], dude->arms.rElbowDirection[Y], dude->arms.rElbowDirection[Z]); - VADD2(dude->joints.wristJoint, dude->joints.elbowJoint, dude->arms.armVector); - } + VSET(startVector, 0, 0, dude->arms.lowerArmLength); + if (isLeft) { + setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.lElbowDirection[X], dude->arms.lElbowDirection[Y], dude->arms.lElbowDirection[Z]); + VADD2(dude->joints.wristJoint, dude->joints.elbowJoint, dude->arms.armVector); + } else{ + setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.rElbowDirection[X], dude->arms.rElbowDirection[Y], dude->arms.rElbowDirection[Z]); + VADD2(dude->joints.wristJoint, dude->joints.elbowJoint, dude->arms.armVector); + } /* vectors for building a tgc arm (which looks weird when rotated) */ /* vect_t a, b, c, d; @@ -612,846 +647,885 @@ * * mk_tgc(file, name, elbowJoint, armVector, a, b, c, d); */ - mk_trc_h(file, name, dude->joints.elbowJoint, dude->arms.armVector, dude->arms.elbowWidth, dude->arms.wristWidth); + mk_trc_h(file, name, dude->joints.elbowJoint, dude->arms.armVector, dude->arms.elbowWidth, dude->arms.wristWidth); - if(showBoxes){ - if(isLeft) - boundingBox(file, name, dude->joints.elbowJoint, startVector, dude->arms.elbowWidth, rotMatrix); - else - boundingBox(file, name, dude->joints.elbowJoint, startVector, dude->arms.elbowWidth, rotMatrix); - } + if (showBoxes) { + if (isLeft) + boundingBox(file, name, dude->joints.elbowJoint, startVector, dude->arms.elbowWidth, rotMatrix); + else + boundingBox(file, name, dude->joints.elbowJoint, startVector, dude->arms.elbowWidth, rotMatrix); + } - return dude->arms.wristWidth; + return dude->arms.wristWidth; } -fastf_t makeWrist(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude) + +HIDDEN fastf_t +makeWrist(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude) { - mk_sph(file, name, dude->joints.wristJoint, dude->arms.wristWidth); - return dude->arms.wristWidth; + mk_sph(file, name, dude->joints.wristJoint, dude->arms.wristWidth); + return dude->arms.wristWidth; } -void makeHand(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) + +HIDDEN void +makeHand(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) { - mat_t rotMatrix; - vect_t startVector; - VSET(startVector, 0, 0, dude->arms.handLength); - if(isLeft){ - setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.lWristDirection[X], dude->arms.lWristDirection[Y], dude->arms.lWristDirection[Z]); - } - else{ - setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.rWristDirection[X], dude->arms.rWristDirection[Y], dude->arms.rWristDirection[Z]); - } + mat_t rotMatrix; + vect_t startVector; + VSET(startVector, 0, 0, dude->arms.handLength); + if (isLeft) { + setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.lWristDirection[X], dude->arms.lWristDirection[Y], dude->arms.lWristDirection[Z]); + } else{ + setDirection(startVector, dude->arms.armVector, rotMatrix, dude->arms.rWristDirection[X], dude->arms.rWristDirection[Y], dude->arms.rWristDirection[Z]); + } - mk_sph(file, name, dude->joints.wristJoint, dude->arms.wristWidth); + mk_sph(file, name, dude->joints.wristJoint, dude->arms.wristWidth); - if(showBoxes) - { - boundingRectangle(file, name, dude->joints.wristJoint, startVector, dude->arms.handWidth, dude->arms.handLength, rotMatrix); - } + if (showBoxes) { + boundingRectangle(file, name, dude->joints.wristJoint, startVector, dude->arms.handWidth, dude->arms.handLength, rotMatrix); + } } -fastf_t makeThighJoint(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude) + +HIDDEN fastf_t +makeThighJoint(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude) { - if(isLeft) - mk_sph(file, name, dude->joints.leftThighJoint, dude->legs.thighWidth); - else - mk_sph(file, name, dude->joints.rightThighJoint, dude->legs.thighWidth); + if (isLeft) + mk_sph(file, name, dude->joints.leftThighJoint, dude->legs.thighWidth); + else + mk_sph(file, name, dude->joints.rightThighJoint, dude->legs.thighWidth); - return dude->legs.thighWidth; + return dude->legs.thighWidth; } -fastf_t makeThigh(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) + +HIDDEN fastf_t +makeThigh(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) { - vect_t startVector; - mat_t rotMatrix; - VSET(startVector, 0, 0, dude->legs.thighLength); + vect_t startVector; + mat_t rotMatrix; + VSET(startVector, 0, 0, dude->legs.thighLength); - if(isLeft){ - setDirection(startVector, dude->legs.thighVector, rotMatrix, dude->legs.lLegDirection[X], dude->legs.lLegDirection[Y], dude->legs.lLegDirection[Z]); - VADD2(dude->joints.kneeJoint, dude->joints.leftThighJoint, dude->legs.thighVector); - mk_trc_h(file, name, dude->joints.leftThighJoint, dude->legs.thighVector, dude->legs.thighWidth, dude->legs.kneeWidth); - } - else{ - setDirection(startVector, dude->legs.thighVector, rotMatrix, dude->legs.rLegDirection[X], dude->legs.rLegDirection[Y], dude->legs.rLegDirection[Z]); - VADD2(dude->joints.kneeJoint, dude->joints.rightThighJoint, dude->legs.thighVector); - mk_trc_h(file, name, dude->joints.rightThighJoint, dude->legs.thighVector, dude->legs.thighWidth, dude->legs.kneeWidth); - } - if(showBoxes){ - if(isLeft) - boundingBox(file, name, dude->joints.leftThighJoint, startVector, dude->legs.thighWidth, rotMatrix); - else - boundingBox(file, name, dude->joints.rightThighJoint, startVector, dude->legs.thighWidth, rotMatrix); - } - return dude->legs.kneeWidth; + if (isLeft) { + setDirection(startVector, dude->legs.thighVector, rotMatrix, dude->legs.lLegDirection[X], dude->legs.lLegDirection[Y], dude->legs.lLegDirection[Z]); + VADD2(dude->joints.kneeJoint, dude->joints.leftThighJoint, dude->legs.thighVector); + mk_trc_h(file, name, dude->joints.leftThighJoint, dude->legs.thighVector, dude->legs.thighWidth, dude->legs.kneeWidth); + } else{ + setDirection(startVector, dude->legs.thighVector, rotMatrix, dude->legs.rLegDirection[X], dude->legs.rLegDirection[Y], dude->legs.rLegDirection[Z]); + VADD2(dude->joints.kneeJoint, dude->joints.rightThighJoint, dude->legs.thighVector); + mk_trc_h(file, name, dude->joints.rightThighJoint, dude->legs.thighVector, dude->legs.thighWidth, dude->legs.kneeWidth); + } + if (showBoxes) { + if (isLeft) + boundingBox(file, name, dude->joints.leftThighJoint, startVector, dude->legs.thighWidth, rotMatrix); + else + boundingBox(file, name, dude->joints.rightThighJoint, startVector, dude->legs.thighWidth, rotMatrix); + } + return dude->legs.kneeWidth; } -fastf_t makeKnee(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude) + +HIDDEN fastf_t +makeKnee(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude) { - mk_sph(file, name, dude->joints.kneeJoint, dude->legs.kneeWidth); - return dude->legs.kneeWidth; + mk_sph(file, name, dude->joints.kneeJoint, dude->legs.kneeWidth); + return dude->legs.kneeWidth; } -fastf_t makeCalf(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) + +HIDDEN fastf_t +makeCalf(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) { - vect_t startVector; - mat_t rotMatrix; - VSET(startVector, 0, 0, dude->legs.calfLength); + vect_t startVector; + mat_t rotMatrix; + VSET(startVector, 0, 0, dude->legs.calfLength); /* -* Find a better way of error checking to see if the legs go thru the ground. -* if(ankleJoint[Y] <= 0){ -* ankleJoint[Y] = ankleWidth; -* } -*/ - if(isLeft) - setDirection(startVector, dude->legs.calfVector, rotMatrix, dude->legs.lKneeDirection[X], dude->legs.lKneeDirection[Y], dude->legs.lKneeDirection[Z]); - else - setDirection(startVector, dude->legs.calfVector, rotMatrix, dude->legs.rKneeDirection[X], dude->legs.rKneeDirection[Y], dude->legs.rKneeDirection[Z]); + * Find a better way of error checking to see if the legs go thru the ground. + * if (ankleJoint[Y] <= 0) { + * ankleJoint[Y] = ankleWidth; + * } + */ + if (isLeft) + setDirection(startVector, dude->legs.calfVector, rotMatrix, dude->legs.lKneeDirection[X], dude->legs.lKneeDirection[Y], dude->legs.lKneeDirection[Z]); + else + setDirection(startVector, dude->legs.calfVector, rotMatrix, dude->legs.rKneeDirection[X], dude->legs.rKneeDirection[Y], dude->legs.rKneeDirection[Z]); - VADD2(dude->joints.ankleJoint, dude->joints.kneeJoint, dude->legs.calfVector); - mk_trc_h(file, name, dude->joints.kneeJoint, dude->legs.calfVector, dude->legs.kneeWidth, dude->legs.ankleWidth); + VADD2(dude->joints.ankleJoint, dude->joints.kneeJoint, dude->legs.calfVector); + mk_trc_h(file, name, dude->joints.kneeJoint, dude->legs.calfVector, dude->legs.kneeWidth, dude->legs.ankleWidth); - if(showBoxes){ - if(isLeft) - boundingBox(file, name, dude->joints.kneeJoint, startVector, dude->legs.kneeWidth, rotMatrix); - else - boundingBox(file, name, dude->joints.kneeJoint, startVector, dude->legs.kneeWidth, rotMatrix); - } - return dude->legs.ankleWidth; + if (showBoxes) { + if (isLeft) + boundingBox(file, name, dude->joints.kneeJoint, startVector, dude->legs.kneeWidth, rotMatrix); + else + boundingBox(file, name, dude->joints.kneeJoint, startVector, dude->legs.kneeWidth, rotMatrix); + } + return dude->legs.ankleWidth; } -fastf_t makeAnkle(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude) + +HIDDEN fastf_t +makeAnkle(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude) { - mk_sph(file, name, dude->joints.ankleJoint, dude->legs.ankleWidth); - return dude->legs.ankleWidth; + mk_sph(file, name, dude->joints.ankleJoint, dude->legs.ankleWidth); + return dude->legs.ankleWidth; } -fastf_t makeFoot(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) + +HIDDEN fastf_t +makeFoot(struct rt_wdb *file, fastf_t isLeft, char *name, struct human_data_t *dude, fastf_t showBoxes) { - vect_t startVector, boxVector; - mat_t rotMatrix; - VSET(startVector, 0, 0, dude->legs.footLength); - VSET(boxVector, 0, 0, dude->legs.footLength + dude->legs.toeWidth); + vect_t startVector, boxVector; + mat_t rotMatrix; + VSET(startVector, 0, 0, dude->legs.footLength); + VSET(boxVector, 0, 0, dude->legs.footLength + dude->legs.toeWidth); - if(isLeft) - setDirection(startVector, dude->legs.footVector, rotMatrix, dude->legs.lFootDirection[X], dude->legs.lFootDirection[Y], dude->legs.lFootDirection[Z]); - else - setDirection(startVector, dude->legs.footVector, rotMatrix, dude->legs.rFootDirection[X], dude->legs.rFootDirection[Y], dude->legs.rFootDirection[Z]); + if (isLeft) + setDirection(startVector, dude->legs.footVector, rotMatrix, dude->legs.lFootDirection[X], dude->legs.lFootDirection[Y], dude->legs.lFootDirection[Z]); + else + setDirection(startVector, dude->legs.footVector, rotMatrix, dude->legs.rFootDirection[X], dude->legs.rFootDirection[Y], dude->legs.rFootDirection[Z]); - mk_particle(file, name, dude->joints.ankleJoint, dude->legs.footVector, dude->legs.ankleWidth, dude->legs.toeWidth); + mk_particle(file, name, dude->joints.ankleJoint, dude->legs.footVector, dude->legs.ankleWidth, dude->legs.toeWidth); - if(showBoxes){ - if(isLeft) - boundingBox(file, name, dude->joints.ankleJoint, boxVector, dude->legs.toeWidth, rotMatrix); - else - boundingBox(file, name, dude->joints.ankleJoint, boxVector, dude->legs.toeWidth, rotMatrix); - } - return 0; + if (showBoxes) { + if (isLeft) + boundingBox(file, name, dude->joints.ankleJoint, boxVector, dude->legs.toeWidth, rotMatrix); + else + boundingBox(file, name, dude->joints.ankleJoint, boxVector, dude->legs.toeWidth, rotMatrix); + } + return 0; } + /** * Make profile makes the head and neck of the body */ -void makeProfile(struct rt_wdb (*file), char *suffix, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) +HIDDEN void +makeProfile(struct rt_wdb (*file), char *suffix, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) { - char headName[MAXLENGTH]="Head.s"; - char neckName[MAXLENGTH]="Neck.s"; - bu_strlcat(headName, suffix, MAXLENGTH); - bu_strlcat(neckName, suffix, MAXLENGTH); - dude->head.neckLength = dude->head.headSize / 2; - makeHead(file, headName, dude, direction, showBoxes); - makeNeck(file, neckName, dude, direction, showBoxes); + char headName[MAXLENGTH]="Head.s"; + char neckName[MAXLENGTH]="Neck.s"; + bu_strlcat(headName, suffix, MAXLENGTH); + bu_strlcat(neckName, suffix, MAXLENGTH); + dude->head.neckLength = dude->head.headSize / 2; + makeHead(file, headName, dude, direction, showBoxes); + makeNeck(file, neckName, dude, direction, showBoxes); } + /* * Create all the torso parts, and set joint locations for each arm, and each leg. */ -void makeTorso(struct rt_wdb (*file), char *suffix, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) +HIDDEN void +makeTorso(struct rt_wdb (*file), char *suffix, struct human_data_t *dude, fastf_t *direction, fastf_t showBoxes) { - char upperTorsoName[MAXLENGTH]="UpperTorso.s"; - char lowerTorsoName[MAXLENGTH]="LowerTorso.s"; - char leftShoulderName[MAXLENGTH]="LeftShoulder.s"; - char rightShoulderName[MAXLENGTH]="RightShoulder.s"; + char upperTorsoName[MAXLENGTH]="UpperTorso.s"; + char lowerTorsoName[MAXLENGTH]="LowerTorso.s"; + char leftShoulderName[MAXLENGTH]="LeftShoulder.s"; + char rightShoulderName[MAXLENGTH]="RightShoulder.s"; - bu_strlcat(upperTorsoName, suffix, MAXLENGTH); - bu_strlcat(lowerTorsoName, suffix, MAXLENGTH); - bu_strlcat(leftShoulderName, suffix, MAXLENGTH); - bu_strlcat(rightShoulderName, suffix, MAXLENGTH); + bu_strlcat(upperTorsoName, suffix, MAXLENGTH); + bu_strlcat(lowerTorsoName, suffix, MAXLENGTH); + bu_strlcat(leftShoulderName, suffix, MAXLENGTH); + bu_strlcat(rightShoulderName, suffix, MAXLENGTH); - makeUpperTorso(file, upperTorsoName, dude, direction, showBoxes); + makeUpperTorso(file, upperTorsoName, dude, direction, showBoxes); - makeShoulder(file, 1, leftShoulderName, dude, showBoxes); - makeShoulder(file, 0, rightShoulderName, dude, showBoxes); + makeShoulder(file, 1, leftShoulderName, dude, showBoxes); + makeShoulder(file, 0, rightShoulderName, dude, showBoxes); - makeLowerTorso(file, lowerTorsoName, dude, direction, showBoxes); + makeLowerTorso(file, lowerTorsoName, dude, direction, showBoxes); } + /** * Make the 3 components of the arm:the upper arm, the lower arm, and the hand. */ -void makeArm(struct rt_wdb (*file), char *suffix, int isLeft, struct human_data_t *dude, fastf_t showBoxes) +HIDDEN void +makeArm(struct rt_wdb (*file), char *suffix, int isLeft, struct human_data_t *dude, fastf_t showBoxes) { - char shoulderJointName[MAXLENGTH]; - char upperArmName[MAXLENGTH]; - char elbowName[MAXLENGTH]; - char lowerArmName[MAXLENGTH]; - char wristName[MAXLENGTH]; - char handName[MAXLENGTH]; + char shoulderJointName[MAXLENGTH]; + char upperArmName[MAXLENGTH]; + char elbowName[MAXLENGTH]; + char lowerArmName[MAXLENGTH]; + char wristName[MAXLENGTH]; + char handName[MAXLENGTH]; - if(isLeft){ - bu_strlcpy(shoulderJointName, "LeftShoulderJoint.s", MAXLENGTH); - bu_strlcpy(upperArmName, "LeftUpperArm.s", MAXLENGTH); - bu_strlcpy(elbowName, "LeftElbowJoint.s", MAXLENGTH); - bu_strlcpy(lowerArmName, "LeftLowerArm.s", MAXLENGTH); - bu_strlcpy(wristName, "LeftWristJoint.s", MAXLENGTH); - bu_strlcpy(handName, "LeftHand.s", MAXLENGTH); - } - else{ - bu_strlcpy(shoulderJointName, "RightShoulderJoint.s", MAXLENGTH); - bu_strlcpy(upperArmName, "RightUpperArm.s", MAXLENGTH); - bu_strlcpy(elbowName, "RightElbowJoint.s", MAXLENGTH); - bu_strlcpy(lowerArmName, "RightLowerArm.s", MAXLENGTH); - bu_strlcpy(wristName, "RightWristJoint.s", MAXLENGTH); - bu_strlcpy(handName, "RightHand.s", MAXLENGTH); - } + if (isLeft) { + bu_strlcpy(shoulderJointName, "LeftShoulderJoint.s", MAXLENGTH); + bu_strlcpy(upperArmName, "LeftUpperArm.s", MAXLENGTH); + bu_strlcpy(elbowName, "LeftElbowJoint.s", MAXLENGTH); + bu_strlcpy(lowerArmName, "LeftLowerArm.s", MAXLENGTH); + bu_strlcpy(wristName, "LeftWristJoint.s", MAXLENGTH); + bu_strlcpy(handName, "LeftHand.s", MAXLENGTH); + } else{ + bu_strlcpy(shoulderJointName, "RightShoulderJoint.s", MAXLENGTH); + bu_strlcpy(upperArmName, "RightUpperArm.s", MAXLENGTH); + bu_strlcpy(elbowName, "RightElbowJoint.s", MAXLENGTH); + bu_strlcpy(lowerArmName, "RightLowerArm.s", MAXLENGTH); + bu_strlcpy(wristName, "RightWristJoint.s", MAXLENGTH); + bu_strlcpy(handName, "RightHand.s", MAXLENGTH); + } - bu_strlcat(shoulderJointName, suffix, MAXLENGTH); - bu_strlcat(upperArmName, suffix, MAXLENGTH); - bu_strlcat(elbowName, suffix, MAXLENGTH); - bu_strlcat(lowerArmName, suffix, MAXLENGTH); - bu_strlcat(wristName, suffix, MAXLENGTH); - bu_strlcat(handName, suffix, MAXLENGTH); + bu_strlcat(shoulderJointName, suffix, MAXLENGTH); + bu_strlcat(upperArmName, suffix, MAXLENGTH); + bu_strlcat(elbowName, suffix, MAXLENGTH); + bu_strlcat(lowerArmName, suffix, MAXLENGTH); + bu_strlcat(wristName, suffix, MAXLENGTH); + bu_strlcat(handName, suffix, MAXLENGTH); - makeShoulderJoint(file, isLeft, shoulderJointName, dude, showBoxes); - makeUpperArm(file, isLeft, upperArmName, dude, showBoxes); - makeElbow(file, isLeft, elbowName, dude); + makeShoulderJoint(file, isLeft, shoulderJointName, dude, showBoxes); + makeUpperArm(file, isLeft, upperArmName, dude, showBoxes); + makeElbow(file, isLeft, elbowName, dude); - makeLowerArm(file, isLeft, lowerArmName, dude, showBoxes); - makeWrist(file, isLeft, wristName, dude); - makeHand(file, isLeft, handName, dude, showBoxes); + makeLowerArm(file, isLeft, lowerArmName, dude, showBoxes); + makeWrist(file, isLeft, wristName, dude); + makeHand(file, isLeft, handName, dude, showBoxes); } + /** * Create the leg to be length 'legLength' by making a thigh, calf, and foot to meet requirements. */ -void makeLeg(struct rt_wdb (*file), char *suffix, int isLeft, struct human_data_t *dude, fastf_t showBoxes) +HIDDEN void +makeLeg(struct rt_wdb (*file), char *suffix, int isLeft, struct human_data_t *dude, fastf_t showBoxes) { - char thighJointName[MAXLENGTH]; - char thighName[MAXLENGTH]; - char kneeName[MAXLENGTH]; - char calfName[MAXLENGTH]; - char ankleName[MAXLENGTH]; - char footName[MAXLENGTH]; + char thighJointName[MAXLENGTH]; + char thighName[MAXLENGTH]; + char kneeName[MAXLENGTH]; + char calfName[MAXLENGTH]; + char ankleName[MAXLENGTH]; + char footName[MAXLENGTH]; - if(isLeft){ - bu_strlcpy(thighJointName, "LeftThighJoint.s", MAXLENGTH); - bu_strlcpy(thighName, "LeftThigh.s", MAXLENGTH); - bu_strlcpy(kneeName, "LeftKneeJoint.s", MAXLENGTH); - bu_strlcpy(calfName, "LeftCalf.s", MAXLENGTH); - bu_strlcpy(ankleName, "LeftAnkleJoint.s", MAXLENGTH); - bu_strlcpy(footName, "LeftFoot.s", MAXLENGTH); - } - else{ - bu_strlcpy(thighJointName, "RightThighJoint.s", MAXLENGTH); - bu_strlcpy(thighName, "RightThigh.s", MAXLENGTH); - bu_strlcpy(kneeName, "RightKneeJoint.s", MAXLENGTH); - bu_strlcpy(calfName, "RightCalf.s", MAXLENGTH); - bu_strlcpy(ankleName, "RightAnkleJoint.s", MAXLENGTH); - bu_strlcpy(footName, "RightFoot.s", MAXLENGTH); - } - bu_strlcat(thighJointName, suffix, MAXLENGTH); - bu_strlcat(thighName, suffix, MAXLENGTH); - bu_strlcat(kneeName, suffix, MAXLENGTH); - bu_strlcat(calfName, suffix, MAXLENGTH); - bu_strlcat(ankleName, suffix, MAXLENGTH); - bu_strlcat(footName, suffix, MAXLENGTH); + if (isLeft) { + bu_strlcpy(thighJointName, "LeftThighJoint.s", MAXLENGTH); + bu_strlcpy(thighName, "LeftThigh.s", MAXLENGTH); + bu_strlcpy(kneeName, "LeftKneeJoint.s", MAXLENGTH); + bu_strlcpy(calfName, "LeftCalf.s", MAXLENGTH); + bu_strlcpy(ankleName, "LeftAnkleJoint.s", MAXLENGTH); + bu_strlcpy(footName, "LeftFoot.s", MAXLENGTH); + } else{ + bu_strlcpy(thighJointName, "RightThighJoint.s", MAXLENGTH); + bu_strlcpy(thighName, "RightThigh.s", MAXLENGTH); + bu_strlcpy(kneeName, "RightKneeJoint.s", MAXLENGTH); + bu_strlcpy(calfName, "RightCalf.s", MAXLENGTH); + bu_strlcpy(ankleName, "RightAnkleJoint.s", MAXLENGTH); + bu_strlcpy(footName, "RightFoot.s", MAXLENGTH); + } + bu_strlcat(thighJointName, suffix, MAXLENGTH); + bu_strlcat(thighName, suffix, MAXLENGTH); + bu_strlcat(kneeName, suffix, MAXLENGTH); + bu_strlcat(calfName, suffix, MAXLENGTH); + bu_strlcat(ankleName, suffix, MAXLENGTH); + bu_strlcat(footName, suffix, MAXLENGTH); - makeThighJoint(file, isLeft, thighJointName, dude); - makeThigh(file, isLeft, thighName, dude, showBoxes); - makeKnee(file, isLeft, kneeName, dude); - makeCalf(file, isLeft, calfName, dude, showBoxes); - makeAnkle(file, isLeft, ankleName, dude); - makeFoot(file, isLeft, footName, dude, showBoxes); + makeThighJoint(file, isLeft, thighJointName, dude); + makeThigh(file, isLeft, thighName, dude, showBoxes); + makeKnee(file, isLeft, kneeName, dude); + makeCalf(file, isLeft, calfName, dude, showBoxes); + makeAnkle(file, isLeft, ankleName, dude); + makeFoot(file, isLeft, footName, dude, showBoxes); } + /** - * Make the head, shoulders knees and toes, so to speak. - * Head, neck, torso, arms, hands, legs, feet. - * And dude, a very technical term, is the human_data in a shorter, more readable name + * Make the head, shoulders knees and toes, so to speak. Head, neck, + * torso, arms, hands, legs, feet. And dude, a very technical term, + * is the human_data in a shorter, more readable name */ -void makeBody(struct rt_wdb (*file), char *suffix, struct human_data_t *dude, fastf_t *location, fastf_t showBoxes) +HIDDEN void +makeBody(struct rt_wdb (*file), char *suffix, struct human_data_t *dude, fastf_t *location, fastf_t showBoxes) { - vect_t direction; - bu_log("Making Body\n"); - /* - * Make sure that vectors, points, and widths are sent to each function - * for direction, location, and correct sizing, respectivly. - */ - bu_log("Setting Direction\n"); - VSET(dude->joints.headJoint, location[X], location[Y], (location[Z]+((dude->height*IN2MM)-(dude->head.headSize/2)))); - VSET(direction, 180, 0, 0); /*Make the body build down, from head to toe. Or else it's upsidedown */ + vect_t direction; + bu_log("Making Body\n"); + /* + * Make sure that vectors, points, and widths are sent to each function + * for direction, location, and correct sizing, respectivly. + */ + bu_log("Setting Direction\n"); + VSET(dude->joints.headJoint, location[X], location[Y], (location[Z]+((dude->height*IN2MM)-(dude->head.headSize/2)))); + VSET(direction, 180, 0, 0); /*Make the body build down, from head to toe. Or else it's upsidedown */ - /** - * Head Parts - */ - /*makeProfile makes the head and the neck */ - makeProfile(file, suffix, dude, direction, showBoxes); + /** + * Head Parts + */ + /*makeProfile makes the head and the neck */ + makeProfile(file, suffix, dude, direction, showBoxes); - /** - * Torso Parts - */ - makeTorso(file, suffix, dude, direction, showBoxes); + /** + * Torso Parts + */ + makeTorso(file, suffix, dude, direction, showBoxes); - /** - * Arm Parts - */ - /*The second argument is whether or not it is the left side, 1 = yes, 0 = no) */ - makeArm(file, suffix, 1, dude, showBoxes); - makeArm(file, suffix, 0, dude, showBoxes); + /** + * Arm Parts + */ + /*The second argument is whether or not it is the left side, 1 = yes, 0 = no) */ + makeArm(file, suffix, 1, dude, showBoxes); + makeArm(file, suffix, 0, dude, showBoxes); - /** - * Leg Parts - */ - makeLeg(file, suffix, 1, dude, showBoxes); - makeLeg(file, suffix, 0, dude, showBoxes); - bu_log("Body Built\n"); -} + /** + * Leg Parts + */ + makeLeg(file, suffix, 1, dude, showBoxes); + makeLeg(file, suffix, 0, dude, showBoxes); + bu_log("Body Built\n"); +} + /** - * MakeArmy makes a square of persons n by n large, where n is the number of persons entered using -N - * if N is large (>= 20) Parts start disappearing, oddly enough. + * MakeArmy makes a square of persons n by n large, where n is the + * number of persons entered using -N if N is large (>= 20) Parts + * start disappearing, oddly enough. */ -void makeArmy(struct rt_wdb (*file), struct human_data_t dude, int number, fastf_t showBoxes) +HIDDEN void +makeArmy(struct rt_wdb (*file), struct human_data_t dude, int number, fastf_t showBoxes) { - point_t locations; - int x = 0; - int y = 0; - int num; - char testname[10]={'0'}; - char suffix[MAXLENGTH]; - VSET(locations, 0, 0, 0); /* Starting location */ - num = 0.0; + point_t locations; + int x = 0; + int y = 0; + int num; + char testname[10]={'0'}; + char suffix[MAXLENGTH]; + VSET(locations, 0, 0, 0); /* Starting location */ + num = 0.0; - for(x = 0; x<number; x++){ - for(y=0; y<number; y++){ - sprintf(testname, "%d", num); - bu_strlcpy(suffix, testname, MAXLENGTH); - RandAuto(&dude); /*Generates random heights for random height, and thus random size, creation. */ - Auto(&dude); - makeBody(file, suffix, &dude, locations, showBoxes); - VSET(locations, (locations[X]- (dude.torso.shoulderWidth + dude.arms.upperArmWidth)*4), locations[Y], 0); - num++; - } - VSET(locations, 0, (locations[Y]- (dude.torso.shoulderWidth + dude.arms.upperArmWidth)*4), 0); + for (x = 0; x<number; x++) { + for (y=0; y<number; y++) { + sprintf(testname, "%d", num); + bu_strlcpy(suffix, testname, MAXLENGTH); + RandAuto(&dude); /*Generates random heights for random height, and th... [truncated message content] |