Lighting fix (experimental)
- changed fixed light allocation to prioritized per-use basis - minor refactoring in CPlanet and CWaterdev-ui
parent
2fa4d7b0db
commit
80d3a9bff1
|
@ -2810,7 +2810,7 @@ void CEngine::Draw3DScene()
|
||||||
|
|
||||||
if (m_shadowVisible)
|
if (m_shadowVisible)
|
||||||
{
|
{
|
||||||
m_lightMan->UpdateLightsEnableState(ENG_OBJTYPE_TERRAIN);
|
m_lightMan->UpdateDeviceLights(ENG_OBJTYPE_TERRAIN);
|
||||||
|
|
||||||
// Draw the terrain
|
// Draw the terrain
|
||||||
|
|
||||||
|
@ -2910,7 +2910,7 @@ void CEngine::Draw3DScene()
|
||||||
if (! IsVisible(objRank))
|
if (! IsVisible(objRank))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
m_lightMan->UpdateLightsEnableState(m_objects[objRank].type);
|
m_lightMan->UpdateDeviceLights(m_objects[objRank].type);
|
||||||
|
|
||||||
for (int l3 = 0; l3 < static_cast<int>( p2.next.size() ); l3++)
|
for (int l3 = 0; l3 < static_cast<int>( p2.next.size() ); l3++)
|
||||||
{
|
{
|
||||||
|
@ -2999,7 +2999,7 @@ void CEngine::Draw3DScene()
|
||||||
if (! IsVisible(objRank))
|
if (! IsVisible(objRank))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
m_lightMan->UpdateLightsEnableState(m_objects[objRank].type);
|
m_lightMan->UpdateDeviceLights(m_objects[objRank].type);
|
||||||
|
|
||||||
for (int l3 = 0; l3 < static_cast<int>( p2.next.size() ); l3++)
|
for (int l3 = 0; l3 < static_cast<int>( p2.next.size() ); l3++)
|
||||||
{
|
{
|
||||||
|
@ -3041,7 +3041,7 @@ void CEngine::Draw3DScene()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_lightMan->UpdateLightsEnableState(ENG_OBJTYPE_TERRAIN);
|
m_lightMan->UpdateDeviceLights(ENG_OBJTYPE_NULL);
|
||||||
|
|
||||||
if (m_waterMode) m_water->DrawSurf(); // draws water surface
|
if (m_waterMode) m_water->DrawSurf(); // draws water surface
|
||||||
|
|
||||||
|
@ -3117,7 +3117,7 @@ void CEngine::DrawInterface()
|
||||||
if (! IsVisible(objRank))
|
if (! IsVisible(objRank))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
m_lightMan->UpdateLightsEnableState(m_objects[objRank].type);
|
m_lightMan->UpdateDeviceLights(m_objects[objRank].type);
|
||||||
|
|
||||||
for (int l3 = 0; l3 < static_cast<int>( p2.next.size() ); l3++)
|
for (int l3 = 0; l3 < static_cast<int>( p2.next.size() ); l3++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include "graphics/engine/lightman.h"
|
#include "graphics/engine/lightman.h"
|
||||||
|
|
||||||
|
#include "common/logger.h"
|
||||||
#include "common/iman.h"
|
#include "common/iman.h"
|
||||||
|
|
||||||
#include "graphics/core/device.h"
|
#include "graphics/core/device.h"
|
||||||
|
@ -28,6 +29,7 @@
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
|
|
||||||
|
// Graphics module namespace
|
||||||
namespace Gfx {
|
namespace Gfx {
|
||||||
|
|
||||||
|
|
||||||
|
@ -70,6 +72,7 @@ void LightProgression::SetTarget(float value)
|
||||||
DynamicLight::DynamicLight()
|
DynamicLight::DynamicLight()
|
||||||
{
|
{
|
||||||
used = enabled = false;
|
used = enabled = false;
|
||||||
|
priority = LIGHT_PRI_LOW;
|
||||||
includeType = excludeType = ENG_OBJTYPE_NULL;
|
includeType = excludeType = ENG_OBJTYPE_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,7 +83,7 @@ CLightManager::CLightManager(CInstanceManager* iMan, CEngine* engine)
|
||||||
m_iMan = iMan;
|
m_iMan = iMan;
|
||||||
m_iMan->AddInstance(CLASS_LIGHT, this);
|
m_iMan->AddInstance(CLASS_LIGHT, this);
|
||||||
|
|
||||||
m_device = NULL;
|
m_device = nullptr;
|
||||||
m_engine = engine;
|
m_engine = engine;
|
||||||
|
|
||||||
m_time = 0.0f;
|
m_time = 0.0f;
|
||||||
|
@ -90,56 +93,54 @@ CLightManager::~CLightManager()
|
||||||
{
|
{
|
||||||
m_iMan->DeleteInstance(CLASS_LIGHT, this);
|
m_iMan->DeleteInstance(CLASS_LIGHT, this);
|
||||||
|
|
||||||
m_iMan = NULL;
|
m_iMan = nullptr;
|
||||||
m_device = NULL;
|
m_device = nullptr;
|
||||||
m_engine = NULL;
|
m_engine = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CLightManager::SetDevice(CDevice* device)
|
void CLightManager::SetDevice(CDevice* device)
|
||||||
{
|
{
|
||||||
m_device = device;
|
m_device = device;
|
||||||
|
m_lightMap = std::vector<int>(m_device->GetMaxLightCount(), -1);
|
||||||
m_dynLights = std::vector<DynamicLight>(m_device->GetMaxLightCount(), DynamicLight());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CLightManager::FlushLights()
|
void CLightManager::FlushLights()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < static_cast<int>( m_dynLights.size() ); i++)
|
m_dynLights.clear();
|
||||||
{
|
|
||||||
m_dynLights[i].used = false;
|
|
||||||
m_device->SetLightEnabled(i, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the index of light created or -1 if all lights are used. */
|
/** Returns the index of light created. */
|
||||||
int CLightManager::CreateLight()
|
int CLightManager::CreateLight(LightPriority priority)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < static_cast<int>( m_dynLights.size() ); i++)
|
int index = 0;
|
||||||
|
for (; index < static_cast<int>( m_dynLights.size() ); index++)
|
||||||
{
|
{
|
||||||
if (m_dynLights[i].used) continue;
|
if (! m_dynLights[index].used)
|
||||||
|
break;
|
||||||
m_dynLights[i] = DynamicLight();
|
|
||||||
|
|
||||||
m_dynLights[i].used = true;
|
|
||||||
m_dynLights[i].enabled = true;
|
|
||||||
|
|
||||||
m_dynLights[i].includeType = ENG_OBJTYPE_NULL;
|
|
||||||
m_dynLights[i].excludeType = ENG_OBJTYPE_NULL;
|
|
||||||
|
|
||||||
m_dynLights[i].light.type = LIGHT_DIRECTIONAL;
|
|
||||||
m_dynLights[i].light.diffuse = Color(0.5f, 0.5f, 0.5f);
|
|
||||||
m_dynLights[i].light.position = Math::Vector(-100.0f, 100.0f, -100.0f);
|
|
||||||
m_dynLights[i].light.direction = Math::Vector( 1.0f, -1.0f, 1.0f);
|
|
||||||
|
|
||||||
m_dynLights[i].intensity.Init(1.0f); // maximum
|
|
||||||
m_dynLights[i].colorRed.Init(0.5f);
|
|
||||||
m_dynLights[i].colorGreen.Init(0.5f);
|
|
||||||
m_dynLights[i].colorBlue.Init(0.5f); // gray
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
if (index == static_cast<int>(m_dynLights.size()))
|
||||||
|
m_dynLights.push_back(DynamicLight());
|
||||||
|
|
||||||
|
m_dynLights[index] = DynamicLight();
|
||||||
|
m_dynLights[index].used = true;
|
||||||
|
m_dynLights[index].enabled = true;
|
||||||
|
m_dynLights[index].priority = priority;
|
||||||
|
|
||||||
|
m_dynLights[index].includeType = ENG_OBJTYPE_NULL;
|
||||||
|
m_dynLights[index].excludeType = ENG_OBJTYPE_NULL;
|
||||||
|
|
||||||
|
m_dynLights[index].light.type = LIGHT_DIRECTIONAL;
|
||||||
|
m_dynLights[index].light.diffuse = Color(0.5f, 0.5f, 0.5f);
|
||||||
|
m_dynLights[index].light.position = Math::Vector(-100.0f, 100.0f, -100.0f);
|
||||||
|
m_dynLights[index].light.direction = Math::Vector( 1.0f, -1.0f, 1.0f);
|
||||||
|
|
||||||
|
m_dynLights[index].intensity.Init(1.0f); // maximum
|
||||||
|
m_dynLights[index].colorRed.Init(0.5f);
|
||||||
|
m_dynLights[index].colorGreen.Init(0.5f);
|
||||||
|
m_dynLights[index].colorBlue.Init(0.5f); // gray
|
||||||
|
|
||||||
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CLightManager::DeleteLight(int lightRank)
|
bool CLightManager::DeleteLight(int lightRank)
|
||||||
|
@ -148,8 +149,6 @@ bool CLightManager::DeleteLight(int lightRank)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
m_dynLights[lightRank].used = false;
|
m_dynLights[lightRank].used = false;
|
||||||
m_device->SetLightEnabled(lightRank, false);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,7 +356,6 @@ void CLightManager::UpdateProgression(float rTime)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CLightManager::UpdateLights()
|
void CLightManager::UpdateLights()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < static_cast<int>( m_dynLights.size() ); i++)
|
for (int i = 0; i < static_cast<int>( m_dynLights.size() ); i++)
|
||||||
|
@ -366,6 +364,7 @@ void CLightManager::UpdateLights()
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bool enabled = m_dynLights[i].enabled;
|
bool enabled = m_dynLights[i].enabled;
|
||||||
|
|
||||||
if (m_dynLights[i].intensity.current == 0.0f)
|
if (m_dynLights[i].intensity.current == 0.0f)
|
||||||
enabled = false;
|
enabled = false;
|
||||||
|
|
||||||
|
@ -379,23 +378,22 @@ void CLightManager::UpdateLights()
|
||||||
|
|
||||||
value = m_dynLights[i].colorBlue.current * m_dynLights[i].intensity.current;
|
value = m_dynLights[i].colorBlue.current * m_dynLights[i].intensity.current;
|
||||||
m_dynLights[i].light.diffuse.b = value;
|
m_dynLights[i].light.diffuse.b = value;
|
||||||
|
|
||||||
m_device->SetLight(i, m_dynLights[i].light);
|
|
||||||
m_device->SetLightEnabled(i, enabled);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_dynLights[i].light.diffuse.r = 0.0f;
|
m_dynLights[i].light.diffuse.r = 0.0f;
|
||||||
m_dynLights[i].light.diffuse.g = 0.0f;
|
m_dynLights[i].light.diffuse.g = 0.0f;
|
||||||
m_dynLights[i].light.diffuse.b = 0.0f;
|
m_dynLights[i].light.diffuse.b = 0.0f;
|
||||||
|
|
||||||
m_device->SetLightEnabled(i, enabled);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CLightManager::UpdateLightsEnableState(EngineObjectType type)
|
void CLightManager::UpdateDeviceLights(EngineObjectType type)
|
||||||
{
|
{
|
||||||
|
for (int i = 0; i < static_cast<int>( m_lightMap.size() ); ++i)
|
||||||
|
m_lightMap[i] = -1;
|
||||||
|
|
||||||
|
// High priority
|
||||||
for (int i = 0; i < static_cast<int>( m_dynLights.size() ); i++)
|
for (int i = 0; i < static_cast<int>( m_dynLights.size() ); i++)
|
||||||
{
|
{
|
||||||
if (! m_dynLights[i].used)
|
if (! m_dynLights[i].used)
|
||||||
|
@ -404,17 +402,75 @@ void CLightManager::UpdateLightsEnableState(EngineObjectType type)
|
||||||
continue;
|
continue;
|
||||||
if (m_dynLights[i].intensity.current == 0.0f)
|
if (m_dynLights[i].intensity.current == 0.0f)
|
||||||
continue;
|
continue;
|
||||||
|
if (m_dynLights[i].priority == LIGHT_PRI_LOW)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
bool enabled = true;
|
||||||
if (m_dynLights[i].includeType != ENG_OBJTYPE_NULL)
|
if (m_dynLights[i].includeType != ENG_OBJTYPE_NULL)
|
||||||
{
|
enabled = (m_dynLights[i].includeType == type);
|
||||||
bool enabled = (m_dynLights[i].includeType == type);
|
|
||||||
m_device->SetLightEnabled(i, enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_dynLights[i].excludeType != ENG_OBJTYPE_NULL)
|
if (m_dynLights[i].excludeType != ENG_OBJTYPE_NULL)
|
||||||
|
enabled = (m_dynLights[i].excludeType != type);
|
||||||
|
|
||||||
|
if (enabled)
|
||||||
{
|
{
|
||||||
bool enabled = (m_dynLights[i].excludeType != type);
|
for (int j = 0; j < static_cast<int>( m_lightMap.size() ); ++j)
|
||||||
m_device->SetLightEnabled(i, enabled);
|
{
|
||||||
|
if (m_lightMap[j] == -1)
|
||||||
|
{
|
||||||
|
m_lightMap[j] = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Low priority
|
||||||
|
for (int i = 0; i < static_cast<int>( m_dynLights.size() ); i++)
|
||||||
|
{
|
||||||
|
if (! m_dynLights[i].used)
|
||||||
|
continue;
|
||||||
|
if (! m_dynLights[i].enabled)
|
||||||
|
continue;
|
||||||
|
if (m_dynLights[i].intensity.current == 0.0f)
|
||||||
|
continue;
|
||||||
|
if (m_dynLights[i].priority == LIGHT_PRI_HIGH)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
bool enabled = true;
|
||||||
|
if (m_dynLights[i].includeType != ENG_OBJTYPE_NULL)
|
||||||
|
enabled = (m_dynLights[i].includeType == type);
|
||||||
|
|
||||||
|
if (m_dynLights[i].excludeType != ENG_OBJTYPE_NULL)
|
||||||
|
enabled = (m_dynLights[i].excludeType != type);
|
||||||
|
|
||||||
|
if (enabled)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < static_cast<int>( m_lightMap.size() ); ++j)
|
||||||
|
{
|
||||||
|
if (m_lightMap[j] == -1)
|
||||||
|
{
|
||||||
|
m_lightMap[j] = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GetLogger()->Trace("Light allotment:\n");
|
||||||
|
|
||||||
|
for (int i = 0; i < static_cast<int>( m_lightMap.size() ); ++i)
|
||||||
|
{
|
||||||
|
int rank = m_lightMap[i];
|
||||||
|
GetLogger()->Trace("[%d] -> %d\n", i, rank);
|
||||||
|
if (rank != -1)
|
||||||
|
{
|
||||||
|
m_device->SetLight(i, m_dynLights[rank].light);
|
||||||
|
m_device->SetLightEnabled(i, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_device->SetLightEnabled(i, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,6 +64,16 @@ struct LightProgression
|
||||||
void SetTarget(float value);
|
void SetTarget(float value);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \enum LightPriority
|
||||||
|
* \brief Priority in light assignment
|
||||||
|
*/
|
||||||
|
enum LightPriority
|
||||||
|
{
|
||||||
|
LIGHT_PRI_HIGH,
|
||||||
|
LIGHT_PRI_LOW
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\struct DynamicLight
|
\struct DynamicLight
|
||||||
\brief Dynamic light in 3D scene
|
\brief Dynamic light in 3D scene
|
||||||
|
@ -77,6 +87,9 @@ struct DynamicLight
|
||||||
//! Whether the light is turned on
|
//! Whether the light is turned on
|
||||||
bool enabled;
|
bool enabled;
|
||||||
|
|
||||||
|
//! Priority in assignment
|
||||||
|
LightPriority priority;
|
||||||
|
|
||||||
//! Configuration of the light
|
//! Configuration of the light
|
||||||
Light light;
|
Light light;
|
||||||
|
|
||||||
|
@ -123,7 +136,7 @@ public:
|
||||||
//! Clears and disables all lights
|
//! Clears and disables all lights
|
||||||
void FlushLights();
|
void FlushLights();
|
||||||
//! Creates a new dynamic light and returns its index (lightRank)
|
//! Creates a new dynamic light and returns its index (lightRank)
|
||||||
int CreateLight();
|
int CreateLight(LightPriority priority = LIGHT_PRI_LOW);
|
||||||
//! Deletes and disables the given dynamic light
|
//! Deletes and disables the given dynamic light
|
||||||
bool DeleteLight(int lightRank);
|
bool DeleteLight(int lightRank);
|
||||||
//! Sets the light parameters for dynamic light
|
//! Sets the light parameters for dynamic light
|
||||||
|
@ -161,7 +174,7 @@ public:
|
||||||
//! Sets the destination color for dynamic light's color progression
|
//! Sets the destination color for dynamic light's color progression
|
||||||
bool SetLightColor(int lightRank, const Color &color);
|
bool SetLightColor(int lightRank, const Color &color);
|
||||||
//! Returns current light color
|
//! Returns current light color
|
||||||
Color GetLightColor(int lightRank);
|
Color GetLightColor(int lightRank);
|
||||||
//! Sets the rate of change for dynamic light colors (RGB)
|
//! Sets the rate of change for dynamic light colors (RGB)
|
||||||
bool SetLightColorSpeed(int lightRank, float speed);
|
bool SetLightColorSpeed(int lightRank, float speed);
|
||||||
|
|
||||||
|
@ -170,7 +183,7 @@ public:
|
||||||
//! Updates (recalculates) all dynamic lights
|
//! Updates (recalculates) all dynamic lights
|
||||||
void UpdateLights();
|
void UpdateLights();
|
||||||
//! Enables or disables dynamic lights affecting the given object type
|
//! Enables or disables dynamic lights affecting the given object type
|
||||||
void UpdateLightsEnableState(EngineObjectType type);
|
void UpdateDeviceLights(EngineObjectType type);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CInstanceManager* m_iMan;
|
CInstanceManager* m_iMan;
|
||||||
|
@ -181,6 +194,8 @@ protected:
|
||||||
float m_time;
|
float m_time;
|
||||||
//! List of dynamic lights
|
//! List of dynamic lights
|
||||||
std::vector<DynamicLight> m_dynLights;
|
std::vector<DynamicLight> m_dynLights;
|
||||||
|
//! Map of current light allotment: graphics light -> dynamic light
|
||||||
|
std::vector<int> m_lightMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
}; // namespace Gfx
|
}; // namespace Gfx
|
||||||
|
|
|
@ -147,7 +147,8 @@ void CPlanet::Draw()
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlanet::Create(int mode, Math::Point start, float dim, float speed,
|
void CPlanet::Create(int mode, Math::Point start, float dim, float speed,
|
||||||
float dir, const std::string& name, Math::Point uv1, Math::Point uv2)
|
float dir, const std::string& name, Math::Point uv1, Math::Point uv2,
|
||||||
|
bool transparent)
|
||||||
{
|
{
|
||||||
if (mode < 0) mode = 0;
|
if (mode < 0) mode = 0;
|
||||||
if (mode > 1) mode = 1;
|
if (mode > 1) mode = 1;
|
||||||
|
@ -164,7 +165,7 @@ void CPlanet::Create(int mode, Math::Point start, float dim, float speed,
|
||||||
planet.uv1 = uv1;
|
planet.uv1 = uv1;
|
||||||
planet.uv2 = uv2;
|
planet.uv2 = uv2;
|
||||||
|
|
||||||
planet.transparent = planet.name.find("planet") != std::string::npos;
|
planet.transparent = transparent;
|
||||||
|
|
||||||
m_planet[mode].push_back(planet);
|
m_planet[mode].push_back(planet);
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,8 @@ public:
|
||||||
bool EventProcess(const Event &event);
|
bool EventProcess(const Event &event);
|
||||||
//! Creates a new planet
|
//! Creates a new planet
|
||||||
void Create(int mode, Math::Point start, float dim, float speed, float dir,
|
void Create(int mode, Math::Point start, float dim, float speed, float dir,
|
||||||
const std::string& name, Math::Point uv1, Math::Point uv2);
|
const std::string& name, Math::Point uv1, Math::Point uv2,
|
||||||
|
bool transparent);
|
||||||
//! Indicates if there is at least one planet
|
//! Indicates if there is at least one planet
|
||||||
bool PlanetExist();
|
bool PlanetExist();
|
||||||
//! Load all the textures for the planets
|
//! Load all the textures for the planets
|
||||||
|
|
|
@ -279,11 +279,9 @@ void CWater::DrawBack()
|
||||||
material.ambient = m_ambient;
|
material.ambient = m_ambient;
|
||||||
m_engine->SetMaterial(material);
|
m_engine->SetMaterial(material);
|
||||||
|
|
||||||
m_engine->SetTexture("", 0); // TODO: disable texturing
|
|
||||||
|
|
||||||
CDevice* device = m_engine->GetDevice();
|
CDevice* device = m_engine->GetDevice();
|
||||||
|
|
||||||
m_engine->SetState(ENG_RSTATE_NORMAL);
|
m_engine->SetState(Gfx::ENG_RSTATE_OPAQUE_COLOR);
|
||||||
|
|
||||||
float deep = m_engine->GetDeepView(0);
|
float deep = m_engine->GetDeepView(0);
|
||||||
m_engine->SetDeepView(deep*2.0f, 0);
|
m_engine->SetDeepView(deep*2.0f, 0);
|
||||||
|
@ -310,17 +308,14 @@ void CWater::DrawBack()
|
||||||
p1.y = -50.0f;
|
p1.y = -50.0f;
|
||||||
p2.y = m_level;
|
p2.y = m_level;
|
||||||
|
|
||||||
Math::Vector n;
|
Gfx::Color white = Gfx::Color(1.0f, 1.0f, 1.0f, 0.0f);
|
||||||
n.x = (lookat.x-eye.x)/dist;
|
|
||||||
n.z = (lookat.z-eye.z)/dist;
|
|
||||||
n.y = 0.0f;
|
|
||||||
|
|
||||||
Vertex vertices[4] =
|
VertexCol vertices[4] =
|
||||||
{
|
{
|
||||||
Vertex(Math::Vector(p1.x, p2.y, p1.z), n),
|
VertexCol(Math::Vector(p1.x, p2.y, p1.z), white),
|
||||||
Vertex(Math::Vector(p1.x, p1.y, p1.z), n),
|
VertexCol(Math::Vector(p1.x, p1.y, p1.z), white),
|
||||||
Vertex(Math::Vector(p2.x, p2.y, p2.z), n),
|
VertexCol(Math::Vector(p2.x, p2.y, p2.z), white),
|
||||||
Vertex(Math::Vector(p2.x, p1.y, p2.z), n)
|
VertexCol(Math::Vector(p2.x, p1.y, p2.z), white)
|
||||||
};
|
};
|
||||||
|
|
||||||
device->DrawPrimitive(PRIMITIVE_TRIANGLE_STRIP, vertices, 4);
|
device->DrawPrimitive(PRIMITIVE_TRIANGLE_STRIP, vertices, 4);
|
||||||
|
@ -480,8 +475,8 @@ void CWater::CreateLine(int x, int y, int len)
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWater::Create(WaterType type1, WaterType type2, const std::string& fileName,
|
void CWater::Create(WaterType type1, WaterType type2, const std::string& fileName,
|
||||||
Color diffuse, Color ambient,
|
Color diffuse, Color ambient,
|
||||||
float level, float glint, Math::Vector eddy)
|
float level, float glint, Math::Vector eddy)
|
||||||
{
|
{
|
||||||
m_type[0] = type1;
|
m_type[0] = type1;
|
||||||
m_type[1] = type2;
|
m_type[1] = type2;
|
||||||
|
|
|
@ -169,10 +169,10 @@ protected:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CInstanceManager* m_iMan;
|
CInstanceManager* m_iMan;
|
||||||
CEngine* m_engine;
|
CEngine* m_engine;
|
||||||
CDevice* m_device;
|
CDevice* m_device;
|
||||||
CTerrain* m_terrain;
|
CTerrain* m_terrain;
|
||||||
CParticle* m_particule;
|
CParticle* m_particule;
|
||||||
CSoundInterface* m_sound;
|
CSoundInterface* m_sound;
|
||||||
|
|
||||||
WaterType m_type[2];
|
WaterType m_type[2];
|
||||||
|
@ -184,9 +184,9 @@ protected:
|
||||||
//! Amplitude of swirls
|
//! Amplitude of swirls
|
||||||
Math::Vector m_eddy;
|
Math::Vector m_eddy;
|
||||||
//! Diffuse color
|
//! Diffuse color
|
||||||
Color m_diffuse;
|
Color m_diffuse;
|
||||||
//! Ambient color
|
//! Ambient color
|
||||||
Color m_ambient;
|
Color m_ambient;
|
||||||
float m_time;
|
float m_time;
|
||||||
float m_lastLava;
|
float m_lastLava;
|
||||||
int m_subdiv;
|
int m_subdiv;
|
||||||
|
@ -201,7 +201,7 @@ protected:
|
||||||
|
|
||||||
bool m_draw;
|
bool m_draw;
|
||||||
bool m_lava;
|
bool m_lava;
|
||||||
Color m_color;
|
Color m_color;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -117,9 +117,6 @@ bool CGLDevice::Create()
|
||||||
// So turn it on permanently
|
// So turn it on permanently
|
||||||
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
|
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
|
||||||
|
|
||||||
// To use separate specular color in drawing primitives
|
|
||||||
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
|
|
||||||
|
|
||||||
// To avoid problems with scaling & lighting
|
// To avoid problems with scaling & lighting
|
||||||
glEnable(GL_RESCALE_NORMAL);
|
glEnable(GL_RESCALE_NORMAL);
|
||||||
|
|
||||||
|
@ -136,13 +133,13 @@ bool CGLDevice::Create()
|
||||||
glGetIntegerv(GL_MAX_LIGHTS, &numLights);
|
glGetIntegerv(GL_MAX_LIGHTS, &numLights);
|
||||||
|
|
||||||
m_lights = std::vector<Light>(numLights, Light());
|
m_lights = std::vector<Light>(numLights, Light());
|
||||||
m_lightsEnabled = std::vector<bool> (numLights, false);
|
m_lightsEnabled = std::vector<bool> (numLights, false);
|
||||||
|
|
||||||
int maxTextures = 0;
|
int maxTextures = 0;
|
||||||
glGetIntegerv(GL_MAX_TEXTURE_UNITS, &maxTextures);
|
glGetIntegerv(GL_MAX_TEXTURE_UNITS, &maxTextures);
|
||||||
|
|
||||||
m_currentTextures = std::vector<Texture> (maxTextures, Texture());
|
m_currentTextures = std::vector<Texture> (maxTextures, Texture());
|
||||||
m_texturesEnabled = std::vector<bool> (maxTextures, false);
|
m_texturesEnabled = std::vector<bool> (maxTextures, false);
|
||||||
m_textureStageParams = std::vector<TextureStageParams>(maxTextures, TextureStageParams());
|
m_textureStageParams = std::vector<TextureStageParams>(maxTextures, TextureStageParams());
|
||||||
|
|
||||||
GetLogger()->Info("CDevice created successfully\n");
|
GetLogger()->Info("CDevice created successfully\n");
|
||||||
|
@ -310,8 +307,9 @@ void CGLDevice::SetLight(int index, const Light &light)
|
||||||
|
|
||||||
if (light.type == LIGHT_SPOT)
|
if (light.type == LIGHT_SPOT)
|
||||||
{
|
{
|
||||||
glLightf(GL_LIGHT0 + index, GL_SPOT_CUTOFF, light.spotAngle);
|
// TODO: fix spotlight problems
|
||||||
glLightf(GL_LIGHT0 + index, GL_SPOT_EXPONENT, light.spotIntensity);
|
//glLightf(GL_LIGHT0 + index, GL_SPOT_CUTOFF, light.spotAngle);
|
||||||
|
//glLightf(GL_LIGHT0 + index, GL_SPOT_EXPONENT, light.spotIntensity);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -326,10 +324,8 @@ void CGLDevice::UpdateLightPosition(int index)
|
||||||
assert(index >= 0);
|
assert(index >= 0);
|
||||||
assert(index < static_cast<int>( m_lights.size() ));
|
assert(index < static_cast<int>( m_lights.size() ));
|
||||||
|
|
||||||
if ((! m_lighting) || (! m_lightsEnabled[index]))
|
|
||||||
return;
|
|
||||||
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
|
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
|
|
@ -3908,7 +3908,9 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
|
||||||
OpFloat(line, "dir", 0.0f),
|
OpFloat(line, "dir", 0.0f),
|
||||||
name,
|
name,
|
||||||
Math::Point(uv1.x, uv1.z),
|
Math::Point(uv1.x, uv1.z),
|
||||||
Math::Point(uv2.x, uv2.z));
|
Math::Point(uv2.x, uv2.z),
|
||||||
|
strstr(name, "planet") != nullptr // TODO: add transparent op or modify textures
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Cmd(line, "FrontsizeName") && !resetObject)
|
if (Cmd(line, "FrontsizeName") && !resetObject)
|
||||||
|
@ -4843,7 +4845,7 @@ int CRobotMain::CreateLight(Math::Vector direction, Gfx::Color color)
|
||||||
light.type = Gfx::LIGHT_DIRECTIONAL;
|
light.type = Gfx::LIGHT_DIRECTIONAL;
|
||||||
light.diffuse = color;
|
light.diffuse = color;
|
||||||
light.direction = direction;
|
light.direction = direction;
|
||||||
int obj = m_lightMan->CreateLight();
|
int obj = m_lightMan->CreateLight(Gfx::LIGHT_PRI_HIGH);
|
||||||
m_lightMan->SetLight(obj, light);
|
m_lightMan->SetLight(obj, light);
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
|
@ -4866,7 +4868,7 @@ int CRobotMain::CreateSpot(Math::Vector pos, Gfx::Color color)
|
||||||
light.attenuation0 = 2.0f;
|
light.attenuation0 = 2.0f;
|
||||||
light.attenuation1 = 0.0f;
|
light.attenuation1 = 0.0f;
|
||||||
light.attenuation2 = 0.0f;
|
light.attenuation2 = 0.0f;
|
||||||
int obj = m_lightMan->CreateLight();
|
int obj = m_lightMan->CreateLight(Gfx::LIGHT_PRI_HIGH);
|
||||||
m_lightMan->SetLight(obj, light);
|
m_lightMan->SetLight(obj, light);
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
|
|
Loading…
Reference in New Issue