bool VolumetricFogRTManager::Init()
{
   if (mIsInitialized)
   {
      Con::errorf("VolumetricFogRTManager allready initialized!!");
      return true;
   }
   
   GuiCanvas* cv = dynamic_cast<GuiCanvas*>(Sim::findObject("Canvas"));
   if (cv == NULL)
   {
      Con::errorf("VolumetricFogRTManager::Init() - Canvas not found!!");
      return false;
   }
   
   mPlatformWindow = cv->getPlatformWindow();
   mPlatformWindow->getScreenResChangeSignal().notify(this,&VolumetricFogRTManager::ResizeRT);
   
   if (mTargetScale < 1 || GFX->getAdapterType() == Direct3D11)
      mTargetScale = 1;
   
   mWidth = mFloor(mPlatformWindow->getClientExtent().x / mTargetScale);
   mHeight = mFloor(mPlatformWindow->getClientExtent().y / mTargetScale);
   
   mDepthBuffer = GFXTexHandle(mWidth, mHeight, GFXFormatR32F,
   &GFXRenderTargetProfile, avar("%s() - mDepthBuffer (line %d)", __FUNCTION__, __LINE__));
   if (!mDepthBuffer.isValid())
   {
      Con::errorf("VolumetricFogRTManager Fatal Error: Unable to create Depthbuffer");
      return false;
   }
   if (!mDepthTarget.registerWithName("volfogdepth"))
   {
      Con::errorf("VolumetricFogRTManager Fatal Error : Unable to register Depthbuffer");
      return false;
   }
   mDepthTarget.setTexture(mDepthBuffer);
   
   mFrontBuffer = GFXTexHandle(mWidth, mHeight, GFXFormatR32F,
   &GFXRenderTargetProfile, avar("%s() - mFrontBuffer (line %d)", __FUNCTION__, __LINE__));
   if (!mFrontBuffer.isValid())
   {
      Con::errorf("VolumetricFogRTManager Fatal Error: Unable to create front buffer");
      return false;
   }
   if (!mFrontTarget.registerWithName("volfogfront"))
   {
      Con::errorf("VolumetricFogRTManager Fatal Error : Unable to register Frontbuffer");
      return false;
   }
   
   mFrontTarget.setTexture(mFrontBuffer);
   
   Con::setVariable("$VolumetricFog::density", "0.0");
   
   mIsInitialized = true;
   
   return true;
}
U32 GuiImageList::Insert( const char* texturePath, GFXTextureProfile *Type )
{
  TextureEntry *t = new TextureEntry;

  if ( ! t ) return -1;

  t->TexturePath = StringTable->insert(texturePath);
  if ( *t->TexturePath ) 
  {
    t->Handle = GFXTexHandle(t->TexturePath, Type, avar("%s() - t->Handle (line %d)", __FUNCTION__, __LINE__));

    if ( t->Handle )
    {
      t->id = ++mUniqueId;

      mTextures.push_back( t );

      return t->id;

    }
  }

  // Free Texture Entry.
  delete t;

  // Return Failure.
  return -1;

}
Exemple #3
0
void TerrainBlock::_updateMaterials()
{   
   mBaseTextures.setSize( mFile->mMaterials.size() );

   mMaxDetailDistance = 0.0f;

   for ( U32 i=0; i < mFile->mMaterials.size(); i++ )
   {
      TerrainMaterial *mat = mFile->mMaterials[i];

      if( !mat->getDiffuseMap().isEmpty() )
         mBaseTextures[i].set( mat->getDiffuseMap(),  
            &GFXDefaultStaticDiffuseProfile, 
            "TerrainBlock::_updateMaterials() - DiffuseMap" );
      else
         mBaseTextures[ i ] = GFXTexHandle();

      // Find the maximum detail distance.
      if (  mat->getDetailMap().isNotEmpty() &&
            mat->getDetailDistance() > mMaxDetailDistance )
         mMaxDetailDistance = mat->getDetailDistance();

      if (  mat->getMacroMap().isNotEmpty() &&
            mat->getMacroDistance() > mMaxDetailDistance )
         mMaxDetailDistance = mat->getMacroDistance();
   }

   if ( mCell )
      mCell->deleteMaterials();
}
bool ParticleData::reload(char errorBuffer[256])
{
   bool error = false;
	if (textureName && textureName[0])
   {
        textureHandle = GFXTexHandle(textureName, &GFXDefaultStaticDiffuseProfile, avar("%s() - textureHandle (line %d)", __FUNCTION__, __LINE__));
        if (!textureHandle)
        {
				dSprintf(errorBuffer, 256, "Missing particle texture: %s", textureName);
				error = true;
		  }
	}
   /*
   numFrames = 0;
   for( int i=0; i<PDC_MAX_TEX; i++ )
   {
      if( textureNameList[i] && textureNameList[i][0] )
      {
         textureList[i] = TextureHandle( textureNameList[i], MeshTexture );
         if (!textureList[i].getName())
         {
            dSprintf(errorBuffer, 256, "Missing particle texture: %s", textureNameList[i]);
            error = true;
         }
         numFrames++;
      }
   }
   */
   return !error;
}
Exemple #5
0
void afxZodiacData::unpackData(BitStream* stream)
{
  Parent::unpackData(stream);

  txr_name = stream->readSTString();
  txr = GFXTexHandle();
  stream->read(&radius_xy);
  stream->read(&vert_range.x);
  stream->read(&vert_range.y);
  stream->read(&grade_range.x);
  stream->read(&grade_range.y);
  stream->read(&start_ang);
  stream->read(&ang_per_sec);
  stream->read(&grow_in_time);
  stream->read(&shrink_out_time);
  stream->read(&growth_rate);
  stream->read(&color);
  stream->read(&zflags);
  stream->read(&altitude_max);
  stream->read(&altitude_falloff);
  altitude_shrinks = stream->readFlag();
  altitude_fades = stream->readFlag();
  stream->read(&distance_max);
  stream->read(&distance_falloff);

  expand_zflags();
}
bool LightningData::preload(bool server, String &errorStr)
{
   if (Parent::preload(server, errorStr) == false)
      return false;

   dQsort(thunderSounds, MaxThunders, sizeof(SFXTrack*), cmpSounds);
   for (numThunders = 0; numThunders < MaxThunders && thunderSounds[numThunders] != NULL; numThunders++) {
      //
   }

   if (server == false) 
   {
      String sfxErrorStr;
      for (U32 i = 0; i < MaxThunders; i++) {
         if( !sfxResolve( &thunderSounds[ i ], sfxErrorStr ) )
            Con::errorf(ConsoleLogEntry::General, "LightningData::preload: Invalid packet: %s", sfxErrorStr.c_str());
      }

      if( !sfxResolve( &strikeSound, sfxErrorStr ) )
         Con::errorf(ConsoleLogEntry::General, "LightningData::preload: Invalid packet: %s", sfxErrorStr.c_str());

      for (U32 i = 0; i < MaxTextures; i++) 
      {
         if (strikeTextureNames[i][0])
            strikeTextures[i] = GFXTexHandle(strikeTextureNames[i], &GFXDefaultStaticDiffuseProfile, avar("%s() - strikeTextures[%d] (line %d)", __FUNCTION__, i, __LINE__));
      }
   }


   return true;
}
bool VolumetricFogRTManager::Resize()
{
   if (mTargetScale < 1 || GFX->getAdapterType() == Direct3D11)
      mTargetScale = 1;

   mWidth = mFloor(mPlatformWindow->getClientExtent().x / mTargetScale);
   mHeight = mFloor(mPlatformWindow->getClientExtent().y / mTargetScale);
   
   if (mWidth < 16 || mHeight < 16)
      return false;
   
   if (mFrontTarget.isRegistered())
      mFrontTarget.setTexture(NULL);
   
   if (mDepthTarget.isRegistered())
      mDepthTarget.setTexture(NULL);
   
   if (mDepthBuffer.isValid())
      mDepthBuffer->kill();
   
   if (mFrontBuffer.isValid())
      mFrontBuffer->kill();
   
   mFrontBuffer = GFXTexHandle(mWidth, mHeight, GFXFormatR32F,
   &GFXRenderTargetProfile, avar("%s() - mFrontBuffer (line %d)", __FUNCTION__, __LINE__));
   if (!mFrontBuffer.isValid())
   {
      Con::errorf("VolumetricFogRTManager::Resize() Fatal Error: Unable to create front buffer");
      return false;
   }
   mFrontTarget.setTexture(mFrontBuffer);
   
   mDepthBuffer = GFXTexHandle(mWidth, mHeight, GFXFormatR32F,
   &GFXRenderTargetProfile, avar("%s() - mDepthBuffer (line %d)", __FUNCTION__, __LINE__));
   if (!mDepthBuffer.isValid())
   {
      Con::errorf("VolumetricFogRTManager::Resize() Fatal Error: Unable to create Depthbuffer");
      return false;
   }
   mDepthTarget.setTexture(mDepthBuffer);
   return true;
}
Exemple #8
0
//--------------------------------------------------------------------------
// Preload data - load resources
//--------------------------------------------------------------------------
bool SplashData::preload(bool server, String &errorStr)
{
   if (Parent::preload(server, errorStr) == false)
      return false;

   if (!server)
   {
      S32 i;
      for( i=0; i<NUM_EMITTERS; i++ )
      {
         if( !emitterList[i] && emitterIDList[i] != 0 )
         {
            if( Sim::findObject( emitterIDList[i], emitterList[i] ) == false)
            {
               Con::errorf( ConsoleLogEntry::General, "SplashData::onAdd: Invalid packet, bad datablockId(particle emitter): 0x%x", emitterIDList[i] );
            }
         }
      }

      for( i=0; i<NUM_TEX; i++ )
      {
         if (textureName[i] && textureName[i][0])
         {
            textureHandle[i] = GFXTexHandle(textureName[i], &GFXDefaultStaticDiffuseProfile, avar("%s() - textureHandle[%d] (line %d)", __FUNCTION__, i, __LINE__) );
         }
      }
   }

   if( !explosion && explosionId != 0 )
   {
      if( !Sim::findObject(explosionId, explosion) )
      {
         Con::errorf(ConsoleLogEntry::General, "SplashData::preload: Invalid packet, bad datablockId(explosion): %d", explosionId);
      }
   }

   return true;
}
GFXTexHandle ReflectionManager::allocRenderTarget( const Point2I &size )
{
   return GFXTexHandle( size.x, size.y, mReflectFormat, 
                        &ReflectRenderTargetProfile, 
                        avar("%s() - mReflectTex (line %d)", __FUNCTION__, __LINE__) );
}
//-----------------------------------------------------------------------------
// preload
//-----------------------------------------------------------------------------
bool ParticleData::preload(bool server, String &errorStr)
{
   if (Parent::preload(server, errorStr) == false)
      return false;

   bool error = false;
   if(!server)
   {
      // Here we attempt to load the particle's texture if specified. An undefined
      // texture is *not* an error since the emitter may provide one.
      if (textureName && textureName[0])
      {
        textureHandle = GFXTexHandle(textureName, &GFXDefaultStaticDiffuseProfile, avar("%s() - textureHandle (line %d)", __FUNCTION__, __LINE__));
        if (!textureHandle)
        {
          errorStr = String::ToString("Missing particle texture: %s", textureName);
          error = true;
        }
      }

      if (animateTexture) 
      {
        // Here we parse animTexFramesString into byte-size frame numbers in animTexFrames.
        // Each frame token must be separated by whitespace.
        // A frame token must be a positive integer frame number or a range of frame numbers
        // separated with a '-'. 
        // The range separator, '-', cannot have any whitspace around it.
        // Ranges can be specified to move through the frames in reverse as well as forward.
        // Frame numbers exceeding the number of tiles will wrap.
        //   example:
        //     "0-16 20 19 18 17 31-21"

        S32 n_tiles = animTexTiling.x * animTexTiling.y;
        AssertFatal(n_tiles > 0 && n_tiles <= 256, "Error, bad animTexTiling setting." );

        animTexFrames.clear();

        char* tokCopy = new char[dStrlen(animTexFramesString) + 1];
        dStrcpy(tokCopy, animTexFramesString);

        char* currTok = dStrtok(tokCopy, " \t");
        while (currTok != NULL) 
        {
          char* minus = dStrchr(currTok, '-');
          if (minus)
          { 
            // add a range of frames
            *minus = '\0';
            S32 range_a = dAtoi(currTok);
            S32 range_b = dAtoi(minus+1);
            if (range_b < range_a)
            {
              // reverse frame range
              for (S32 i = range_a; i >= range_b; i--)
                animTexFrames.push_back((U8)(i % n_tiles));
            }
            else
            {
              // forward frame range
              for (S32 i = range_a; i <= range_b; i++)
                animTexFrames.push_back((U8)(i % n_tiles));
            }
          }
          else
          {
            // add one frame
            animTexFrames.push_back((U8)(dAtoi(currTok) % n_tiles));
          }
          currTok = dStrtok(NULL, " \t");
        }

        // Here we pre-calculate the UVs for each frame tile, which are
        // tiled inside the UV region specified by texCoords. Since the
        // UVs are calculated using bilinear interpolation, the texCoords
        // region does *not* have to be an axis-aligned rectangle.

        if (animTexUVs)
          delete [] animTexUVs;

        animTexUVs = new Point2F[(animTexTiling.x+1)*(animTexTiling.y+1)];

        // interpolate points on the left and right edge of the uv quadrangle
        Point2F lf_pt = texCoords[0];
        Point2F rt_pt = texCoords[3];

        // per-row delta for left and right interpolated points
        Point2F lf_d = (texCoords[1] - texCoords[0])/(F32)animTexTiling.y;
        Point2F rt_d = (texCoords[2] - texCoords[3])/(F32)animTexTiling.y;

        S32 idx = 0;
        for (S32 yy = 0; yy <= animTexTiling.y; yy++)
        {
          Point2F p = lf_pt;
          Point2F dp = (rt_pt - lf_pt)/(F32)animTexTiling.x;
          for (S32 xx = 0; xx <= animTexTiling.x; xx++)
          {
            animTexUVs[idx++] = p;
            p += dp;
          }
          lf_pt += lf_d;
          rt_pt += rt_d;
        }

        // cleanup
        delete [] tokCopy;
        numFrames = animTexFrames.size();
      }
   }

   return !error;
}
void ClipMapBlenderCache::initialize( ClipMap *cm )
{
	mOwningClipMap = cm;
	mClipMapSize = cm->mClipMapSize;

	mLightmapScratchTextures.push_back(GFXTexHandle( mClipMapSize, mClipMapSize, GFXFormatR8G8B8X8, &ClipMapTextureProfile, avar("%s() - mLightmapScratchTextures (line %d)", __FUNCTION__, __LINE__), 1 ));

	if (GFX->getPixelShaderVersion() == 0.0f)
	{
		mFixedfunction = true;

		// Fixed function stateblock
		GFXStateBlockDesc sbFF;
		sbFF.samplersDefined = true;
		sbFF.samplers[0] = GFXSamplerStateDesc::getClampLinear();
		sbFF.samplers[0].textureColorOp = GFXTOPSelectARG1;
		sbFF.samplers[0].colorArg1 = GFXTATexture;
		sbFF.samplers[1] = GFXSamplerStateDesc::getWrapLinear();      
		mFFBaseLayerSB = GFX->createStateBlock(sbFF);
		sbFF.setBlend(true, GFXBlendOne, GFXBlendOne);
		mFFAdditionalLayersSB = GFX->createStateBlock(sbFF);
		sbFF.setBlend(true, GFXBlendDestColor, GFXBlendSrcColor);
		sbFF.samplers[1].textureColorOp = GFXTOPDisable;
		mFFLightmapSB = GFX->createStateBlock(sbFF);
	}
	else
	{
		mFixedfunction = false;

		// Find and init shaders.
		ShaderData *sd = NULL;      
		if(GFX->getPixelShaderVersion() >= 2.0f)
		{
			if(!Sim::findObject( ( mLM1 ? "AtlasBlender20ShaderLM1" : "AtlasBlender20Shader" ), sd) || (sd->mShader == NULL))
			{
				Con::errorf("ClipMapBlenderCache::initialize - "
					"Couldn't find shader 'AtlasBlender20Shader'! Terrain will not blend properly on SM2.0 cards!");
			}
			else
			{
				mOnePass = sd->mShader;

				if (mOnePass)
					mShaderConsts = mOnePass->allocConstBuffer();

				if (mShaderConsts)
					sd->mapSamplerNames(mShaderConsts);
			}
		}
		else
		{
			if(!Sim::findObject( ( mLM1 ? "AtlasBlender11AShaderLM1" : "AtlasBlendeer11AShader" ), sd) || (sd->mShader == NULL))
			{
				Con::errorf("ClipMapBlenderCache::initialize - "
					"Couldn't find shader 'AtlasBlender11AShader'! Terrain will not blend properly on SM1.0 cards!");
			}
			else
			{
				mTwoPass[0] = sd->mShader;

				if (mTwoPass[0])
					mShaderConsts = mTwoPass[0]->allocConstBuffer();

				if (mShaderConsts)
					sd->mapSamplerNames(mShaderConsts);
			}

			if(!Sim::findObject( ( mLM1 ? "AtlasBlender11BShaderLM1" : "AtlasBlender11BShader" ), sd) || (sd->mShader == NULL))
			{
				Con::errorf("ClipMapBlenderCache::initialize - "
					"Couldn't find shader 'AtlasBlender11BShader'! Terrain will not blend properly on SM1.0 cards!");
			}
			else
			{
				mTwoPass[1] = sd->mShader;
			}
		}
		if (mShaderConsts)
		{
			mModelViewProjSC = mShaderConsts->getShader()->getShaderConstHandle(ShaderGenVars::modelview);
			mOpacityMapSC = mShaderConsts->getShader()->getShaderConstHandle("$opacity");
			mLightMapSC = mShaderConsts->getShader()->getShaderConstHandle("$lightMap");
			mTex1SC = mShaderConsts->getShader()->getShaderConstHandle("$tex1");
			mTex2SC = mShaderConsts->getShader()->getShaderConstHandle("$tex2");
			mTex3SC = mShaderConsts->getShader()->getShaderConstHandle("$tex3");
			mTex4SC = mShaderConsts->getShader()->getShaderConstHandle("$tex4");
			mSourceTexScalesSC = mShaderConsts->getShader()->getShaderConstHandle("$sourceTexScales");
		}

		// Init state blocks
		GFXStateBlockDesc sbd;
		sbd.setCullMode(GFXCullNone);
		sbd.setZEnable(false);
		sbd.zWriteEnable = false;
		sbd.samplersDefined = true;
		sbd.samplers[0] = GFXSamplerStateDesc::getClampLinear();
		sbd.samplers[1] = GFXSamplerStateDesc::getClampLinear();
		sbd.samplers[2] = GFXSamplerStateDesc::getWrapLinear();
		sbd.samplers[3] = GFXSamplerStateDesc::getWrapLinear();
		sbd.samplers[4] = GFXSamplerStateDesc::getWrapLinear();
		sbd.samplers[5] = GFXSamplerStateDesc::getWrapLinear();

		mOnePassSB = GFX->createStateBlock(sbd);

		sbd.setBlend(true, GFXBlendOne, GFXBlendOne);

		mTwoPassSB = GFX->createStateBlock(sbd);   
	}

	createOpacityScratchTextures();
}
GFXTexHandle ProcessedMaterial::_createTexture( const char* filename, GFXTextureProfile *profile)
{
   return GFXTexHandle( _getTexturePath(filename), profile, avar("%s() - NA (line %d)", __FUNCTION__, __LINE__) );
}