SBSPSS/Utils/GinExp/ExpCamLight.cpp
2001-01-12 22:40:39 +00:00

238 lines
5.1 KiB
C++

/*=========================================================================
.CPP
Author: Tim Swann @ CLIMAX
Created:
Project:
Purpose:
Copyright (c) 1998 Climax Development Ltd
===========================================================================*/
/*----------------------------------------------------------------------
Includes
-------- */
#include "AsciiExp.h"
/* Std Lib
------- */
/* Glib
---- */
/* Local
----- */
/* Graphics
-------- */
/*----------------------------------------------------------------------
Tyepdefs && Defines
------------------- */
/*----------------------------------------------------------------------
Structure defintions
-------------------- */
/*----------------------------------------------------------------------
Positional Vars
--------------- */
/*----------------------------------------------------------------------
Function Prototypes
------------------- */
/*----------------------------------------------------------------------
Vars
---- */
/*----------------------------------------------------------------------
Data
---- */
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
void AsciiExp::ExportCamera(INode* node)
{
INode * target = node->GetTarget();
CameraState cs;
TimeValue t = 0;
Interval valid = FOREVER;
Interval animRange = ip->GetAnimRange();
ObjectState os = node->EvalWorldState(t);
CameraObject * cam = (CameraObject *)os.obj;
cam->EvalCameraState(t, valid, &cs);
if (target)
{
WriteChunkHdr( (char*)CAMERA_ID, 0 );
fwrite( &totFrames, sizeof( Uint32 ), 1, expStream );
DumpCamPosSample( node );
DumpCamPosSample( target );
}
}
/*----------------------------------------------------------------------
---------------------------------------------------------------------- */
void AsciiExp::DumpCamPosSample(INode* node)
{
TimeValue start = ip->GetAnimRange().Start();
TimeValue end = ip->GetAnimRange().End();
TimeValue t;
int delta = GetTicksPerFrame() * 1;
Matrix3 tm;
AffineParts ap;
Point3 pos;
Point3 opos;
for (t=start; t<=end; t+=delta)
{
tm = node->GetNodeTM(t);
decomp_affine(tm, &ap);
pos = ap.t;
opos.x = pos.x;
opos.y = pos.z;
opos.z = pos.y;
fwrite( &opos.x, sizeof( float ), 1, expStream ); // WRITE CAMERA POSITION
fwrite( &opos.y, sizeof( float ), 1, expStream );
fwrite( &opos.z, sizeof( float ), 1, expStream );
}
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
void AsciiExp::ExportLight(INode* node)
{
Interval valid = FOREVER;
Matrix3 mtx = node->GetNodeTM( 0 );
ObjectState os = node->EvalWorldState( 0 );
GenLight * light;
LightState ls;
AffineParts ap;
Point3 pos;
Point3 opos;
float ang[4];
Point3 oang;
Quat rot;
INode * target;
float hotsize;
float fallsize;
float attenStart;
float attenEnd;
if (!os.obj) return;
// EXPORT LIGHT
WriteChunkHdr( (char*)LIGHT_ID, 0 );
light = (GenLight*)os.obj;
light->EvalLightState( 0, valid, &ls );
fwrite( &ls.type, sizeof(long), 1, expStream );
decomp_affine( mtx, &ap );
pos = ap.t;
opos.x = pos.x;
opos.y = pos.z;
opos.z = pos.y;
fwrite( &opos.x, sizeof( float ), 1, expStream ); // WRITE LIGHT POSITION
fwrite( &opos.y, sizeof( float ), 1, expStream );
fwrite( &opos.z, sizeof( float ), 1, expStream );
rot.x = ap.q.x;
rot.y = ap.q.z;
rot.z = ap.q.y;
rot.w = ap.q.w;
QuatToEuler( rot, ang);
oang.x = ang[0];
oang.y = ang[1];
oang.z = ang[2];
// fwrite( &oang.x, sizeof( float ), 1, expStream ); // WRITE LIGHT ROTATION
// fwrite( &oang.y, sizeof( float ), 1, expStream );
// fwrite( &oang.z, sizeof( float ), 1, expStream );
target = node->GetTarget();
if (target)
{
mtx = target->GetNodeTM( 0 );
decomp_affine( mtx, &ap );
pos = ap.t;
opos.x = pos.x;
opos.y = pos.z;
opos.z = pos.y;
}
else
{
// opos.x = 0.f;
// opos.y = 0.f;
// opos.z = 0.f;
}
fwrite( &opos.x, sizeof( float ), 1, expStream ); // WRITE LIGHT POSITION
fwrite( &opos.y, sizeof( float ), 1, expStream );
fwrite( &opos.z, sizeof( float ), 1, expStream );
fwrite( &ls.color.r, sizeof( float ), 1, expStream );
fwrite( &ls.color.g, sizeof( float ), 1, expStream );
fwrite( &ls.color.b, sizeof( float ), 1, expStream );
fwrite( &ls.intens, sizeof( float ), 1, expStream );
hotsize = 0.f;
fallsize = 0.f;
attenStart = 0.f;
attenEnd = 0.f;
if (ls.type != OMNI_LIGHT)
{
hotsize = ls.hotsize;
fallsize = ls.fallsize;
}
if (ls.type != DIR_LIGHT && ls.useAtten)
{
attenStart = ls.attenStart;
attenEnd = ls.attenEnd;
}
fwrite( &hotsize, sizeof( float ), 1, expStream );
fwrite( &fallsize, sizeof( float ), 1, expStream );
fwrite( &attenStart, sizeof( float ), 1, expStream );
fwrite( &attenEnd, sizeof( float ), 1, expStream );
}
/*===========================================================================
end */