/*virtual*/ void WBCompEldLight::HandleEvent( const WBEvent& Event ) { XTRACE_FUNCTION; Super::HandleEvent( Event ); STATIC_HASHED_STRING( OnMoved ); STATIC_HASHED_STRING( OnDestroyed ); STATIC_HASHED_STRING( AddLight ); STATIC_HASHED_STRING( RemoveLight ); const HashedString EventName = Event.GetEventName(); if( EventName == sOnMoved ) { if( m_DeferAddLight ) { // Do nothing } else { AddLight(); } } else if( EventName == sAddLight ) { AddLight(); } else if( EventName == sOnDestroyed || EventName == sRemoveLight ) { RemoveLight(); } }
CC4Projectile::~CC4Projectile() { if(m_pStatObj) { m_pStatObj->Release(); } if(m_pArmedMaterial) { m_pArmedMaterial->Release(); } if(m_pDisarmedMaterial) { m_pDisarmedMaterial->Release(); } RemoveLight(); CGameRules* pGameRules(NULL); if(gEnv->bMultiplayer && (pGameRules = g_pGame->GetGameRules())) { pGameRules->UnRegisterTeamChangedListener(this); pGameRules->UnRegisterClientConnectionListener(this); } }
//------------------------------------------------------------------------ void CC4Projectile::Explode(const CProjectile::SExplodeDesc& explodeDesc) { if(!CheckForDelayedDetonation(explodeDesc.pos)) { BaseClass::Explode(explodeDesc); RemoveLight(); } }
void Canister::OnPickUp(Unit* Instance) { if ( !IsOfType<PlayerUnit>(Instance) ) return; PlayerUnit* pUnit = (PlayerUnit*)Instance; pUnit->Drink( 30 ); SetState( Dead ); RemoveLight( gPointLight ); }
void CC4Projectile::OnExplosion( const ExplosionInfo& explosionInfo) { if(explosionInfo.projectileId == GetEntityId()) { RemoveLight(); bool dangerous = !m_OnSameTeam || g_pGame->GetGameRules()->GetFriendlyFireRatio() > 0.f; if(gEnv->bMultiplayer && !dangerous && (!gEnv->bServer || !gEnv->IsDedicated())) { SHUDEvent hudEvent(eHUDEvent_RemoveC4Icon); hudEvent.AddData((int)GetEntityId()); CHUDEventDispatcher::CallEvent(hudEvent); } } CProjectile::OnExplosion(explosionInfo); }
void CC4Projectile::Update(SEntityUpdateContext &ctx, int updateSlot) { if(gEnv->bMultiplayer) { IActor* pActor = g_pGame->GetIGameFramework()->GetIActorSystem()->GetActor(m_ownerId); if(!pActor || pActor->IsDead()) { if(gEnv->bServer) { Destroy(); } else { GetEntity()->Hide(true); } RemoveLight(); if(m_isShowingUIIcon) { SHUDEvent hudEvent(eHUDEvent_RemoveC4Icon); hudEvent.AddData((int)GetEntityId()); CHUDEventDispatcher::CallEvent(hudEvent); m_isShowingUIIcon = false; } } } if(m_pLightSource) { UpdateLight(ctx.fFrameTime, false); } if(m_disarmTimer > 0.f) { m_disarmTimer -= ctx.fFrameTime; if(m_disarmTimer <= 0.f) { m_disarmTimer = 0.f; Arm(true); } } BaseClass::Update(ctx, updateSlot); }
/********************************************************************* * * _cbDialog */ static void _cbDialog(WM_MESSAGE * pMsg) { WM_HWIN hItem; int NCode; int Id; switch (pMsg->MsgId) { case WM_INIT_DIALOG: // // Initialization of 'Dropdown' // hItem = WM_GetDialogItem(pMsg->hWin, ID_DROPDOWN_LIGHTS); DROPDOWN_AddString(hItem, "Light 2"); DROPDOWN_AddString(hItem, "Light 1"); DROPDOWN_AddString(hItem, "Item"); DROPDOWN_IncSel(hItem); // // Initialization of 'Address' Text // hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_ADDRESS); TEXT_SetText(hItem, "Address: <address>"); // // Initialization of 'Status' Text // hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_ONOFF); TEXT_SetText(hItem, "Status: ON"); // // Initialization of 'On/Off' Button // hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_ONOFF); BUTTON_SetText(hItem, "Toggle On/Off"); // // Initialization of 'Mode' Text // hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_MODE); TEXT_SetText(hItem, "Mode: Auto"); // // Initialization of 'Mode' Button // hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_MODE); BUTTON_SetText(hItem, "Trigger SOS"); // // Initialization of 'Add' Button // hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_ADD); BUTTON_SetText(hItem, "Add new..."); // // Initialization of 'Reconfigure' Button // hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_RECONFIGURE); BUTTON_SetText(hItem, "Reconfigure..."); // // Initialization of 'Remove' Button // hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_REMOVE); BUTTON_SetText(hItem, "Remove..."); WM_MakeModal(pMsg->hWin); break; case WM_NOTIFY_PARENT: Id = WM_GetId(pMsg->hWinSrc); NCode = pMsg->Data.v; switch (Id) { case ID_DROPDOWN_LIGHTS: // Notifications sent by 'Dropdown' switch (NCode) { case WM_NOTIFICATION_CLICKED: break; case WM_NOTIFICATION_RELEASED: break; case WM_NOTIFICATION_SEL_CHANGED: break; } break; case ID_BUTTON_ONOFF: switch (NCode) { case WM_NOTIFICATION_CLICKED: ToggleLightN(1, WM_GetDialogItem(pMsg->hWin, ID_TEXT_ONOFF)); break; case WM_NOTIFICATION_RELEASED: break; } break; case ID_BUTTON_MODE: switch (NCode) { case WM_NOTIFICATION_CLICKED: TriggerSOS(1, WM_GetDialogItem(pMsg->hWin, ID_TEXT_MODE)); break; case WM_NOTIFICATION_RELEASED: break; } break; case ID_BUTTON_ADD: switch (NCode) { case WM_NOTIFICATION_CLICKED: AddNewLight(0); break; case WM_NOTIFICATION_RELEASED: break; } break; case ID_BUTTON_RECONFIGURE: switch (NCode) { case WM_NOTIFICATION_CLICKED: ReconfigureLight(0); break; case WM_NOTIFICATION_RELEASED: break; } break; case ID_BUTTON_REMOVE: switch (NCode) { case WM_NOTIFICATION_CLICKED: RemoveLight(0); break; case WM_NOTIFICATION_RELEASED: break; } break; case ID_BUTTON_OK: switch (NCode) { case WM_NOTIFICATION_CLICKED: GUI_EndDialog(pMsg->hWin, 0); break; case WM_NOTIFICATION_RELEASED: break; } break; } break; default: WM_DefaultProc(pMsg); break; } }
WBCompEldLight::~WBCompEldLight() { RemoveLight(); }
CGeometry::~CGeometry() { for(int i=0; i<MAXLIGHTS; i++) { RemoveLight(i); } }
void CreateMenus (void) { { TwBar *bar = TwNewBar ("pentachoron"); TwDefine ("pentachoron label='Pentachoron'"); TwType rendermodeType; TwEnumVal rendermodeEV[] = { { 0, "compose" }, { 1, "color" }, { 2, "normal" }, { 3, "specular" }, { 4, "depth" }, { 5, "glow" }, { 6, "shadow" } }; rendermodeType = TwDefineEnum ("rendermode", rendermodeEV, 7); TwAddVarCB (bar, "FPS", TW_TYPE_UINT32, NULL, [&] (void *v, void*) { *(unsigned int*)v = fps; }, NULL, NULL); TwAddVarCB (bar, "rendermode", rendermodeType, [&] (const void *v, void*) { r->postprocess.SetRenderMode (*(unsigned int*)v); }, [&] (void *v, void*) { *(unsigned int*)v = r->postprocess.GetRenderMode (); }, NULL, NULL); TwAddVarCB (bar, "tile-based light culling", TW_TYPE_BOOLCPP, [&] (const void *v, void*) { r->composition.SetTileBased (*(bool*)v); }, [&] (void *v, void*){ *(bool*)v = r->composition.GetTileBased (); }, NULL, NULL); TwAddVarCB (bar, "wireframe", TW_TYPE_BOOLCPP, [&] (const void *v, void*) { r->gbuffer.SetWireframe (*(bool*)v); }, [&] (void *v, void*) { *(bool*)v = r->gbuffer.GetWireframe (); }, NULL, NULL); TwAddVarCB (bar, "tesslevel", TW_TYPE_UINT32, [&] (const void *v, void*) { r->geometry.SetTessLevel (*(uint32_t*)v); }, [&] (void *v, void*) { *(uint32_t*)v = r->geometry.GetTessLevel (); }, NULL, "label='tessellation level' min=1 max=64"); TwAddVarCB (bar, "displacement", TW_TYPE_FLOAT, [&] (const void *v, void*) { r->geometry.SetDisplacement (*(float*)v); }, [&] (void *v, void*) { *(float*)v = r->geometry.GetDisplacement (); }, NULL, "label='displacement' min=0 step=0.01"); } { TwBar *bar = TwNewBar ("lights"); TwDefine ("lights label='Lights' iconified=true"); TwAddButton (bar, "add light", [&] (void*) { AddLight (); }, NULL, NULL); TwAddButton (bar, "remove", [&] (void*) { RemoveLight (); }, NULL, "label='remove light' visible=false"); TwAddVarRW (bar, "active", TW_TYPE_UINT32, &active_light, "label='active light' visible=false"); TwAddSeparator (bar, NULL, NULL); TwStructMember lightposDesc[] = { { "x", TW_TYPE_FLOAT, offsetof (glm::vec4, x), "step=0.1" }, { "y", TW_TYPE_FLOAT, offsetof (glm::vec4, y), "step=0.1" }, { "z", TW_TYPE_FLOAT, offsetof (glm::vec4, z), "step=0.1" } }; TwStructMember attenuationDesc[] = { { "constant", TW_TYPE_FLOAT, offsetof (glm::vec4, x), "step=0.01" }, { "linear", TW_TYPE_FLOAT, offsetof (glm::vec4, y), "step=0.01" }, { "quadratic", TW_TYPE_FLOAT, offsetof (glm::vec4, z), "step=0.01" }, { "cull distance", TW_TYPE_FLOAT, offsetof (glm::vec4, w), "step=0.1" } }; typedef struct spotparam { float angle; float penumbra_angle; float exponent; } spotparam_t; TwStructMember spotDesc[] = { { "angle", TW_TYPE_FLOAT, offsetof (spotparam_t, angle), "step=1 min=0 max=360" }, { "penumbra angle", TW_TYPE_FLOAT, offsetof (spotparam_t, penumbra_angle), "step=1 min=0 max=360" }, { "exponent", TW_TYPE_FLOAT, offsetof (spotparam_t, exponent), "step=0.1" } }; TwType lightposType = TwDefineStruct ("lightpos", lightposDesc, 3, sizeof (glm::vec4), NULL, NULL); TwType spotdescType = TwDefineStruct ("spotdesc", spotDesc, 3, sizeof (spotparam_t), NULL, NULL); TwType attenuationType = TwDefineStruct ("attenuation", attenuationDesc, 4, sizeof (glm::vec4), NULL, NULL); TwAddVarCB (bar, "position", lightposType, [&] (const void *v, void*) { r->GetLight (active_light).position = *(glm::vec4*)v; r->UpdateLight (active_light); }, [&] (void *v, void*) { *(glm::vec4*)v = r->GetLight (active_light).position; }, NULL, "visible=false"); TwAddVarCB (bar, "direction", TW_TYPE_DIR3F, [&] (const void *v, void*) { r->GetLight (active_light).direction = glm::vec4 (*(const glm::vec3*)v, 0.0f); r->UpdateLight (active_light); }, [&] (void *v, void*) { *(glm::vec3*)v = glm::vec3 (r->GetLight (active_light).direction); }, NULL, "visible=false"); TwAddVarCB (bar, "color", TW_TYPE_COLOR3F, [&] (const void *v, void*) { r->GetLight (active_light).color = glm::vec4 (*(const glm::vec3*)v, 1.0f); r->UpdateLight (active_light); }, [&] (void *v, void*) { *(glm::vec3*)v = glm::vec3 (r->GetLight (active_light).color); }, NULL, "visible=false"); TwAddVarCB (bar, "spot", spotdescType, [&] (const void *v, void*) { Light &light = r->GetLight (active_light); light.spot.exponent = ((spotparam_t*)v)->exponent; light.spot.angle = (((spotparam_t*)v)->angle) * PCH_PI / 180.0f; light.spot.cosine = cosf (light.spot.angle); light.spot.tangent = tanf (light.spot.angle); light.spot.penumbra_angle = ((spotparam_t*)v)->penumbra_angle * PCH_PI / 180.0f; light.spot.penumbra_cosine = cosf (light.spot.penumbra_angle); r->UpdateLight (active_light); }, [&] (void *v, void*){ const Light &light = r->GetLight (active_light); ((spotparam_t*)v)->exponent = light.spot.exponent; ((spotparam_t*)v)->angle = light.spot.angle * 180.0f / PCH_PI; ((spotparam_t*)v)->penumbra_angle = light.spot.penumbra_angle * 180.0f / PCH_PI; }, NULL, "visible=false"); TwAddVarCB (bar, "attenuation", attenuationType, [&] (const void *v, void*) { r->GetLight (active_light).attenuation = *(glm::vec4*)v; r->GetLight (active_light).attenuation.z /= 100.0f; r->UpdateLight (active_light); }, [&] (void *v, void*) { *(glm::vec4*)v = r->GetLight (active_light).attenuation; ((glm::vec4*)v)->z *= 100.0f; }, NULL, "visible=false"); TwAddVarCB (bar, "specular", TW_TYPE_COLOR3F, [&] (const void *v, void*) { r->GetLight (active_light).specular.color = *(const glm::vec3*)v; r->UpdateLight (active_light); }, [&] (void *v, void*) { *(glm::vec3*)v = r->GetLight (active_light).specular.color; }, NULL, "label='specular color' visible=false"); } { TwBar *bar = TwNewBar ("sky"); TwDefine ("sky label='Sky' iconified=true"); typedef struct perezcoefficients { union { struct { float A, B, C, D, E; }; float p[5]; }; } perezcoefficients_t; TwStructMember perezDesc[] = { { "Darkening/Brightening to the horizon", TW_TYPE_FLOAT, offsetof (perezcoefficients_t, A), "step=0.01" }, { "Luminance gradient near the horizon", TW_TYPE_FLOAT, offsetof (perezcoefficients_t, B), "step=0.01" }, { "Relative intensity of circumsolar region", TW_TYPE_FLOAT, offsetof (perezcoefficients_t, C), "step=0.01" }, { "Width of the circumsolar region", TW_TYPE_FLOAT, offsetof (perezcoefficients_t, D), "step=0.01" }, { "Relative backscatered light at the earth surface", TW_TYPE_FLOAT, offsetof (perezcoefficients_t, E), "step=0.01" } }; TwType perezType = TwDefineStruct ("perez", perezDesc, 5, sizeof (perezcoefficients_t), NULL, NULL); TwAddVarCB (bar, "turbidity", TW_TYPE_FLOAT, [&] (const void *v, void*) { r->composition.SetTurbidity (*(const float*)v); }, [&] (void *v, void*) { *(float*)v = r->composition.GetTurbidity (); }, NULL, "step=0.1 min=1.0 max=10.0"); TwAddVarCB (bar, "time", TW_TYPE_FLOAT, [&] (const void *v, void*) { r->composition.SetTimeOfDay (*(const float*)v); }, [&] (void *v, void*) { *(float*)v = r->composition.GetTimeOfDay (); }, NULL, "step=0.01 min=0.0 max=24.0"); TwType monthType; TwEnumVal monthEV[] = { { 0, "January" }, { 1, "February" }, { 2, "March" }, { 3, "April" }, { 4, "May" }, { 5, "June" }, { 6, "July" }, { 7, "August" }, { 8, "September" }, { 9, "October" }, { 10, "November" }, { 11, "December" } }; monthType = TwDefineEnum ("month", monthEV, 12); TwAddVarCB (bar, "month", monthType, [&] (const void *v, void*) { int month, day; ToCalendarDate (r->composition.GetDate (), &month, &day); month = *(const unsigned int*)v; r->composition.SetDate (ToOrdinalDate (month, day)); }, [&] (void *v, void*) { int month, day; ToCalendarDate (r->composition.GetDate (), &month, &day); *(unsigned int*)v = month; }, NULL, NULL); TwAddVarCB (bar, "day", TW_TYPE_UINT8, [&] (const void *v, void*) { int month, day; ToCalendarDate (r->composition.GetDate (), &month, &day); day = *(const unsigned char*)v; r->composition.SetDate (ToOrdinalDate (month, day)); }, [&] (void *v, void*) { int month, day; ToCalendarDate (r->composition.GetDate (), &month, &day); *(unsigned char*)v = day; }, NULL, "min=1 max=31"); TwAddVarCB (bar, "luminosity", TW_TYPE_FLOAT, [&] (const void *v, void*) { r->composition.SetSkyLuminosity (0.01f * *(const float*)v); }, [&] (void *v, void*) { *(float*)v = r->composition.GetSkyLuminosity () * 100.0f; }, NULL, "step=0.01"); TwAddVarCB (bar, "latitude", TW_TYPE_FLOAT, [&] (const void *v, void*) { r->composition.SetLatitude (*(const float*)v); }, [&] (void *v, void*) { *(float*)v = r->composition.GetLatitude (); }, NULL, "step=0.1 min=0.0 max=90.0"); TwAddVarCB (bar, "Y", perezType, [&] (const void *v, void*) { for (auto i = 0; i < 5; i++) r->composition.SetPerezY (i, ((perezcoefficients_t*)v)->p[i]); }, [&] (void *v, void *) { for (auto i = 0; i < 5; i++) ((perezcoefficients_t*)v)->p[i] = r->composition.GetPerezY (i); }, NULL, "label='Coefficients Y'"); TwAddVarCB (bar, "x", perezType, [&] (const void *v, void*) { for (auto i = 0; i < 5; i++) r->composition.SetPerezx (i, ((perezcoefficients_t*)v)->p[i]); }, [&] (void *v, void *) { for (auto i = 0; i < 5; i++) ((perezcoefficients_t*)v)->p[i] = r->composition.GetPerezx (i); }, NULL, "label='Coefficients x'"); TwAddVarCB (bar, "y", perezType, [&] (const void *v, void*) { for (auto i = 0; i < 5; i++) r->composition.SetPerezy (i, ((perezcoefficients_t*)v)->p[i]); }, [&] (void *v, void *) { for (auto i = 0; i < 5; i++) ((perezcoefficients_t*)v)->p[i] = r->composition.GetPerezy (i); }, NULL, "label='Coefficients y'"); } { TwBar *bar = TwNewBar ("tonemapping"); TwDefine ("tonemapping label='Tonemapping' iconified=true"); TwEnumVal tonemappingmodeEV[] = { { 0, "Default" }, { 1, "Reinhard" }, { 2, "Logarithmic" }, { 3, "URQ" }, { 4, "Exponential" }, { 5, "Drago" }, }; TwType tonemappingmodeType; tonemappingmodeType = TwDefineEnum ("tonemappingmode", tonemappingmodeEV, 6); TwAddVarCB (bar, "Mode", tonemappingmodeType, [&] (const void *v, void*) { r->postprocess.SetTonemappingMode (*(const unsigned int*)v); }, [&] (void *v, void*) { *(unsigned int*)v = r->postprocess.GetTonemappingMode (); }, NULL, NULL); TwAddVarCB (bar, "Image Key", TW_TYPE_FLOAT, [&] (const void *v, void*) { r->postprocess.SetImageKey (*(const float*)v); }, [&] (void *v, void*) { *(float*)v = r->postprocess.GetImageKey (); }, NULL, "step=0.001 min=0.001 max=5.0"); TwAddVarCB (bar, "White threshold", TW_TYPE_FLOAT, [&] (const void *v, void*) { r->postprocess.SetWhiteThreshold (*(const float*)v); }, [&] (void *v, void*) { *(float*)v = r->postprocess.GetWhiteThreshold (); }, NULL, "step=0.01 min=0.0 max=5.0"); TwAddVarCB (bar, "Sigma", TW_TYPE_FLOAT, [&] (const void *v, void*) { r->postprocess.SetTonemappingSigma (*(const float*)v); }, [&] (void *v, void*) { *(float*)v = r->postprocess.GetTonemappingSigma (); }, NULL, "step=0.01 min=0.0 max=5.0"); TwAddVarCB (bar, "Exponent", TW_TYPE_FLOAT, [&] (const void *v, void*) { r->postprocess.SetTonemappingExponent (*(const float*)v); }, [&] (void *v, void*) { *(float*)v = r->postprocess.GetTonemappingExponent (); }, NULL, "step=0.01 min=0.0"); TwStructMember avglumDesc[] = { { "constant", TW_TYPE_FLOAT, offsetof (glm::vec4, x), "step=0.01" }, { "linear", TW_TYPE_FLOAT, offsetof (glm::vec4, y), "step=0.01" }, { "delta", TW_TYPE_FLOAT, offsetof (glm::vec4, z), "step=0.01" }, { "lod", TW_TYPE_FLOAT, offsetof (glm::vec4, w), "step=0.1" } }; TwType avglumType = TwDefineStruct ("avglum", avglumDesc, 4, sizeof (glm::vec4), NULL, NULL); TwAddVarCB (bar, "avgLum", avglumType, [&] (const void *v, void*) { r->postprocess.SetAvgLumConst (((const glm::vec4*)v)->x); r->postprocess.SetAvgLumLinear (((const glm::vec4*)v)->y); r->postprocess.SetAvgLumDelta (((const glm::vec4*)v)->z); r->postprocess.SetAvgLumLod (((const glm::vec4*)v)->w); }, [&] (void *v, void*) { ((glm::vec4*)v)->x = r->postprocess.GetAvgLumConst (); ((glm::vec4*)v)->y = r->postprocess.GetAvgLumLinear (); ((glm::vec4*)v)->z = r->postprocess.GetAvgLumDelta (); ((glm::vec4*)v)->w = r->postprocess.GetAvgLumLod (); }, NULL, "label='Average Luminance'"); TwEnumVal rgbworkingspaceEV[] = { { 0, "Adobe RGB (1998)" }, { 1, "AppleRGB" }, { 2, "Best RGB" }, { 3, "Beta RGB" }, { 4, "Bruce RGB" }, { 5, "CIE RGB" }, { 6, "ColorMatch RGB" }, { 7, "Don RGB 4" }, { 8, "ECI RGB" }, { 9, "Ekta Space PS5" }, { 10, "NTSC RGB" }, { 11, "PAL/SECAM RGB" }, { 12, "ProPhoto RGB" }, { 13, "SMPTE-C RGB" }, { 14, "sRGB" }, { 15, "Wide Gamut RGB" } }; TwType rgbworkingspaceType; rgbworkingspaceType = TwDefineEnum ("rgbworkingspace", rgbworkingspaceEV, 16); TwAddVarCB (bar, "RGB Working Space", rgbworkingspaceType, [&] (const void *v, void*) { r->postprocess.SetRGBWorkingSpace (*(const unsigned int*)v); }, [&] (void *v, void*) { *(unsigned int*)v = r->postprocess.GetRGBWorkingSpace (); }, NULL, NULL); } { TwBar *bar = TwNewBar ("antialiasing"); TwDefine ("antialiasing label='Antialiasing' iconified=true"); TwEnumVal samplesEV[] = { { 0, "disabled" }, { 4, "4x" }, { 8, "8x" }, { 12, "12x" }, { 16, "16x" }, }; TwType samplesType; samplesType = TwDefineEnum ("samples", samplesEV, 5); TwAddVarCB (bar, "Mode", samplesType, [&] (const void *v, void*) { r->SetAntialiasing (*(const unsigned int*)v); }, [&] (void *v, void*) { *(unsigned int*)v = r->GetAntialiasing (); }, NULL, NULL); TwAddVarCB (bar, "Threshold", TW_TYPE_FLOAT, [&] (const void *v, void*) { r->postprocess.SetAntialiasingThreshold (0.01f * *(const float*)v); }, [&] (void *v, void*) { *(float*)v = 100.0f * r->postprocess.GetAntialiasingThreshold (); }, NULL, "step=0.1 min=0.0"); } { TwBar *bar = TwNewBar ("glow"); TwDefine ("glow label='Glow' iconified=true"); TwAddVarCB (bar, "blur size", TW_TYPE_UINT32, [&] (const void *v, void*) { r->composition.GetGlow ().SetSize (*(const unsigned int*)v); }, [&] (void *v, void*) { *(unsigned int*)v = r->composition.GetGlow ().GetSize (); }, NULL, "min=0 max=256"); TwAddVarCB (bar, "luminance threshold", TW_TYPE_FLOAT, [&] (const void *v, void*) { r->composition.SetLuminanceThreshold (*(const float*)v); }, [&] (void *v, void*) { *(float*)v = r->composition.GetLuminanceThreshold (); }, NULL, "step=0.01 min=0"); // TODO: NOT YET REIMPLEMENTED! TwAddVarCB (bar, "limit", TW_TYPE_FLOAT, [&] (const void *v, void*) { r->composition.GetGlow ().SetLimit (*(const float*)v); }, [&] (void *v, void*) { *(float*)v = r->composition.GetGlow ().GetLimit (); }, NULL, "step=0.01 min=0 visible=false"); TwAddVarCB (bar, "exponent", TW_TYPE_FLOAT, [&] (const void *v, void*) { r->composition.GetGlow ().SetExponent (*(const float*)v); }, [&] (void *v, void*) { *(float*)v = r->composition.GetGlow ().GetExponent (); }, NULL, "step=0.01 min=0 visible=false"); } { TwBar *bar = TwNewBar ("parameter"); TwDefine ("parameter label='Material Parameters' iconified=true"); { std::vector<TwEnumVal> paramNames; for (auto i = 0; i < r->GetNumParameters (); i++) { paramNames.push_back (TwEnumVal ()); paramNames.back ().Value = i; paramNames.back ().Label = r->GetParameterName (i).c_str (); } TwType paramnameType; paramnameType = TwDefineEnum ("paramname", ¶mNames[0], paramNames.size ()); TwAddVarRW (bar, "active", paramnameType, &active_light, "label='active parameter set'"); } TwAddSeparator (bar, NULL, NULL); TwEnumVal specmodelEV[] = { { 0, "None" }, { 1, "Gaussian" }, { 2, "Phong" }, { 3, "Beckmann" } }; TwType specmodelType; specmodelType = TwDefineEnum ("specmodel", specmodelEV, 4); typedef struct matspec { unsigned int model; float param1; float param2; float fresnel_n; float fresnel_k; } matspec_t; TwStructMember matspecDesc[] = { { "Specular Model", specmodelType, offsetof (matspec_t, model), NULL}, { "Smoothness/Shininess", TW_TYPE_FLOAT, offsetof (matspec_t, param1), "step=0.01" }, { "Gauss Factor/Ignored", TW_TYPE_FLOAT, offsetof (matspec_t, param2), "step=0.01" }, { "Fresnel n", TW_TYPE_FLOAT, offsetof (matspec_t, fresnel_n), "step=0.01" }, { "Fresnel k", TW_TYPE_FLOAT, offsetof (matspec_t, fresnel_k), "step=0.01" } }; TwType matspecType = TwDefineStruct ("matspectype", matspecDesc, 5, sizeof (matspec_t), NULL, NULL); TwAddVarCB (bar, "matspec", matspecType, [&] (const void *v, void*) { Parameter &p = r->GetParameters (active_parameter); const matspec_t *m = (const matspec_t*) v; p.specular.model = m->model; p.specular.param1 = m->param1; p.specular.param2 = m->param2; p.specular.fresnel.n = m->fresnel_n; p.specular.fresnel.k = m->fresnel_k; r->UpdateParameters (active_parameter); }, [&] (void *v, void*) { Parameter &p = r->GetParameters (active_parameter); matspec_t *m = (matspec_t*) v; m->model = p.specular.model; m->param1 = p.specular.param1; m->param2 = p.specular.param2; m->fresnel_n = p.specular.fresnel.n; m->fresnel_k = p.specular.fresnel.k; }, NULL, "label='Specular Parameters'"); typedef struct matrefl { float factor; float fresnel_n; float fresnel_k; } matrefl_t; TwStructMember matreflDesc[] = { { "Factor", TW_TYPE_FLOAT, offsetof (matrefl_t, factor), "step=0.01 min=0.0 max=1.0" }, { "Fresnel n", TW_TYPE_FLOAT, offsetof (matrefl_t, fresnel_n), "step=0.01" }, { "Fresnel k", TW_TYPE_FLOAT, offsetof (matrefl_t, fresnel_k), "step=0.01" } }; TwType matreflType = TwDefineStruct ("matrefltype", matreflDesc, 3, sizeof (matrefl_t), NULL, NULL); TwAddVarCB (bar, "matrefl", matreflType, [&] (const void *v, void*) { Parameter &p = r->GetParameters (active_parameter); const matrefl_t *m = (const matrefl_t*) v; p.reflection.factor = m->factor; p.reflection.fresnel.n = m->fresnel_n; p.reflection.fresnel.k = m->fresnel_k; r->UpdateParameters (active_parameter); }, [&] (void *v, void*) { Parameter &p = r->GetParameters (active_parameter); matrefl_t *m = (matrefl_t*) v; m->factor = p.reflection.factor; m->fresnel_n = p.reflection.fresnel.n; m->fresnel_k = p.reflection.fresnel.k; }, NULL, "label='Reflection'"); } }