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);
}