home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
POLYEDIT.LZH
/
MODEL
/
ATR.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-03-18
|
8KB
|
354 lines
/*
* アトリビュート制御
*
* 1994.6.18
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "lib.h"
#include "alloc.h"
#include "poly.h"
#include "color.h"
#include "reader.h"
Attrbute *AttrData ;
int AttrCurrent ;
int AttrSize ;
int AttrLast ;
/*
* アトリビュートデータの初期化
*/
void AttrInit( size )
int size ;
{
int i ;
AttrData = MemoryAlloc( size * sizeof( Attrbute ) );
AttrSize = size ;
AttrLast = 0 ;
AttrCurrent = 0 ;
for( i = 0 ; i < size ; i++ )
AttrData[i].flag = FALSE ;
/* i = AttrAppend( "no" );*/
}
void AttrExit()
{
MemoryFree( AttrData );
}
static void AttrClear( int pos )
{
int i, j;
AttrData[pos].code = 7;
AttrData[pos].col.r = AttrData[pos].col.g = AttrData[pos].col.b = COLOR_UNIT ;
AttrData[pos].amb.r = AttrData[pos].amb.g = AttrData[pos].amb.b = COLOR_UNIT/2 ;
AttrData[pos].dif = AttrData[pos].amb;
AttrData[pos].spc.r = AttrData[pos].spc.g = AttrData[pos].spc.b = 0;
AttrData[pos].size = AttrData[pos].ref = AttrData[pos].tra =
AttrData[pos].rfr = AttrData[pos].att = AttrData[pos].spc;
AttrData[pos].h = 0;
AttrData[pos].maptype = MAP_NO;
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
AttrData[pos].mapsize[i][j] = 0;
AttrData[pos].mapview[i][j] = 0;
AttrData[pos].mapwind[i][j] = 0;
}
}
}
/*
* アトリビュートの追加
*/
int AttrAppend( name )
char *name ;
{
int i ;
for( i = 0 ; i < AttrSize ; i++ )
{
if ( AttrData[i].flag == FALSE )
{
AttrData[i].flag = TRUE ;
strncpy( AttrData[i].name, name, ATTR_NAME_LEN );
AttrData[i].name[ATTR_NAME_LEN] = '\0' ;
AttrData[i].fname[0] = '\0' ;
AttrClear(i);
#if 0
AttrData[i].r = COLOR_UNIT ;
AttrData[i].g = COLOR_UNIT ;
AttrData[i].b = COLOR_UNIT ;
AttrData[i].code = 7 ;
#endif
if ( AttrLast < i )
AttrLast = i ;
return i ;
}
}
MessageError( "アトリビュートバッファがオーバーフローしました" );
return -1 ;
}
/*
* アトリビュートの検索
*/
int AttrSearch( name )
char *name ;
{
int i ;
for( i = 0 ; i <= AttrLast ; i++ )
{
if ( AttrData[i].flag && strncmp( AttrData[i].name, name, ATTR_NAME_LEN ) == 0 )
return i ;
}
return -1 ;
}
/*
* 検索&追加
*/
int AttrSearchOrAppend( name )
char *name ;
{
int n ;
n = AttrSearch( name );
if ( n == -1 )
return AttrAppend( name );
else
return n ;
}
/*
* セレクトされているアトリビュートを変更する
*/
void AttrChange( atrno )
int atrno ;
{
Polygon *poly ;
assert( atrno <= AttrLast );
poly = PolyTop();
while( poly != NULL )
{
if ( poly->select )
{
ObjData[poly->obj].edit = TRUE ;
poly->atr = atrno ;
}
poly = PolyNext( poly );
}
}
/*
* ファイル入力
*/
int AttrReadFile(char *file, int mode)
{
int atrno, code ;
char name[64] ;
#if 0
Color col, amb, dif, spc, size ;
#endif
int h ;
Color col[9];
if (AtrReadOpen( file ) == FALSE) {
return FALSE;
}
while( AtrReadNext() && !ReaderError() )
{
AtrReadName( name );
if (mode != FILE_APPEND) {
atrno = AttrAppend( name );
} else {
atrno = AttrSearchOrAppend( name );
}
#if 0
AtrReadColor( &col, &amb, &dif, &spc, &size, &h );
AttrData[atrno].r = col.r ;
AttrData[atrno].g = col.g ;
AttrData[atrno].b = col.b ;
#else
strcpy(AttrData[atrno].fname, file);
/* col, amb, dif, spc, size, ref, tra, rfr, att */
AtrReadColorAll(col, &h);
AttrData[atrno].col = col[0];
AttrData[atrno].amb = col[1];
AttrData[atrno].dif = col[2];
AttrData[atrno].spc = col[3];
AttrData[atrno].size = col[4];
AttrData[atrno].ref = col[5];
AttrData[atrno].tra = col[6];
AttrData[atrno].rfr = col[7];
AttrData[atrno].att = col[8];
AttrData[atrno].h = h;
AttrData[atrno].maptype = AtrReadColorMap(
AttrData[atrno].colorfile,
AttrData[atrno].mapsize,
AttrData[atrno].mapwind,
AttrData[atrno].mapview);
#endif
code = 0 ;
if ( AttrData[atrno].col.r > COLOR_UNIT * 3 / 5 )
code |= 2 ;
if ( AttrData[atrno].col.g > COLOR_UNIT * 3 / 5 )
code |= 4 ;
if ( AttrData[atrno].col.b > COLOR_UNIT * 3 / 5 )
code |= 1 ;
AttrData[atrno].code = code ;
}
AtrReadClose();
if (ReaderError()) {
return FALSE;
}
return TRUE ;
}
int AttrDelete( int atrno )
{
int i;
Polygon *poly ;
poly = PolyTop();
while( poly != NULL )
{
if ( poly->atr == atrno ) {
return FALSE;
}
poly = PolyNext( poly );
}
poly = PolyTop();
while( poly != NULL )
{
if ( poly->atr > atrno ) {
poly->atr--;
}
poly = PolyNext( poly );
}
for (i = atrno; i < AttrLast; ++i) {
AttrData[i] = AttrData[i+1];
}
AttrData[AttrLast].flag = FALSE;
AttrLast--;
if (AttrLast >= 0 && AttrCurrent > AttrLast) {
AttrCurrent = AttrLast;
}
return TRUE;
}
static void AttrWriteColor( FILE *fp, Color *col)
{
if (col->r == col->g && col->r == col->b) {
fprintf( fp, "%4.2lf", (double)col->r / (double)(1<<COLOR_SHIFT));
} else {
fprintf( fp, "rgb ( %4.2lf %4.2lf %4.2lf )",
(double)col->r / (double)(1<<COLOR_SHIFT),
(double)col->g / (double)(1<<COLOR_SHIFT),
(double)col->b / (double)(1<<COLOR_SHIFT));
}
}
static void AttrWriteParameter( FILE *fp, char *name, Color *col)
{
if (col->r != 0 || col->g != 0 || col->b != 0) {
if (col->r == col->g && col->r == col->b) {
fprintf( fp, "\t%s ( %4.2lf )\n", name, (double)col->r / (double)(1<<COLOR_SHIFT));
} else {
fprintf( fp, "\t%s ( rgb ( %4.2lf %4.2lf %4.2lf ) )\n",
name,
(double)col->r / (double)(1<<COLOR_SHIFT),
(double)col->g / (double)(1<<COLOR_SHIFT),
(double)col->b / (double)(1<<COLOR_SHIFT));
}
}
}
static void AttrWriteMap( FILE *fp, char *name, int map[2][2])
{
int i, j;
fprintf(fp, "\t%s ( ", name);
for( i = 0 ; i < 2 ; ++i )
{
for( j = 0 ; j < 2 ; ++j )
{
if ((map[i][j] & 65535) == 0) {
fprintf(fp, "%d ", map[i][j] >> 16);
} else {
fprintf(fp, "%8.4lf ", (double)map[i][j] / 65536.0);
}
}
}
fprintf(fp, ")\n");
}
/* ファイルに書き込む */
int AttrWriteFile( char *file, int atrno, int mode )
{
FILE *fp ;
int i;
assert( 0 <= atrno && atrno <= AttrLast );
if ( AttrData[atrno].flag == FALSE )
return FALSE ;
if ( mode == FILE_APPEND )
fp = fopen( file, "a" );
else
fp = fopen( file, "w" );
if ( fp == NULL )
{
MessageWarning( "ファイルがオープンできません" );
return FALSE ;
}
fprintf( fp, "atr %s {\n", AttrData[atrno].name );
fprintf( fp, "\tcol ( "); AttrWriteColor( fp, &AttrData[atrno].col );
fprintf( fp, " )\n\ttra ( "); AttrWriteColor( fp, &AttrData[atrno].tra );
fprintf( fp, " )\n\tamb ( "); AttrWriteColor( fp, &AttrData[atrno].amb );
fprintf( fp, " )\n\tdif ( "); AttrWriteColor( fp, &AttrData[atrno].dif );
fprintf( fp, " )\n\tspc ( "); AttrWriteColor( fp, &AttrData[atrno].spc );
fprintf( fp, " "); AttrWriteColor( fp, &AttrData[atrno].size );
fprintf( fp, " %4.2lf )\n", (double)AttrData[atrno].h / (double)(1<<COLOR_SHIFT));
AttrWriteParameter( fp, "ref", &AttrData[atrno].ref );
AttrWriteParameter( fp, "rfr", &AttrData[atrno].rfr );
AttrWriteParameter( fp, "att", &AttrData[atrno].att );
if (AttrData[atrno].maptype == MAP_COLOR && AttrData[atrno].colorfile[0]) {
fprintf(fp, "\tcolormap ( %s )\n", AttrData[atrno].colorfile);
AttrWriteMap( fp, "mapsize", AttrData[atrno].mapsize);
AttrWriteMap( fp, "mapview", AttrData[atrno].mapview);
AttrWriteMap( fp, "mapwind", AttrData[atrno].mapwind);
}
fprintf( fp, "}\n");
if (ferror(fp)) {
return FALSE;
}
fclose( fp );
return TRUE ;
}