home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
POLYEDIT.LZH
/
READER
/
OBJREAD.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-03-12
|
7KB
|
344 lines
/*
* 形状ファイル入力関数
*
* Copyright T.Kobayashi 1993.1.17
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <assert.h>
#include "_reader.h"
#include "word.h"
#include "matrix.h"
#define PRIVATE_OP 1
#define NOT_FOUND 11
#define BAD_EXIST 12
#define NOT_SUF_MODEL 13
#define NOT_IMPLIMENTED 14
#define LESS_POINT 15
#define ATR_NO_EXIST 16
#define MAT_STACK_OVERFLOW 17
#define UNEXPECTED_EOF 21
#define NOT_OBJ_FILE 22
#define MAT_STACK_MAX 10
static Matrix MatStack[MAT_STACK_MAX+1] ;
static int MatSP ;
static Matrix CurMat ;
static int UnitFlag;
static char AtrName[F_NAME_LEN];
static int CurPolyType ;
static void objerror( int, char* );
extern int lasterror;
int ObjReadOpen( filename )
const char *filename ;
{
lasterror = 0;
/* ファイルのオープン */
if ( fileopen( filename ) == 0 )
return FALSE ;
if ( wordid != WORD_OBJ )
{
objerror( NOT_OBJ_FILE, "" );
return FALSE ;
}
return TRUE ;
}
int ObjReadName( name )
char *name ;
{
if ( end_of_file )
return FALSE ;
/* obj の検出 */
if ( wordid != WORD_OBJ )
{
objerror( NOT_FOUND, "obj" ) ;
skip( "obj" );
return FALSE;
}
get() ;
/* private の検出(警告) */
if ( wordid == WORD_PRIVATE )
{
objerror( PRIVATE_OP, "" );
get() ;
}
/* suf の検出 */
if ( wordid != WORD_SUF ) {
objerror( NOT_SUF_MODEL, "" ) ;
return FALSE;
} else
get() ;
/* オブジェクト名のリード */
getname( name );
if ( wordid != WORD_OPEN2 ) {
objerror( NOT_FOUND, "{" );
return FALSE;
} else
get() ;
MatSP = 0 ;
MatUnit( MatStack[MatSP] );
MatCopy( CurMat, MatStack[MatSP] );
UnitFlag = TRUE;
strcpy( AtrName, "no" );
return TRUE ;
}
int ObjReadClose()
{
fileclose() ;
return TRUE ;
}
int ObjReadPoly( atrname, typep )
char *atrname ;
int *typep ;
{
char name[F_NAME_LEN];
while( wordid != WORD_PRIM && MatSP > -1 )
{
switch( wordid )
{
case WORD_ATR :
get() ;
getname( name );
#if 0
if ( strcmp( name, "no" ) == 0 )
objerror( ATR_NO_EXIST, "" );
#endif
strcpy( AtrName, name );
break ;
case WORD_OPEN2 :
get() ;
MatCopy( MatStack[MatSP+1], MatStack[MatSP] );
if ( MatSP >= MAT_STACK_MAX )
objerror( MAT_STACK_OVERFLOW, "" );
else
{
MatSP ++ ;
MatCopy( CurMat, MatStack[MatSP] );
}
break ;
case WORD_CLOSE2 :
get() ;
MatSP -- ;
if ( MatSP > 0 )
MatCopy( CurMat, MatStack[MatSP] );
break ;
case WORD_PARTS :
get() ;
objerror( NOT_IMPLIMENTED, "形状参照指定" );
skip( ")" );
break ;
default :
getmat( MatStack[MatSP] );
MatCopy( CurMat, MatStack[MatSP] );
UnitFlag = FALSE;
break ;
}
if (lasterror) return FALSE;
}
if ( MatSP == -1 )
return FALSE ;
get() ;
switch( wordid )
{
case WORD_POLY :
CurPolyType = TYPE_POLY ;
break ;
case WORD_SHADE :
CurPolyType = TYPE_SHADE ;
break ;
case WORD_UVPOLY :
CurPolyType = TYPE_UVPOLY ;
break ;
case WORD_UVSHADE :
CurPolyType = TYPE_UVSHADE ;
break ;
default :
objerror( BAD_EXIST, nextword ) ;
}
get() ;
if ( wordid != WORD_OPEN1 )
objerror( NOT_FOUND, "(" ) ;
get() ;
strcpy( atrname, AtrName );
*typep = CurPolyType ;
return TRUE ;
}
int ObjReadVertex( xp, yp, zp, xvp, yvp, zvp, up, vp )
float *xp, *yp, *zp ;
float *xvp, *yvp, *zvp ;
float *up, *vp ;
{
float x, y, z, u, v ;
if ( wordid == WORD_CLOSE1 )
{
get();
return FALSE ;
}
x = getfloat();
y = getfloat();
z = getfloat();
*xp = ( x * CurMat[0][0] + y * CurMat[1][0] + z * CurMat[2][0] ) + CurMat[3][0] ;
*yp = ( x * CurMat[0][1] + y * CurMat[1][1] + z * CurMat[2][1] ) + CurMat[3][1] ;
*zp = ( x * CurMat[0][2] + y * CurMat[1][2] + z * CurMat[2][2] ) + CurMat[3][2] ;
if ( CurPolyType & 1 )
{
x = getfloat();
y = getfloat();
z = getfloat();
if ( xvp != NULL )
{
*xvp = x * CurMat[0][0] + y * CurMat[1][0] + z * CurMat[2][0] ;
*yvp = x * CurMat[0][1] + y * CurMat[1][1] + z * CurMat[2][1] ;
*zvp = x * CurMat[0][2] + y * CurMat[1][2] + z * CurMat[2][2] ;
}
}
if ( CurPolyType & 2 )
{
u = getfloat();
v = getfloat();
if ( up != NULL )
{
*up = u ;
*vp = v ;
}
}
return TRUE ;
}
int ObjReadVertexInt( int data[8] )
{
int x, y, z, u, v ;
if ( wordid == WORD_CLOSE1 )
{
get();
return FALSE ;
}
x = getint();
y = getint();
z = getint();
if (UnitFlag) {
data[0] = x;
data[1] = y;
data[2] = z;
} else {
data[0] = (int)( (float)x * CurMat[0][0] + (float)y * CurMat[1][0] + (float)z * CurMat[2][0] ) + CurMat[3][0] ;
data[1] = (int)( (float)x * CurMat[0][1] + (float)y * CurMat[1][1] + (float)z * CurMat[2][1] ) + CurMat[3][1] ;
data[2] = (int)( (float)x * CurMat[0][2] + (float)y * CurMat[1][2] + (float)z * CurMat[2][2] ) + CurMat[3][2] ;
}
if ( CurPolyType & 1 )
{
x = getint();
y = getint();
z = getint();
if (UnitFlag) {
data[3] = x;
data[4] = y;
data[5] = z;
} else {
data[3] = (int)( (float)x * CurMat[0][0] + (float)y * CurMat[1][0] + (float)z * CurMat[2][0] );
data[4] = (int)( (float)x * CurMat[0][1] + (float)y * CurMat[1][1] + (float)z * CurMat[2][1] );
data[5] = (int)( (float)x * CurMat[0][2] + (float)y * CurMat[1][2] + (float)z * CurMat[2][2] );
}
}
if ( CurPolyType & 2 )
{
data[6] = getint();
data[7] = getint();
}
return TRUE ;
}
static void objerror( n, arg )
int n ;
char *arg ;
{
char *msg ;
int level ;
switch( n )
{
case PRIVATE_OP :
msg = "警告:private 処理はサポートしていません。" ;
level = 1 ;
break ;
case ATR_NO_EXIST :
msg = "atr no があります。" ;
level = 1 ;
break ;
case NOT_FOUND :
msg = " %s がありません。" ;
level = 10 ;
break ;
case BAD_EXIST :
msg = " %s が存在します。" ;
level = 10 ;
break ;
case NOT_SUF_MODEL :
msg = "サーフィスモデルではありません。" ;
level = 10 ;
break ;
case NOT_IMPLIMENTED :
msg = " %s はサポートしていません。" ;
level = 10 ;
break ;
case LESS_POINT :
msg = "多角形の頂点が2つ以下しかありません。" ;
level = 10 ;
break ;
case MAT_STACK_OVERFLOW :
msg = "構\造定義が複雑すぎます。" ;
level = 10 ;
break ;
case UNEXPECTED_EOF :
msg = "エンドオブファイルになりました" ;
level = 20 ;
break ;
case NOT_OBJ_FILE :
msg = "形状ファイルではありません。" ;
level = 20 ;
break ;
default :
msg = "エラーコードの誤り。( objread.c )" ;
level = 20 ;
break ;
}
errormessage( level, msg, arg );
}