00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "api.h"
00026 #include "context.h"
00027 #include "paramset.h"
00028
00029 #include <boost/date_time/posix_time/posix_time.hpp>
00030 #include <vector>
00031 #include <cstdarg>
00032
00033 using namespace lux;
00034
00035 #define EXTRACT_PARAMETERS(_start) \
00036 va_list pArgs; \
00037 va_start( pArgs, _start ); \
00038 \
00039 std::vector<LuxToken> aTokens; \
00040 std::vector<LuxPointer> aValues; \
00041 int count = buildParameterList( pArgs, aTokens, aValues );
00042
00043 #define PASS_PARAMETERS \
00044 count, aTokens.size()>0?&aTokens[0]:0, aValues.size()>0?&aValues[0]:0
00045
00046 namespace lux
00047 {
00048
00049
00050
00051
00052
00053
00054 int buildParameterList( va_list pArgs, std::vector<LuxToken>& aTokens, std::vector<LuxPointer>& aValues )
00055 {
00056 int count = 0;
00057 LuxToken pToken = va_arg( pArgs, LuxToken );
00058 LuxPointer pValue;
00059 aTokens.clear();
00060 aValues.clear();
00061 while ( pToken != 0 && pToken != LUX_NULL )
00062 {
00063 aTokens.push_back( pToken );
00064 pValue = va_arg( pArgs, LuxPointer );
00065 aValues.push_back( pValue );
00066 pToken = va_arg( pArgs, LuxToken );
00067 count++;
00068 }
00069 return ( count );
00070 }
00071
00072 }
00073
00074 static bool initialized = false;
00075
00076
00077
00078
00079 extern "C" void luxAddServer(const char * name)
00080 {
00081 Context::luxAddServer(std::string(name));
00082 }
00083
00084 extern "C" void luxCleanup()
00085 {
00086 Context::luxCleanup();
00087 }
00088
00089 extern "C" void luxIdentity()
00090 {
00091 Context::luxIdentity();
00092 }
00093 extern "C" void luxTranslate(float dx, float dy, float dz)
00094 {
00095 Context::luxTranslate(dx,dy,dz);
00096 }
00097 extern "C" void luxTransform(float tr[16])
00098 {
00099 Context::luxTransform(tr);
00100 }
00101 extern "C" void luxConcatTransform(float tr[16]) {
00102 Context::luxConcatTransform(tr);
00103 }
00104 extern "C" void luxRotate(float angle, float dx, float dy, float dz)
00105 {
00106 Context::luxRotate(angle,dx,dy,dz);
00107 }
00108 extern "C" void luxScale(float sx, float sy, float sz)
00109 {
00110 Context::luxScale(sx,sy,sz);
00111 }
00112 extern "C" void luxLookAt(float ex, float ey, float ez, float lx, float ly, float lz,
00113 float ux, float uy, float uz)
00114 {
00115 Context::luxLookAt(ex, ey, ez, lx, ly, lz, ux, uy, uz);
00116 }
00117 extern "C" void luxCoordinateSystem(const char *name)
00118 {
00119 Context::luxCoordinateSystem(std::string(name));
00120 }
00121 extern "C" void luxCoordSysTransform(const char *name)
00122 {
00123 Context::luxCoordSysTransform(std::string(name));
00124 }
00125 extern "C" void luxPixelFilter(const char *name, ...)
00126 {
00127 EXTRACT_PARAMETERS( name )
00128 luxPixelFilterV( name, PASS_PARAMETERS );
00129 }
00130
00131 extern "C" void luxPixelFilterV (const char *name, int n, LuxToken tokens[], LuxPointer params[])
00132 {
00133
00134
00135 Context::luxPixelFilter(name,ParamSet(n,name,tokens,params));
00136 }
00137
00138
00139
00140
00141
00142
00143 extern "C" void luxFilm(const char *name, ...)
00144 {
00145 EXTRACT_PARAMETERS( name )
00146 luxFilmV( name, PASS_PARAMETERS );
00147 }
00148
00149 extern "C" void luxFilmV(const char *name, int n, LuxToken tokens[], LuxPointer params[])
00150 {
00151 Context::luxFilm(name,ParamSet(n,name,tokens,params));
00152 }
00153
00154
00155
00156
00157
00158
00159
00160
00161 extern "C" void luxSampler(const char *name, ...)
00162 {
00163 EXTRACT_PARAMETERS( name )
00164 luxSamplerV( name, PASS_PARAMETERS );
00165 }
00166
00167 extern "C" void luxSamplerV(const char *name, int n, LuxToken tokens[], LuxPointer params[])
00168 {
00169 Context::luxSampler(name,ParamSet(n,name,tokens,params));
00170 }
00171
00172
00173
00174
00175
00176
00177 extern "C" void luxAccelerator(const char *name, ...)
00178 {
00179 EXTRACT_PARAMETERS( name )
00180 luxAcceleratorV( name, PASS_PARAMETERS );
00181 }
00182
00183 extern "C" void luxAcceleratorV(const char *name, int n, LuxToken tokens[], LuxPointer params[])
00184 {
00185 Context::luxAccelerator(name,ParamSet(n,name,tokens,params));
00186 }
00187
00188
00189
00190
00191
00192 extern "C" void luxSurfaceIntegrator(const char *name, ...)
00193 {
00194 EXTRACT_PARAMETERS( name )
00195 luxSurfaceIntegratorV( name, PASS_PARAMETERS );
00196 }
00197
00198 extern "C" void luxSurfaceIntegratorV(const char *name, int n, LuxToken tokens[], LuxPointer params[])
00199 {
00200 Context::luxSurfaceIntegrator(name,ParamSet(n,name,tokens,params));
00201 }
00202
00203
00204
00205
00206
00207
00208
00209 extern "C" void luxVolumeIntegrator(const char *name, ...)
00210 {
00211 EXTRACT_PARAMETERS( name )
00212 luxVolumeIntegratorV( name, PASS_PARAMETERS );
00213 }
00214
00215 extern "C" void luxVolumeIntegratorV(const char *name, int n, LuxToken tokens[], LuxPointer params[])
00216 {
00217 Context::luxVolumeIntegrator(name,ParamSet(n,name,tokens,params));
00218 }
00219
00220
00221
00222
00223
00224
00225
00226 extern "C" void luxCamera(const char *name, ...)
00227 {
00228 EXTRACT_PARAMETERS( name )
00229 luxCameraV( name, PASS_PARAMETERS );
00230 }
00231
00232 extern "C" void luxCameraV(const char *name, int n, LuxToken tokens[], LuxPointer params[])
00233 {
00234 Context::luxCamera(name,ParamSet(n,name,tokens,params));
00235 }
00236
00237 extern "C" void luxWorldBegin()
00238 {
00239 Context::luxWorldBegin();
00240 }
00241 extern "C" void luxAttributeBegin()
00242 {
00243 Context::luxAttributeBegin();
00244 }
00245 extern "C" void luxAttributeEnd()
00246 {
00247 Context::luxAttributeEnd();
00248 }
00249 extern "C" void luxTransformBegin()
00250 {
00251 Context::luxTransformBegin();
00252 }
00253 extern "C" void luxTransformEnd()
00254 {
00255 Context::luxTransformEnd();
00256 }
00257
00258
00259
00260
00261
00262
00263 extern "C" void luxTexture(const char *name, const char *type, const char *texname, ...)
00264 {
00265 EXTRACT_PARAMETERS( texname )
00266 luxTextureV( name, type, texname, PASS_PARAMETERS );
00267 }
00268
00269 extern "C" void luxTextureV(const char *name, const char *type, const char *texname, int n, LuxToken tokens[], LuxPointer params[])
00270 {
00271 Context::luxTexture(name,type,texname,ParamSet(n,name,tokens,params));
00272 }
00273
00274
00275
00276
00277
00278 extern "C" void luxMaterial(const char *name, ...)
00279 {
00280 EXTRACT_PARAMETERS( name )
00281 luxMaterialV( name, PASS_PARAMETERS );
00282 }
00283
00284 extern "C" void luxMaterialV(const char *name, int n, LuxToken tokens[], LuxPointer params[])
00285 {
00286 Context::luxMaterial(name,ParamSet(n,name,tokens,params));
00287 }
00288
00289 extern "C" void luxMakeNamedMaterial(const char *name, ...)
00290 {
00291 EXTRACT_PARAMETERS( name )
00292 luxMakeNamedMaterialV( name, PASS_PARAMETERS );
00293 }
00294
00295 extern "C" void luxMakeNamedMaterialV(const char *name, int n, LuxToken tokens[], LuxPointer params[])
00296 {
00297 Context::luxMakeNamedMaterial(name,ParamSet(n,name,tokens,params));
00298 }
00299
00300 extern "C" void luxNamedMaterial(const char *name, ...)
00301 {
00302 EXTRACT_PARAMETERS( name )
00303 luxNamedMaterialV( name, PASS_PARAMETERS );
00304 }
00305
00306 extern "C" void luxNamedMaterialV(const char *name, int n, LuxToken tokens[], LuxPointer params[])
00307 {
00308 Context::luxNamedMaterial(name,ParamSet(n,name,tokens,params));
00309 }
00310
00311
00312
00313
00314
00315 extern "C" void luxLightSource(const char *name, ...)
00316 {
00317 EXTRACT_PARAMETERS( name )
00318 luxLightSourceV( name, PASS_PARAMETERS );
00319 }
00320
00321 extern "C" void luxLightSourceV(const char *name, int n, LuxToken tokens[], LuxPointer params[])
00322 {
00323 Context::luxLightSource(name,ParamSet(n,name,tokens,params));
00324 }
00325
00326
00327
00328
00329
00330 extern "C" void luxAreaLightSource(const char *name, ...)
00331 {
00332 EXTRACT_PARAMETERS( name )
00333 luxAreaLightSourceV( name, PASS_PARAMETERS );
00334 }
00335
00336 extern "C" void luxAreaLightSourceV(const char *name, int n, LuxToken tokens[], LuxPointer params[])
00337 {
00338 Context::luxAreaLightSource(name,ParamSet(n,name,tokens,params));
00339 }
00340
00341
00342
00343
00344
00345 extern "C" void luxPortalShape(const char *name, ...)
00346 {
00347 EXTRACT_PARAMETERS( name )
00348 luxPortalShapeV( name, PASS_PARAMETERS );
00349 }
00350
00351 extern "C" void luxPortalShapeV(const char *name, int n, LuxToken tokens[], LuxPointer params[])
00352 {
00353 Context::luxPortalShape(name,ParamSet(n,name,tokens,params));
00354 }
00355
00356
00357
00358
00359
00360 extern "C" void luxShape(const char *name, ...)
00361 {
00362 EXTRACT_PARAMETERS( name )
00363 luxShapeV( name, PASS_PARAMETERS );
00364 }
00365
00366 extern "C" void luxShapeV(const char *name, int n, LuxToken tokens[], LuxPointer params[])
00367 {
00368 Context::luxShape(name,ParamSet(n,name,tokens,params));
00369 }
00370
00371 extern "C" void luxReverseOrientation() {
00372 Context::luxReverseOrientation();
00373 }
00374
00375
00376
00377
00378 extern "C" void luxVolume(const char *name, ...)
00379 {
00380 EXTRACT_PARAMETERS( name )
00381 luxVolumeV( name, PASS_PARAMETERS );
00382 }
00383
00384 extern "C" void luxVolumeV(const char *name, int n, LuxToken tokens[], LuxPointer params[])
00385 {
00386 Context::luxVolume(name,ParamSet(n,name,tokens,params));
00387 }
00388
00389 extern "C" void luxObjectBegin(const char *name) {
00390 Context::luxObjectBegin(std::string(name));
00391 }
00392 extern "C" void luxObjectEnd() {
00393 Context::luxObjectEnd();
00394 }
00395 extern "C" void luxObjectInstance(const char *name) {
00396 Context::luxObjectInstance(std::string(name));
00397 }
00398 extern "C" void luxWorldEnd() {
00399 Context::luxWorldEnd();
00400 }
00401
00402
00403 extern "C" void luxInit() {
00404
00405
00406
00407
00408
00409
00410 #ifdef FAST_INT
00411 #if defined(__linux__) && defined(__i386__)
00412 int cword = _FPU_MASK_DM | _FPU_MASK_ZM | _FPU_MASK_OM | _FPU_MASK_PM |
00413 _FPU_MASK_UM | _FPU_MASK_IM | _FPU_DOUBLE | _FPU_RC_NEAREST;
00414 _FPU_SETCW(cword);
00415 #endif
00416 #if defined(WIN32)
00417 _control87(_PC_53, MCW_PC);
00418 #endif
00419 #endif // FAST_INT
00420
00421
00422
00423 if (initialized)
00424 luxError(LUX_ILLSTATE,LUX_ERROR,"luxInit() has already been called.");
00425 else
00426 Context::setActive(new Context());
00427
00428 initialized=true;
00429 }
00430
00431
00432
00433
00434
00435
00436
00437 extern "C" void luxStart() {
00438 Context::luxStart();
00439 }
00440
00441 extern "C" void luxPause() {
00442 Context::luxPause();
00443 }
00444
00445 extern "C" void luxExit() {
00446 Context::luxExit();
00447 }
00448
00449 extern "C" void luxWait() {
00450 Context::luxWait();
00451 }
00452
00453
00454 extern "C" int luxAddThread() {
00455 return Context::luxAddThread();
00456
00457 }
00458
00459 extern "C" void luxRemoveThread() {
00460 Context::luxRemoveThread();
00461
00462 }
00463
00464
00465 extern "C" void luxUpdateFramebuffer() {
00466 Context::luxUpdateFramebuffer();
00467
00468 }
00469
00470 extern "C" unsigned char* luxFramebuffer() {
00471 return Context::luxFramebuffer();
00472
00473 }
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495 extern "C" double luxStatistics(const char *statName) {
00496 if(initialized) return Context::luxStatistics(statName);
00497 else
00498 {
00499 luxError(LUX_NOTSTARTED,LUX_SEVERE,"luxInit() must be called before calling 'luxStatistics'. Ignoring.");
00500 return 0;
00501 }
00502 }
00503
00504 extern "C" void luxEnableDebugMode() {
00505 Context::luxEnableDebugMode();
00506 }
00507
00508 extern "C" void luxUpdateFilmFromNetwork() {
00509
00510 Context::luxUpdateFilmFromNetwork();
00511 }
00512
00513 extern "C" void luxSetNetworkServerUpdateInterval(int updateInterval) {
00514
00515 Context::luxSetNetworkServerUpdateInterval(updateInterval);
00516 }
00517
00518 extern "C" int luxGetNetworkServerUpdateInterval() {
00519
00520 return Context::luxGetNetworkServerUpdateInterval();
00521 }
00522
00523
00524 LuxErrorHandler luxError=luxErrorPrint;
00525 int luxLastError=LUX_NOERROR;
00526
00527 extern "C" void luxErrorHandler(LuxErrorHandler handler) {
00528 luxError=handler;
00529 }
00530
00531 extern "C" void luxErrorAbort(int code, int severity, const char *message) {
00532 luxErrorPrint(code, severity, message);
00533 if (severity!=LUX_INFO)
00534 exit(code);
00535 }
00536
00537 extern "C" void luxErrorIgnore(int code, int severity, const char *message) {
00538 luxLastError=code;
00539 }
00540
00541 extern "C" void luxErrorPrint(int code, int severity, const char *message) {
00542 luxLastError=code;
00543 std::cerr<<"[";
00544 #ifndef WIN32 //windows does not support ANSI escape codes
00545
00546 switch (severity) {
00547 case LUX_INFO:
00548 std::cerr<<"\033[0;32m";
00549 break;
00550 case LUX_WARNING:
00551 std::cerr<<"\033[0;33m";
00552 break;
00553 case LUX_ERROR:
00554 std::cerr<<"\033[0;31m";
00555 break;
00556 case LUX_SEVERE:
00557 std::cerr<<"\033[0;31m";
00558 break;
00559 }
00560 #endif
00561 std::cerr<<"Lux ";
00562 std::cerr<<boost::posix_time::second_clock::local_time()<<' ';
00563 switch (severity) {
00564 case LUX_INFO:
00565 std::cerr<<"INFO";
00566 break;
00567 case LUX_WARNING:
00568 std::cerr<<"WARNING";
00569 break;
00570 case LUX_ERROR:
00571 std::cerr<<"ERROR";
00572 break;
00573 case LUX_SEVERE:
00574 std::cerr<<"SEVERE ERROR";
00575 break;
00576 }
00577 std::cerr<<" : "<<code;
00578 #ifndef WIN32 //windows does not support ANSI escape codes
00579 std::cerr<<"\033[0m";
00580 #endif
00581 std::cerr<<"] "<<message<<std::endl;
00582 }
00583