Advertisement
expired6978

ShaderPropertySet

May 23rd, 2013
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.54 KB | None | 0 0
  1. void SetShaderProperty(NiAVObject * node, OVRValue * value, bool immediate)
  2. {
  3.     NiGeometry * geometry = node->GetAsNiGeometry();
  4.     if(geometry)
  5.     {
  6.         BSShaderProperty * shaderProperty = (BSShaderProperty *)geometry->m_spEffectState;
  7.         if(value->key >= OVRValue::kParam_ControllersStart && value->key <= OVRValue::kParam_ControllersEnd)
  8.         {
  9.             SInt8 currentIndex = 0;
  10.             SInt8 controllerIndex = value->index;
  11.             if(controllerIndex != -1)
  12.             {
  13.                 NiTimeController * controller = shaderProperty->m_controller;
  14.                 while(controller)
  15.                 {
  16.                     if(currentIndex == controllerIndex)
  17.                         break;
  18.  
  19.                     controller = (NiTimeController *)controller->next;
  20.                     currentIndex++;
  21.                 }
  22.  
  23.                 if(controller)
  24.                 {
  25.                     switch(value->key)
  26.                     {
  27.                         case OVRValue::kParam_ControllerFrequency:  UnpackValue(&controller->m_fFrequency, value);  break;
  28.                         case OVRValue::kParam_ControllerPhase:      UnpackValue(&controller->m_fPhase, value);      break;
  29.                         case OVRValue::kParam_ControllerStartTime:  UnpackValue(&controller->m_fLoKeyTime, value);  break;
  30.                         case OVRValue::kParam_ControllerStopTime:   UnpackValue(&controller->m_fHiKeyTime, value);  break;
  31.  
  32.                         // Special cases
  33.                         case OVRValue::kParam_ControllerStartStop:
  34.                             {
  35.                                 float fValue;
  36.                                 UnpackValue(&fValue, value);
  37.                                 if(fValue < 0.0)
  38.                                     controller->Stop();
  39.                                 else
  40.                                     controller->Start(fValue);
  41.                             }
  42.                             break;
  43.                         default:
  44.                             _MESSAGE("Unknown controller key %d %s", value->key, node->m_name);
  45.                             break;
  46.                     }
  47.                 }
  48.             }
  49.         }
  50.         if(shaderProperty->GetRTTI() == NiRTTI_BSEffectShaderProperty)
  51.         {
  52.             BSEffectShaderMaterial * material = (BSEffectShaderMaterial*)shaderProperty->material;
  53.             switch(value->key)
  54.             {
  55.                 case OVRValue::kParam_ShaderEmissiveColor:      UnpackValue(&material->emissiveColor, value);       break;
  56.                 case OVRValue::kParam_ShaderEmissiveMultiple:   UnpackValue(&material->emissiveMultiple, value);    break;
  57.                 default:
  58.                     _MESSAGE("Unknown shader key %d %s", value->key, node->m_name);
  59.                     break;
  60.             }
  61. #ifdef _DEBUG
  62.             _MESSAGE("Applied EffectShader property %d %X to %s", value->key, value->data.u, node->m_name);
  63. #endif
  64.         }
  65.         else if(shaderProperty->GetRTTI() == NiRTTI_BSLightingShaderProperty)
  66.         {
  67.             BSLightingShaderProperty * lightingShader = (BSLightingShaderProperty *)shaderProperty;
  68.             BSLightingShaderMaterial * material = (BSLightingShaderMaterial *)shaderProperty->material;
  69.             switch(value->key)
  70.             {
  71.                 case OVRValue::kParam_ShaderEmissiveColor:      UnpackValue(lightingShader->emissiveColor, value);      break;
  72.                 case OVRValue::kParam_ShaderEmissiveMultiple:   UnpackValue(&lightingShader->emissiveMultiple, value);  break;
  73.                 case OVRValue::kParam_ShaderGlossiness:         UnpackValue(&material->glossiness, value);              break;
  74.                 case OVRValue::kParam_ShaderSpecularStrength:   UnpackValue(&material->specularStrength, value);        break;
  75.                 case OVRValue::kParam_ShaderLightingEffect1:    UnpackValue(&material->lightingEffect1, value);         break;
  76.                 case OVRValue::kParam_ShaderLightingEffect2:    UnpackValue(&material->lightingEffect2, value);         break;
  77.  
  78.                 // Special cases
  79.                 case OVRValue::kParam_ShaderTextureSet:
  80.                     {
  81.                         BGSTextureSet * textureSet = (BGSTextureSet *)value->data.p;
  82.                         if(textureSet)
  83.                         {
  84.                             if(immediate)
  85.                             {
  86.                                 char buffer[MAX_PATH];
  87.                                 for(UInt32 i = 0; i < BSTextureSet::kNumTextures; i++)
  88.                                 {
  89.                                     const char * texturePath = textureSet->textureSet.GetTexturePath(i);
  90.                                     if(texturePath)
  91.                                     {
  92.                                         strcpy_s(buffer, MAX_PATH, "Data\\Textures\\");
  93.                                         strcat_s(buffer, MAX_PATH, texturePath);
  94.                                         material->textureSet->SetTexturePath(i, buffer);
  95.                                     }
  96.                                 }
  97.                                 material->ReleaseTextures();
  98.                                 CALL_MEMBER_FN(lightingShader, InvalidateTextures)(0);
  99.                             }
  100.                             else
  101.                                 CALL_MEMBER_FN(BSTaskPool::GetSingleton(), SetNiGeometryTexture)(geometry, textureSet);
  102.                         }
  103.                     }
  104.                     break;
  105.                 case OVRValue::kParam_ShaderTintColor:
  106.                     {
  107.                         if(material->GetShaderType() == BSShaderMaterial::kShaderType_SkinTint) {
  108.                             BSTintedShaderMaterial * tintedMaterial = (BSTintedShaderMaterial *)material;
  109.                             UnpackValue(&tintedMaterial->tintColor, value);
  110.                         }
  111.                     }
  112.                     break;
  113.                 default:
  114.                     _MESSAGE("Unknown lighting shader key %d %s", value->key, node->m_name);
  115.                     break;
  116.             }
  117. #ifdef _DEBUG
  118.             _MESSAGE("Applied LightingShader property %d %X to %s", value->key, value->data.u, node->m_name);
  119. #endif
  120.         }
  121.     } else {
  122.         _MESSAGE("Failed to cast %s to geometry", node->m_name);
  123.     }
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement