IRS_Geometry.c

/******************************************************************************\
                                                                        
        Module:     IRS_Geometry.c                                          
                                                                            
        Purpose:    plug-in renderer for QD3D: geometry rendering                               
                                                                        
        Author:     Sun-Inn Shih                                        
                                                                        
        Copyright (C) 1993-96 Apple Computer, Inc.  All rights reserved.    
                                                                            
\*****************************************************************************/
#include <QD3D.h>
#include <QD3DGeometry.h>
 
#include "IRS_Geometry.h"
 
/*
 *  IRS_Geometry_Triangle 
 */
TQ3Status IRS_Geometry_Triangle(
    TQ3ViewObject       pView,
    irsData             *irsdata,
    TQ3GeometryObject   pGeom, 
    TQ3TriangleData     *pTriangleData)
{
    TQ3Point3D              point3D;
    TQ3Point2D              point2D[3];
 
    float   w;
    float   scale = irsdata->scale;
    float   center = irsdata->center;   
    long    j;
 
    /* local to Frustum */
    float M00, M01, M02, M03;
    float M10, M11, M12, M13;
    float M20, M21, M22, M23;
    float M30, M31, M32, M33;
    
    M00 = irsdata->localToFrustum.value[0][0];
    M01 = irsdata->localToFrustum.value[0][1];
    M02 = irsdata->localToFrustum.value[0][2];
    M03 = irsdata->localToFrustum.value[0][3];
 
    M10 = irsdata->localToFrustum.value[1][0];
    M11 = irsdata->localToFrustum.value[1][1];
    M12 = irsdata->localToFrustum.value[1][2];
    M13 = irsdata->localToFrustum.value[1][3];
 
    M20 = irsdata->localToFrustum.value[2][0];
    M21 = irsdata->localToFrustum.value[2][1];
    M22 = irsdata->localToFrustum.value[2][2];
    M23 = irsdata->localToFrustum.value[2][3];
 
    M30 = irsdata->localToFrustum.value[3][0];
    M31 = irsdata->localToFrustum.value[3][1];
    M32 = irsdata->localToFrustum.value[3][2];
    M33 = irsdata->localToFrustum.value[3][3];
    
    /* trimesh data */
    scale = irsdata->scale;
    center = irsdata->center;   
    
    for( j = 0 ; j < 3 ; j ++)
    {
        point3D = pTriangleData->vertices[j].point;
        
        point2D[j].x = point3D.x * M00 + point3D.y * M10 + point3D.z * M20 + M30;
        point2D[j].y = point3D.x * M01 + point3D.y * M11 + point3D.z * M21 + M31;
        w = point3D.x * M03 + point3D.y * M13 + point3D.z * M23 + M33;
    
        point2D[j].x = ( point2D[j].x / w ) * scale + center;
        point2D[j].y = ( point2D[j].y / w ) * scale + center;
    }   
 
    fprintf(irsdata->filePtr, "%d %d moveto ", (long) point2D[0].x, (long) point2D[0].y);
    fprintf(irsdata->filePtr, "%d %d lineto ", (long) point2D[1].x, (long) point2D[1].y);
    fprintf(irsdata->filePtr, "%d %d lineto ", (long) point2D[2].x, (long) point2D[2].y);
    fprintf(irsdata->filePtr, "closepath\n" );
 
    return kQ3Success;
}
 
/*
 *  IRS_Geometry_Line 
 */
TQ3Status IRS_Geometry_Line(
    TQ3ViewObject       pView,
    irsData             *irsdata,
    TQ3GeometryObject   pGeom, 
    TQ3LineData         *pLineData)
{
    return kQ3Success;
}
 
/*
 *  IRS_Geometry_Point 
 */
TQ3Status IRS_Geometry_Point(
    TQ3ViewObject       pView,
    irsData             *irsdata,
    TQ3GeometryObject   pGeom, 
    TQ3PointData        *pPointData)
{
    return kQ3Success;
}
 
