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.
IRS_Geometry.c
/******************************************************************************\ |
Module: IRS_Geometry.c |
Purpose: plug-in renderer for QD3D: geometry rendering |
Author: Sun-Inn Shih + Roger Holmes |
Parts Copyright (C) 1993-96 Apple Computer, Inc. All rights reserved. |
Parts Copyright (C) 1996 Microspot Ltd. All rights reserved. |
\*****************************************************************************/ |
#include <QD3D.h> |
#include <QD3DGeometry.h> |
#include <QD3DView.h> |
#include <QD3DDrawContext.h> |
#include "IRS_Geometry.h" |
RGBColor ColourFromAttrSet ( TQ3AttributeSet AttributeSet ) ; |
RGBColor ColourFromAttrSet ( TQ3AttributeSet AttributeSet ) |
{ |
RGBColor TheColour ; |
if ( AttributeSet ) |
{ |
TQ3ColorRGB QColor ; |
if ( Q3AttributeSet_Get ( AttributeSet , kQ3AttributeTypeDiffuseColor , &QColor ) ) |
{ |
TheColour.red = QColor.r * 0x0000FFFF ; |
TheColour.green = QColor.g * 0x0000FFFF ; |
TheColour.blue = QColor.b * 0x0000FFFF ; |
} |
else |
{ |
TheColour.red = 0x7FFF ; |
TheColour.green = 0x7FFF ; |
TheColour.blue = 0x7FFF ; |
} |
} |
else |
{ |
TheColour.red = 0x7FFF ; |
TheColour.green = 0x7FFF ; |
TheColour.blue = 0x7FFF ; |
} |
return TheColour ; |
} ; |
/* |
* IRS_Geometry_Triangle |
*/ |
TQ3Status IRS_Geometry_Triangle( |
TQ3ViewObject pView, |
irsData *irsdata, |
TQ3GeometryObject pGeom, |
TQ3TriangleData *pTriangleData) |
{ |
// local to Frustum |
float M00 = irsdata->localToFrustum.value[0][0]; |
float M01 = irsdata->localToFrustum.value[0][1]; |
float M02 = irsdata->localToFrustum.value[0][2]; |
float M03 = irsdata->localToFrustum.value[0][3]; |
float M10 = irsdata->localToFrustum.value[1][0]; |
float M11 = irsdata->localToFrustum.value[1][1]; |
float M12 = irsdata->localToFrustum.value[1][2]; |
float M13 = irsdata->localToFrustum.value[1][3]; |
float M20 = irsdata->localToFrustum.value[2][0]; |
float M21 = irsdata->localToFrustum.value[2][1]; |
float M22 = irsdata->localToFrustum.value[2][2]; |
float M23 = irsdata->localToFrustum.value[2][3]; |
float M30 = irsdata->localToFrustum.value[3][0]; |
float M31 = irsdata->localToFrustum.value[3][1]; |
float M32 = irsdata->localToFrustum.value[3][2]; |
float M33 = irsdata->localToFrustum.value[3][3]; |
// Triangle data |
TQ3DrawContextObject DrawContext ; |
if ( Q3View_GetDrawContext ( pView , &DrawContext ) != kQ3Failure ) |
{ |
CWindowPtr Window ; |
if ( Q3MacDrawContext_GetWindow ( DrawContext , &Window ) != kQ3Failure ) |
{ |
TQ3Point2D point2D [ 3 ] ; |
for ( long j = 0 ; j < 3 ; ++j ) |
{ |
TQ3Point3D 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 ; |
float w = 1.0f / ( point3D.x * M03 + point3D.y * M13 + point3D.z * M23 + M33 ) ; |
point2D [ j ].x = irsdata->XOffset + point2D [ j ].x * w * irsdata->XScale ; |
point2D [ j ].y = irsdata->YOffset - point2D [ j ].y * w * irsdata->YScale ; |
} ; |
SetPort ( ( GrafPort* ) ( Window ) ) ; |
RGBColor TheColour = ColourFromAttrSet ( pTriangleData->triangleAttributeSet ) ; |
RGBForeColor ( &TheColour ) ; |
MoveTo ( point2D [ 0 ].x , point2D [ 0 ].y ) ; |
LineTo ( point2D [ 1 ].x , point2D [ 1 ].y ) ; |
LineTo ( point2D [ 2 ].x , point2D [ 2 ].y ) ; |
LineTo ( point2D [ 0 ].x , point2D [ 0 ].y ) ; |
} |
} |
return kQ3Success; |
} |
/* |
* IRS_Geometry_Line |
*/ |
TQ3Status IRS_Geometry_Line( |
TQ3ViewObject pView, |
irsData *irsdata, |
TQ3GeometryObject pGeom, |
TQ3LineData *pLineData) |
{ |
// local to Frustum |
float M00 = irsdata->localToFrustum.value[0][0]; |
float M01 = irsdata->localToFrustum.value[0][1]; |
float M02 = irsdata->localToFrustum.value[0][2]; |
float M03 = irsdata->localToFrustum.value[0][3]; |
float M10 = irsdata->localToFrustum.value[1][0]; |
float M11 = irsdata->localToFrustum.value[1][1]; |
float M12 = irsdata->localToFrustum.value[1][2]; |
float M13 = irsdata->localToFrustum.value[1][3]; |
float M20 = irsdata->localToFrustum.value[2][0]; |
float M21 = irsdata->localToFrustum.value[2][1]; |
float M22 = irsdata->localToFrustum.value[2][2]; |
float M23 = irsdata->localToFrustum.value[2][3]; |
float M30 = irsdata->localToFrustum.value[3][0]; |
float M31 = irsdata->localToFrustum.value[3][1]; |
float M32 = irsdata->localToFrustum.value[3][2]; |
float M33 = irsdata->localToFrustum.value[3][3]; |
// Line data |
TQ3DrawContextObject DrawContext ; |
if ( Q3View_GetDrawContext ( pView , &DrawContext ) != kQ3Failure ) |
{ |
CWindowPtr Window ; |
if ( Q3MacDrawContext_GetWindow ( DrawContext , &Window ) != kQ3Failure ) |
{ |
TQ3Point2D point2D [ 2 ] ; |
for ( long j = 0 ; j < 2 ; ++j ) |
{ |
TQ3Point3D point3D = pLineData->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 ; |
float w = 1.0f / ( point3D.x * M03 + point3D.y * M13 + point3D.z * M23 + M33 ) ; |
point2D [ j ].x = irsdata->XOffset + point2D[j].x * w * irsdata->XScale ; |
point2D [ j ].y = irsdata->YOffset - point2D[j].y * w * irsdata->YScale ; |
} ; |
SetPort ( ( GrafPort* ) ( Window ) ) ; |
RGBColor TheColour = ColourFromAttrSet ( pLineData->lineAttributeSet ) ; |
RGBForeColor ( &TheColour ) ; |
MoveTo ( point2D [ 0 ].x , point2D [ 0 ].y ) ; |
LineTo ( point2D [ 1 ].x , point2D [ 1 ].y ) ; |
} |
} |
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 1 |
/* |
* IRS_Geometry_TM |
*/ |
TQ3Status IRS_Geometry_TM ( |
TQ3ViewObject pView, |
irsData *irsdata, |
TQ3GeometryObject pGeom, |
TQ3TriMeshData *pTriMeshData ) |
{ |
// local to Frustum |
float M00 = irsdata->localToFrustum.value[0][0]; |
float M01 = irsdata->localToFrustum.value[0][1]; |
float M02 = irsdata->localToFrustum.value[0][2]; |
float M03 = irsdata->localToFrustum.value[0][3]; |
float M10 = irsdata->localToFrustum.value[1][0]; |
float M11 = irsdata->localToFrustum.value[1][1]; |
float M12 = irsdata->localToFrustum.value[1][2]; |
float M13 = irsdata->localToFrustum.value[1][3]; |
float M20 = irsdata->localToFrustum.value[2][0]; |
float M21 = irsdata->localToFrustum.value[2][1]; |
float M22 = irsdata->localToFrustum.value[2][2]; |
float M23 = irsdata->localToFrustum.value[2][3]; |
float M30 = irsdata->localToFrustum.value[3][0]; |
float M31 = irsdata->localToFrustum.value[3][1]; |
float M32 = irsdata->localToFrustum.value[3][2]; |
float M33 = irsdata->localToFrustum.value[3][3]; |
/* trimesh data */ |
TQ3TriMeshTriangleData* trianglelist = pTriMeshData->triangles; |
TQ3Point3D* pointlist = pTriMeshData->points; |
TQ3DrawContextObject DrawContext ; |
if ( Q3View_GetDrawContext ( pView , &DrawContext ) != kQ3Failure ) |
{ |
CWindowPtr Window ; |
if ( Q3MacDrawContext_GetWindow ( DrawContext , &Window ) != kQ3Failure ) |
{ |
for ( long i = 0 ; i < pTriMeshData->numTriangles ; ++i , ++trianglelist ) |
{ |
TQ3Point2D point2D [ 3 ] ; |
for ( long j = 0 ; j < 3 ; ++j ) |
{ |
long index = trianglelist->pointIndices [ j ] ; |
TQ3Point3D 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; |
float w = 1.0f / ( point3D.x * M03 + point3D.y * M13 + point3D.z * M23 + M33 ) ; |
point2D [ j ].x = irsdata->XOffset + point2D [ j ].x * w * irsdata->XScale ; |
point2D [ j ].y = irsdata->YOffset - point2D [ j ].y * w * irsdata->YScale ; |
} |
SetPort ( ( GrafPort* ) ( Window ) ) ; |
RGBColor TheColour = ColourFromAttrSet ( pTriMeshData->triMeshAttributeSet ) ; |
RGBForeColor ( &TheColour ) ; |
MoveTo ( point2D [ 0 ].x , point2D [ 0 ].y ) ; |
LineTo ( point2D [ 1 ].x , point2D [ 1 ].y ) ; |
LineTo ( point2D [ 2 ].x , point2D [ 2 ].y ) ; |
LineTo ( point2D [ 0 ].x , point2D [ 0 ].y ) ; |
} |
} |
} |
return kQ3Success ; |
} |
#endif |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-01-14