void main(void *arg) { if(1)//ISUVDEFINED(uvCoord().x, uvCoord().y) { if (fileTextureName() != eiNULL_TAG) { eiTag tex = fileTextureName(); scalar filterWidth = filterType()>0.0f ? filter() : 0.0f; // we ingore single-channel case //if( num_channels() == 1 ) //{ // /* We must read single-channel files as float or only the red // channel will be filled. */ // scalar r = scalar_texture(tex, 0, uvCoord().x, uvCoord().y) // outColor() = color(r, 0.0f, 0.0f); //} //else { outColor() = color_texture(tex, 0, uvCoord().x, uvCoord().y); } if( fileHasAlpha() ) { outAlpha() = scalar_texture(tex, 3, uvCoord().x, uvCoord().y); }else{ outAlpha() = luminance( outColor() ); } } } else { outColor() = defaultColor(); outAlpha() = luminance( outColor() ); } outTransparency() = color(1.0f-outAlpha(),1.0f-outAlpha(),1.0f-outAlpha()); }
SMListData::SMListData( ): number_of_elements(0), mode( -1 ) { // get name for the data file char* tmpFileName = tempnam(MagnusTmp::magnusTmp(),NULL); dataFileName = Chars( tmpFileName ); // makes an empty color file for front end maybe needs to be changed //const char* destColor = Chars( dataFileName ) + Chars(".color"); Chars destColor = Chars( tmpFileName ) + Chars(".color"); ofstream outColor( destColor ); outColor << "#0000000%000@" << flush; outColor.close(); free(tmpFileName); // get name for the referencies file tmpFileName = tempnam(MagnusTmp::magnusTmp(),NULL); refFileName = Chars( tmpFileName ); free(tmpFileName); }
void blInteriorProxy::addToShadowVolume(ShadowVolumeBSP * shadowVolume, LightInfo * light, S32 level) { if(light->getType() != LightInfo::Vector) return; ColorF ambient = light->getAmbient(); bool shadowedTree = true; InteriorInstance* interior = dynamic_cast<InteriorInstance*>(getObject()); if (!interior) return; Resource<InteriorResource> mInteriorRes = interior->getResource(); // check if just getting shadow detail if(level == SceneLighting::SHADOW_DETAIL) { shadowedTree = false; level = mInteriorRes->getNumDetailLevels() - 1; } Interior * detail = mInteriorRes->getDetailLevel(level); bool hasAlarm = detail->hasAlarmState(); // make sure surfaces do not get processed more than once BitVector surfaceProcessed; surfaceProcessed.setSize(detail->mSurfaces.size()); surfaceProcessed.clear(); ColorI color = light->getAmbient(); // go through the zones of the interior and grab outside visible surfaces for(U32 i = 0; i < detail->getNumZones(); i++) { Interior::Zone & zone = detail->mZones[i]; for(U32 j = 0; j < zone.surfaceCount; j++) { U32 surfaceIndex = detail->mZoneSurfaces[zone.surfaceStart + j]; // dont reprocess a surface if(surfaceProcessed.test(surfaceIndex)) continue; surfaceProcessed.set(surfaceIndex); Interior::Surface & surface = detail->mSurfaces[surfaceIndex]; // outside visible? if(!(surface.surfaceFlags & Interior::SurfaceOutsideVisible)) continue; // good surface? PlaneF plane = detail->getPlane(surface.planeIndex); if(Interior::planeIsFlipped(surface.planeIndex)) plane.neg(); // project the plane PlaneF projPlane; mTransformPlane(interior->getTransform(), interior->getScale(), plane, &projPlane); // fill with ambient? (need to do here, because surface will not be // added to the SVBSP tree) F32 dot = mDot(projPlane, light->getDirection()); if(dot > -gParellelVectorThresh)// && !(GFX->getPixelShaderVersion() > 0.0) ) { if(shadowedTree) { // alarm lighting GFXTexHandle normHandle = gInteriorLMManager.duplicateBaseLightmap(detail->getLMHandle(), interior->getLMHandle(), detail->getNormalLMapIndex(surfaceIndex)); GFXTexHandle alarmHandle; GBitmap * normLightmap = normHandle->getBitmap(); GBitmap * alarmLightmap = 0; // check if they share the lightmap if(hasAlarm) { if(detail->getNormalLMapIndex(surfaceIndex) != detail->getAlarmLMapIndex(surfaceIndex)) { alarmHandle = gInteriorLMManager.duplicateBaseLightmap(detail->getLMHandle(), interior->getLMHandle(), detail->getAlarmLMapIndex(surfaceIndex)); alarmLightmap = alarmHandle->getBitmap(); } } // // Support for interior light map border sizes. // U32 xlen, ylen, xoff, yoff; U32 lmborder = detail->getLightMapBorderSize(); xlen = surface.mapSizeX + (lmborder * 2); ylen = surface.mapSizeY + (lmborder * 2); xoff = surface.mapOffsetX - lmborder; yoff = surface.mapOffsetY - lmborder; // attemp to light normal and alarm lighting for(U32 c = 0; c < 2; c++) { GBitmap * lightmap = (c == 0) ? normLightmap : alarmLightmap; if(!lightmap) continue; // fill it for(U32 y = 0; y < ylen; y++) { for(U32 x = 0; x < xlen; x++) { ColorI outColor(255, 0, 0, 255); #ifndef SET_COLORS ColorI lmColor(0, 0, 0, 255); lightmap->getColor(xoff + x, yoff + y, lmColor); U32 _r = static_cast<U32>( color.red ) + static_cast<U32>( lmColor.red ); U32 _g = static_cast<U32>( color.green ) + static_cast<U32>( lmColor.green ); U32 _b = static_cast<U32>( color.blue ) + static_cast<U32>( lmColor.blue ); outColor.red = mClamp(_r, 0, 255); outColor.green = mClamp(_g, 0, 255); outColor.blue = mClamp(_b, 0, 255); #endif lightmap->setColor(xoff + x, yoff + y, outColor); } } } } continue; } ShadowVolumeBSP::SVPoly * poly = buildInteriorPoly(shadowVolume, detail, surfaceIndex, light, shadowedTree); // insert it into the SVBSP tree shadowVolume->insertPoly(poly); } } }
void SMListData::doHardCopy( const SMListData& sd ) { closeCurrentMode(); number_of_elements = sd.number_of_elements; // copy the file with enumerations char* tmpFileName = tempnam(MagnusTmp::magnusTmp(),NULL); Chars fName = sd.dataFileName; const char* tmpStr = fName; int pid; if ( ( pid = fork() ) == 0 ) { setpgid(0,0); if ( execlp( "cp", "",tmpStr ,tmpFileName, NULL) == -1 ) error("SMListData( const SMListData& sd, int m = ios::in ):" " can't create a copy of the data file."); _exit(0); } while( kill(pid, 0) == 0 ) { sleep(100); } #ifdef BSD int status; wait(&status); #endif // make an empty color file //const char* destColor = Chars( tmpFileName ) + Chars(".color"); Chars destColor = Chars( tmpFileName ) + Chars(".color"); ofstream outColor( destColor ); outColor << "#0000000%000@" << flush; outColor.close(); // save the name of the data file dataFileName = Chars( tmpFileName ); free( tmpFileName ); // Copy references file tmpFileName = tempnam(MagnusTmp::magnusTmp(),NULL); fName = sd.refFileName; tmpStr = fName; if ( ( pid = fork() ) == 0 ) { setpgid(0,0); if ( execlp( "cp", "",tmpStr ,tmpFileName, NULL) == -1 ) error("SMListData( const SMListData& sd, int m = ios::in ):" " can't create a copy of the offset file."); _exit(0); } while( kill(pid, 0) == 0 ) { sleep(10); } #ifdef BSD status; wait(&status); #endif // save the name of the offset file refFileName = Chars( tmpFileName ); free( tmpFileName ); }