home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
POLYEDIT.LZH
/
MODEL
/
FILE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-07-31
|
6KB
|
263 lines
/*
* ファイル入出力
*
* Copyright T.Kobayashi 1994.7.17
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <io.h>
#include <assert.h>
#include "lib.h"
#include "reader.h"
#include "poly.h"
#include "view.h"
#include "vector.h"
#if 0
static void ObjectName( name, file )
char *name ;
const char *file ;
{
char *p ;
p = strrchr( file, '\\' );
if ( p == NULL )
p = strrchr( file, '/' );
if ( p == NULL )
p = strrchr( file, ':' );
if ( p != NULL )
file = p + 1 ;
strcpy( name, file );
p = strchr( name, '.' );
assert( p != NULL );
*p = '\0' ;
}
#endif
int PolyReadFile(char *file, int mode)
{
int i, type, atrno, objno ;
int rdata[8];
#if 0
int pvx, pvy, pvz;
#else
int coe[3];
#endif
float r;
char atrname[64] ;
char objname[64] ;
ObjReadOpen( file );
objno = -1 ;
while( ObjReadName( objname ) && !ReaderError())
{
if (mode != FILE_APPEND) {
objno = ObjAppend( objname );
} else {
objno = ObjSearchOrAppend( objname );
}
strcpy( ObjData[objno].fname, file );
CurrentPoly->obj = objno ;
while( ObjReadPoly( atrname, &type ) && !ReaderError())
{
atrno = AttrSearchOrAppend( atrname );
/* assert( atrno >= 0 );*/
if (atrno < 0) return -1;
CurrentPoly->type = type ;
CurrentPoly->atr = atrno ;
for( i = 0 ; ObjReadVertexInt( rdata ) && !ReaderError(); i++ )
{
CurrentPoly->ver[i].x = (int)rdata[0] ;
CurrentPoly->ver[i].y = (int)rdata[1] ;
CurrentPoly->ver[i].z = (int)rdata[2] ;
if ( type & POLY_SHADE )
{
#if 0
if ( i > 0 )
{
if ( pvx * rdata[3] + pvy * rdata[4] + pvz * rdata[5] < 0 )
{
rdata[3] = -rdata[3];
rdata[4] = -rdata[4];
rdata[5] = -rdata[5];
}
}
#endif
/* r = 256.0 / sqrt( vx * vx + vy * vy + vz * vz );
r = 256.0 / sqrt( vx * vx + vy * vy + vz * vz );
CurrentPoly->ver[i].vx = (int)( vx * r );
CurrentPoly->ver[i].vy = (int)( vy * r );
CurrentPoly->ver[i].vz = (int)( vz * r );
*/
/*
r = 256.0 / sqrt(rdata[3] * rdata[3] + rdata[4] * rdata[4] + rdata[5] * rdata[5]);
*/
r = sqrt((float)rdata[3] * (float)rdata[3]
+(float)rdata[4] * (float)rdata[4]
+(float)rdata[5] * (float)rdata[5]);
if (r > 0.0) r = 256.0 / r;
CurrentPoly->ver[i].vx = (int)(r * (float)rdata[3]);
CurrentPoly->ver[i].vy = (int)(r * (float)rdata[4]);
CurrentPoly->ver[i].vz = (int)(r * (float)rdata[5]);
#if 0
pvx = CurrentPoly->ver[i].vx;
pvx = CurrentPoly->ver[i].vy;
pvx = CurrentPoly->ver[i].vz;
#endif
} else {
CurrentPoly->ver[i].vx = CurrentPoly->ver[i].vy = CurrentPoly->ver[i].vz = 0;
}
if ( type & POLY_UV) {
CurrentPoly->ver[i].u = rdata[6] ;
CurrentPoly->ver[i].v = rdata[7] ;
} else {
CurrentPoly->ver[i].u = CurrentPoly->ver[i].v = 0;
}
}
CurrentPoly->vers = i ;
CurrentPoly->select = TRUE ;
Coefficent(coe, CurrentPoly->ver, CurrentPoly->vers);
if ( coe[0] * CurrentPoly->ver[0].vx
+ coe[1] * CurrentPoly->ver[0].vy
+ coe[2] * CurrentPoly->ver[0].vz < 0) {
for( i = 1 ; i < CurrentPoly->vers; i++) {
Vertex *ver;
ver = &(CurrentPoly->ver[i]);
if ( coe[0] * ver->vx + coe[1] * ver->vy + coe[2] * ver->vz > 0) {
ver->vx = -ver->vx;
ver->vy = -ver->vy;
ver->vz = -ver->vz;
}
}
} else {
for( i = 1 ; i < CurrentPoly->vers; i++) {
Vertex *ver;
ver = &(CurrentPoly->ver[i]);
if ( coe[0] * ver->vx + coe[1] * ver->vy + coe[2] * ver->vz < 0) {
ver->vx = -ver->vx;
ver->vy = -ver->vy;
ver->vz = -ver->vz;
}
}
}
/* Selects ++ ;*/
PolyAppend();
}
ObjData[objno].edit = FALSE ;
}
ObjReadClose();
if (ReaderError()) {
return -1;
}
return objno ;
}
/* ファイルに書き込む */
int PolyWriteFile( objno, mode )
int objno ;
int mode ;
{
FILE *fp ;
int i, atrno ;
Polygon *poly ;
Vertex *ver ;
static char *typename[4] = { "poly", "shade", "uvpoly", "uvshade" };
assert( 0 <= objno && objno <= ObjLast );
if ( ObjData[objno].flag == FALSE )
return FALSE ;
if ( mode == FILE_APPEND )
fp = fopen( ObjData[objno].fname, "a" );
else
fp = fopen( ObjData[objno].fname, "w" );
if ( fp == NULL )
{
MessageWarning( "ファイルがオープンできません" );
return FALSE ;
}
fprintf( fp, "obj suf %s {\n", ObjData[objno].name );
atrno = -1 ;
poly = PolyTop();
while( poly != NULL )
{
if ( poly->select == ON )
{
if ( poly->atr != atrno )
{
atrno = poly->atr ;
fprintf( fp, "atr %s\n", AttrData[atrno].name );
}
fprintf( fp, "prim\t%s\t(", typename[poly->type] );
ver = poly->ver ;
for( i = 0 ; i < poly->vers ; i++ )
{
fprintf( fp, "\t%d\t%d\t%d", ver->x, ver->y, ver->z );
if ( poly->type & POLY_SHADE )
fprintf( fp, "\t%d\t%d\t%d", ver->vx, ver->vy, ver->vz );
if ( poly->type & POLY_UV )
fprintf( fp, "\t%d\t%d", ver->u, ver->v );
if ( i < poly->vers - 1 )
fprintf( fp, "\n\t\t " );
ver++ ;
}
fprintf( fp, " )\n\n" );
}
poly = PolyNext( poly );
}
fprintf( fp, "}\n" );
if (ferror(fp)) {
return FALSE;
}
fclose( fp );
return TRUE ;
}
/* フレームファイルを出力する */
void WriteFrame( mat, filename, objname, back)
Matrix mat ;
char *filename ;
char *objname ;
Vector *back;
{
FILE *fp ;
fp = fopen( filename, "w" );
if ( fp == NULL )
{
InternalError( "フレームファイルが出力できません" );
return ;
}
if (back->x != 0 || back->y != 0 || back->z != 0) {
fprintf( fp, "env { back ( rgb ( %8f %8f %8f ) ) }",
back->x, back->y, back->z);
}
fprintf( fp, "fram {\n" );
fprintf( fp, "\tlight pal ( rgb ( 1 1 1 ) 4 2 -1 )\n" );
fprintf( fp, "\teye deg ( %d )\n", PersAngle(0) );
fprintf( fp, "\tmat(\n" );
fprintf( fp, "\t\t%8f %8f %8f 0.0\n", mat[0][0], mat[0][1], mat[0][2] );
fprintf( fp, "\t\t%8f %8f %8f 0.0\n", mat[1][0], mat[1][1], mat[1][2] );
fprintf( fp, "\t\t%8f %8f %8f 0.0\n", mat[2][0], mat[2][1], mat[2][2] );
fprintf( fp, "\t\t%8f %8f %8f 1.0\n", mat[3][0], mat[3][1], mat[3][2] );
fprintf( fp, "\t)\n" );
fprintf( fp, "\tobj %s\n", objname );
fprintf( fp, "}\n" );
fclose( fp );
}