Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
Skinny3DSources ƒ/BoxModel.c
// File BoxModel.c |
#include <Memory.h> |
#include <OSUtils.h> |
#include "BoxModel.h" |
/* |
contains the following: |
TQ3GroupObject MakeBox(void); |
void DisposeBoxModel(TQ3GroupObject model); |
VccPtr BoxDataToVCC(TQ3Object theObj); |
void VCCtoBoxData(VccPtr vcc, TQ3BoxData *boxData); |
*/ |
static void InitBoxData(TQ3BoxData *boxData); |
static void MakeFaceAttributes(TQ3BoxData *boxData); |
static void SetBoxResetValues(TQ3BoxData *boxData, VccPtr vcc); |
extern Rect gContrlRect; |
//---------------------------------------------------------------------------------- |
static void InitBoxData(TQ3BoxData *boxData) |
{ |
float height = 6; |
float width = 6; |
float depth = 6; |
Q3Point3D_Set(&boxData->origin, -width/2, -height/2, -depth/2); |
Q3Vector3D_Set(&boxData->orientation, 0, height, 0); |
Q3Vector3D_Set(&boxData->majorAxis, width, 0, 0); |
Q3Vector3D_Set(&boxData->minorAxis, 0, 0, depth); |
boxData->boxAttributeSet = NULL; |
boxData->faceAttributeSet = NULL; |
} |
//---------------------------------------------------------------------------------- |
static void MakeFaceAttributes(TQ3BoxData *boxData) |
{ |
TQ3Status status; |
TQ3ColorRGB faceColor; |
TQ3ColorRGB specColor; |
TQ3ColorRGB transColor; |
float ambientCoeff; |
float specularCntl; |
long i; |
boxData->faceAttributeSet = (TQ3AttributeSet *)NewPtrClear(sizeof(TQ3AttributeSet) * 6); |
if (boxData->faceAttributeSet == NULL) |
return; |
for (i = 0; i < 6; i++) |
boxData->faceAttributeSet[i] = NULL; |
faceColor.r = 0.0; |
faceColor.g = 1.0; |
faceColor.b = 0.0; |
specColor.r = 0.0; |
specColor.g = 0.0; |
specColor.b = 1.0; |
transColor.r = 0.0; |
transColor.g = 1.0; |
transColor.b = 0.0; |
ambientCoeff = 0.5; |
specularCntl = 0.5; |
for (i = 0; i < 6; i++) { |
boxData->faceAttributeSet[i] = Q3AttributeSet_New(); |
if (boxData->faceAttributeSet[i] != nil) { |
status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], |
kQ3AttributeTypeDiffuseColor, &faceColor); |
status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], |
kQ3AttributeTypeSpecularColor, &specColor); |
status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], |
kQ3AttributeTypeSpecularColor, &transColor); |
status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], |
kQ3AttributeTypeAmbientCoefficient, &ambientCoeff); |
status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], |
kQ3AttributeTypeSpecularControl, &specularCntl); |
} |
} |
} |
//---------------------------------------------------------------------------------- |
TQ3GroupObject MakeBox(void) |
{ |
TQ3GroupObject model; |
TQ3GeometryObject box; |
TQ3GroupPosition position; |
TQ3BoxData boxData; |
TQ3Status status; |
long i; |
InitBoxData(&boxData); |
MakeFaceAttributes(&boxData); |
box = Q3Box_New(&boxData); if (box == nil) return nil; |
model = Q3OrderedDisplayGroup_New(); if (model == nil) return nil; |
position = Q3Group_AddObject(model, box); if (position == nil) return nil; |
if (boxData.boxAttributeSet != nil) |
Q3Object_Dispose(boxData.boxAttributeSet); |
if (boxData.faceAttributeSet != nil) { |
for (i = 0; i < 6; i++) |
if (boxData.faceAttributeSet[i] != nil) |
Q3Object_Dispose(boxData.faceAttributeSet[i]); |
DisposePtr((Ptr)boxData.faceAttributeSet); |
} |
Q3Object_Dispose(box); |
return model; |
} |
//---------------------------------------------------------------------------------- |
void DisposeBoxModel(TQ3GroupObject model) |
{ |
Q3Group_EmptyObjects(model); |
Q3Object_Dispose(model); |
} |
//---------------------------------------------------------------------------------- |
VccPtr BoxDataToVCC(TQ3Object theObj) |
{ |
TQ3BoxData boxData; |
TQ3AttributeSet attrSet; |
TQ3Status status; |
VccPtr vcc; |
TQ3ColorRGB faceColor; |
TQ3ColorRGB specColor; |
TQ3ColorRGB transColor; |
float ambientCoeff; |
float specularCntl; |
long i; |
status = Q3Box_GetData( theObj, &boxData ); |
if (status == kQ3Failure) |
return; |
vcc = NewVCluster((long)kQ3GeometryTypeBox, "\pBoxData", 30, &gContrlRect); |
if (vcc == nil) { |
SysBeep(10); // ErrMsg("\pNewVCluster failed"); |
return nil; |
} |
AddValueCtl(vcc, "\porigin.x", boxData.origin.x, -20.0, 20.0, 1.0); // [0] |
AddValueCtl(vcc, "\porigin.y", boxData.origin.y, -20.0, 20.0, 1.0); |
AddValueCtl(vcc, "\porigin.z", boxData.origin.z, -20.0, 20.0, 1.0); |
AddSeparator(vcc); |
AddValueCtl(vcc, "\porientation.x", boxData.orientation.x, 0.0, 10.0, 0.5); // [4] |
AddValueCtl(vcc, "\porientation.y", boxData.orientation.y, 0.0, 10.0, 0.5); |
AddValueCtl(vcc, "\porientation.z", boxData.orientation.z, 0.0, 10.0, 0.5); |
AddSeparator(vcc); |
AddValueCtl(vcc, "\pmajorAxis.x", boxData.majorAxis.x, 0.0, 10.0, 0.5); // [8] |
AddValueCtl(vcc, "\pmajorAxis.y", boxData.majorAxis.y, 0.0, 10.0, 0.5); |
AddValueCtl(vcc, "\pmajorAxis.z", boxData.majorAxis.z, 0.0, 10.0, 0.5); |
AddSeparator(vcc); |
AddValueCtl(vcc, "\pminorAxis.x", boxData.minorAxis.x, 0.0, 10.0, 0.5); // [12] |
AddValueCtl(vcc, "\pminorAxis.y", boxData.minorAxis.y, 0.0, 10.0, 0.5); |
AddValueCtl(vcc, "\pminorAxis.z", boxData.minorAxis.z, 0.0, 10.0, 0.5); |
AddSeparator(vcc); |
attrSet = boxData.faceAttributeSet[0]; |
status = Q3AttributeSet_Get(attrSet, kQ3AttributeTypeDiffuseColor, &faceColor); |
status = Q3AttributeSet_Get(attrSet, kQ3AttributeTypeSpecularColor, &specColor); |
status = Q3AttributeSet_Get(attrSet, kQ3AttributeTypeSpecularColor, &transColor); |
status = Q3AttributeSet_Get(attrSet, kQ3AttributeTypeAmbientCoefficient, &ambientCoeff); |
status = Q3AttributeSet_Get(attrSet, kQ3AttributeTypeSpecularControl, &specularCntl); |
AddValueCtl(vcc, "\pfaceColor.r", faceColor.r, 0.0, 1.0, 0.1); // [16] |
AddValueCtl(vcc, "\pfaceColor.g", faceColor.g, 0.0, 1.0, 0.1); |
AddValueCtl(vcc, "\pfaceColor.b", faceColor.b, 0.0, 1.0, 0.1); |
AddSeparator(vcc); |
AddValueCtl(vcc, "\pspecColor.r", specColor.r, 0.0, 1.0, 0.1); // [20] |
AddValueCtl(vcc, "\pspecColor.g", specColor.g, 0.0, 1.0, 0.1); |
AddValueCtl(vcc, "\pspecColor.b", specColor.b, 0.0, 1.0, 0.1); |
AddSeparator(vcc); |
AddValueCtl(vcc, "\ptransColor.r", transColor.r, 0.0, 1.0, 0.1); // [24] |
AddValueCtl(vcc, "\ptransColor.g", transColor.g, 0.0, 1.0, 0.1); |
AddValueCtl(vcc, "\ptransColor.b", transColor.b, 0.0, 1.0, 0.1); |
AddSeparator(vcc); |
AddValueCtl(vcc, "\pambientCoefficient", ambientCoeff, 0.0, 1.0, 0.1); // [28] |
AddValueCtl(vcc, "\pspecularControl", specularCntl, 0.0, 25.0, 2.5); |
// ErBoxData_Empty(&boxData); // releases memory allocated in Q3Box_GetData |
// Q3Box_EmptyData(&boxData); // releases memory allocated in Q3Box_GetData |
// ¥¥ not in my shared library yet |
if (boxData.faceAttributeSet != NULL) |
for (i = 0; i < 6; i++) |
if (boxData.faceAttributeSet[i] != NULL) |
InitBoxData(&boxData); // to bring in the original reset values (not for attributes) |
SetBoxResetValues(&boxData, vcc); |
return vcc; |
} |
//---------------------------------------------------------------------------------- |
void VCCtoBoxData(VccPtr vcc, TQ3BoxData *boxData) |
{ |
TQ3Status status; |
TQ3ColorRGB faceColor; |
TQ3ColorRGB specColor; |
TQ3ColorRGB transColor; |
float ambientCoeff; |
float specularCntl; |
long i; |
boxData->origin.x = GetCurrentValue(vcc, 0); |
boxData->origin.y = GetCurrentValue(vcc, 1); |
boxData->origin.z = GetCurrentValue(vcc, 2); |
boxData->orientation.x = GetCurrentValue(vcc, 4); |
boxData->orientation.y = GetCurrentValue(vcc, 5); |
boxData->orientation.z = GetCurrentValue(vcc, 6); |
boxData->majorAxis.x = GetCurrentValue(vcc, 8); |
boxData->majorAxis.y = GetCurrentValue(vcc, 9); |
boxData->majorAxis.z = GetCurrentValue(vcc, 10); |
boxData->minorAxis.x = GetCurrentValue(vcc, 12); |
boxData->minorAxis.y = GetCurrentValue(vcc, 13); |
boxData->minorAxis.z = GetCurrentValue(vcc, 14); |
// separator |
faceColor.r = GetCurrentValue(vcc, 16); |
faceColor.g = GetCurrentValue(vcc, 17); |
faceColor.b = GetCurrentValue(vcc, 18); |
specColor.r = GetCurrentValue(vcc, 20); |
specColor.g = GetCurrentValue(vcc, 21); |
specColor.b = GetCurrentValue(vcc, 22); |
transColor.r = GetCurrentValue(vcc, 24); |
transColor.g = GetCurrentValue(vcc, 25); |
transColor.b = GetCurrentValue(vcc, 26); |
ambientCoeff = GetCurrentValue(vcc, 28); |
specularCntl = GetCurrentValue(vcc, 29); |
for (i = 0; i < 6; i++) { |
Q3AttributeSet_Empty(boxData->faceAttributeSet[i]); |
status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], |
kQ3AttributeTypeDiffuseColor, &faceColor); |
status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], |
kQ3AttributeTypeSpecularColor, &specColor); |
status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], |
kQ3AttributeTypeSpecularColor, &transColor); |
status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], |
kQ3AttributeTypeAmbientCoefficient, &ambientCoeff); |
status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], |
kQ3AttributeTypeSpecularControl, &specularCntl); |
} |
} |
//---------------------------------------------------------------------------------- |
void SetBoxResetValues(TQ3BoxData *boxData, VccPtr vcc) |
{ |
SetResetValue(vcc, 0, boxData->origin.x); |
SetResetValue(vcc, 1, boxData->origin.y); |
SetResetValue(vcc, 2, boxData->origin.z); |
SetResetValue(vcc, 4, boxData->orientation.x); |
SetResetValue(vcc, 5, boxData->orientation.y); |
SetResetValue(vcc, 6, boxData->orientation.z); |
SetResetValue(vcc, 8, boxData->majorAxis.x); |
SetResetValue(vcc, 9, boxData->majorAxis.y); |
SetResetValue(vcc, 10, boxData->majorAxis.z); |
SetResetValue(vcc, 12, boxData->minorAxis.x); |
SetResetValue(vcc, 13, boxData->minorAxis.y); |
SetResetValue(vcc, 14, boxData->minorAxis.z); |
} |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-01-14