/*
 *  IRS_Geometry_Marker 
 */
TQ3Status IRS_Geometry_Marker(
    TQ3ViewObject       pView,
    irsData             *irsdata,
    TQ3GeometryObject   pGeom, 
    TQ3MarkerData       *pMarkerData)
{
    return kQ3Success;
}
 
/*
 *  IRS_Geometry_PixmapMarker 
 */
TQ3Status IRS_Geometry_PixmapMarker(
    TQ3ViewObject       pView,
    irsData                 *irsdata,
    TQ3GeometryObject   pGeom, 
    TQ3PixmapMarkerData *pPixmapMarkerData)
{
    return kQ3Success;
}
 
#if 0
/*
 *  IRS_Geometry_TM 
 */
TQ3Status IRS_Geometry_TM(
    TQ3ViewObject       pView,
    irsData             *irsdata,
    TQ3GeometryObject   pGeom, 
    TQ3TriMeshData      *pTriMeshData)
{
    /* QD3D structures */
    TQ3TriMeshTriangleData *trianglelist;
    TQ3Point3D              point3D, *pointlist;
    TQ3Point2D              point2D[3];
 
    float   w;
    float   scale = irsdata->scale;
    float   center = irsdata->center;   
    long    i, j, index;
 
    /* local to Frustum */
    float M00, M01, M02, M03;
    float M10, M11, M12, M13;
    float M20, M21, M22, M23;
    float M30, M31, M32, M33;
    
    M00 = irsdata->localToFrustum.value[0][0];
    M01 = irsdata->localToFrustum.value[0][1];
    M02 = irsdata->localToFrustum.value[0][2];
    M03 = irsdata->localToFrustum.value[0][3];
 
    M10 = irsdata->localToFrustum.value[1][0];
    M11 = irsdata->localToFrustum.value[1][1];
    M12 = irsdata->localToFrustum.value[1][2];
    M13 = irsdata->localToFrustum.value[1][3];
 
    M20 = irsdata->localToFrustum.value[2][0];
    M21 = irsdata->localToFrustum.value[2][1];
    M22 = irsdata->localToFrustum.value[2][2];
    M23 = irsdata->localToFrustum.value[2][3];
 
    M30 = irsdata->localToFrustum.value[3][0];
    M31 = irsdata->localToFrustum.value[3][1];
    M32 = irsdata->localToFrustum.value[3][2];
    M33 = irsdata->localToFrustum.value[3][3];
    
    /* trimesh data */
    trianglelist = pTriMeshData->triangles;
    pointlist = pTriMeshData->points;
 
    scale = irsdata->scale;
    center = irsdata->center;   
    
    for(i=0;i<pTriMeshData->numTriangles; i++, trianglelist++)
    {
        for( j = 0 ; j < 3 ; j ++)
        {
            index = trianglelist->pointIndices[j];
            point3D = pointlist[index];
            
            point2D[j].x = point3D.x * M00 + point3D.y * M10 + point3D.z * M20 + M30;
            point2D[j].y = point3D.x * M01 + point3D.y * M11 + point3D.z * M21 + M31;
            w = point3D.x * M03 + point3D.y * M13 + point3D.z * M23 + M33;
        
            point2D[j].x = ( point2D[j].x / w ) * scale + center;
            point2D[j].y = ( point2D[j].y / w ) * scale + center;
        }   
    
        fprintf(irsdata->filePtr, "%d %d moveto ", (long) point2D[0].x, (long) point2D[0].y);
        fprintf(irsdata->filePtr, "%d %d lineto ", (long) point2D[1].x, (long) point2D[1].y);
        fprintf(irsdata->filePtr, "%d %d lineto ", (long) point2D[2].x, (long) point2D[2].y);
        fprintf(irsdata->filePtr, "closepath\n" );
    }
        
    return kQ3Success;
}
#endif