Save ambient heat temperature and add it to options
This commit is contained in:
parent
7cfc5aa9f6
commit
ffe730c615
@ -26,6 +26,7 @@ GameSave::GameSave(GameSave & save):
|
|||||||
paused(save.paused),
|
paused(save.paused),
|
||||||
gravityMode(save.gravityMode),
|
gravityMode(save.gravityMode),
|
||||||
airMode(save.airMode),
|
airMode(save.airMode),
|
||||||
|
ambientAirTemp(save.ambientAirTemp),
|
||||||
edgeMode(save.edgeMode),
|
edgeMode(save.edgeMode),
|
||||||
signs(save.signs),
|
signs(save.signs),
|
||||||
stkm(save.stkm),
|
stkm(save.stkm),
|
||||||
@ -173,6 +174,7 @@ void GameSave::InitVars()
|
|||||||
paused = false;
|
paused = false;
|
||||||
gravityMode = 0;
|
gravityMode = 0;
|
||||||
airMode = 0;
|
airMode = 0;
|
||||||
|
ambientAirTemp = R_TEMP + 273.15f;
|
||||||
edgeMode = 0;
|
edgeMode = 0;
|
||||||
translated.x = translated.y = 0;
|
translated.x = translated.y = 0;
|
||||||
pmapbits = 8; // default to 8 bits for older saves
|
pmapbits = 8; // default to 8 bits for older saves
|
||||||
@ -571,6 +573,21 @@ void GameSave::CheckBsonFieldInt(bson_iterator iter, const char *field, int *set
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GameSave::CheckBsonFieldFloat(bson_iterator iter, const char *field, float *setting)
|
||||||
|
{
|
||||||
|
if (!strcmp(bson_iterator_key(&iter), field))
|
||||||
|
{
|
||||||
|
if (bson_iterator_type(&iter) == BSON_DOUBLE)
|
||||||
|
{
|
||||||
|
*setting = float(bson_iterator_int(&iter));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Wrong type for %s\n", bson_iterator_key(&iter));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GameSave::readOPS(char * data, int dataLength)
|
void GameSave::readOPS(char * data, int dataLength)
|
||||||
{
|
{
|
||||||
unsigned char *inputData = (unsigned char*)data, *bsonData = NULL, *partsData = NULL, *partsPosData = NULL, *fanData = NULL, *wallData = NULL, *soapLinkData = NULL;
|
unsigned char *inputData = (unsigned char*)data, *bsonData = NULL, *partsData = NULL, *partsPosData = NULL, *fanData = NULL, *wallData = NULL, *soapLinkData = NULL;
|
||||||
@ -668,6 +685,7 @@ void GameSave::readOPS(char * data, int dataLength)
|
|||||||
CheckBsonFieldBool(iter, "paused", &paused);
|
CheckBsonFieldBool(iter, "paused", &paused);
|
||||||
CheckBsonFieldInt(iter, "gravityMode", &gravityMode);
|
CheckBsonFieldInt(iter, "gravityMode", &gravityMode);
|
||||||
CheckBsonFieldInt(iter, "airMode", &airMode);
|
CheckBsonFieldInt(iter, "airMode", &airMode);
|
||||||
|
CheckBsonFieldFloat(iter, "ambientAirTemp", &ambientAirTemp);
|
||||||
CheckBsonFieldInt(iter, "edgeMode", &edgeMode);
|
CheckBsonFieldInt(iter, "edgeMode", &edgeMode);
|
||||||
CheckBsonFieldInt(iter, "pmapbits", &pmapbits);
|
CheckBsonFieldInt(iter, "pmapbits", &pmapbits);
|
||||||
if (!strcmp(bson_iterator_key(&iter), "signs"))
|
if (!strcmp(bson_iterator_key(&iter), "signs"))
|
||||||
@ -2550,6 +2568,7 @@ char * GameSave::serialiseOPS(unsigned int & dataLength)
|
|||||||
bson_append_bool(&b, "paused", paused);
|
bson_append_bool(&b, "paused", paused);
|
||||||
bson_append_int(&b, "gravityMode", gravityMode);
|
bson_append_int(&b, "gravityMode", gravityMode);
|
||||||
bson_append_int(&b, "airMode", airMode);
|
bson_append_int(&b, "airMode", airMode);
|
||||||
|
bson_append_double(&b, "ambientAirTemp", double(ambientAirTemp));
|
||||||
bson_append_int(&b, "edgeMode", edgeMode);
|
bson_append_int(&b, "edgeMode", edgeMode);
|
||||||
|
|
||||||
if (stkm.hasData())
|
if (stkm.hasData())
|
||||||
|
@ -96,6 +96,7 @@ public:
|
|||||||
bool paused;
|
bool paused;
|
||||||
int gravityMode;
|
int gravityMode;
|
||||||
int airMode;
|
int airMode;
|
||||||
|
float ambientAirTemp;
|
||||||
int edgeMode;
|
int edgeMode;
|
||||||
|
|
||||||
//Signs
|
//Signs
|
||||||
@ -149,6 +150,7 @@ private:
|
|||||||
void CheckBsonFieldUser(bson_iterator iter, const char *field, unsigned char **data, unsigned int *fieldLen);
|
void CheckBsonFieldUser(bson_iterator iter, const char *field, unsigned char **data, unsigned int *fieldLen);
|
||||||
void CheckBsonFieldBool(bson_iterator iter, const char *field, bool *flag);
|
void CheckBsonFieldBool(bson_iterator iter, const char *field, bool *flag);
|
||||||
void CheckBsonFieldInt(bson_iterator iter, const char *field, int *setting);
|
void CheckBsonFieldInt(bson_iterator iter, const char *field, int *setting);
|
||||||
|
void CheckBsonFieldFloat(bson_iterator iter, const char *field, float *setting);
|
||||||
template <typename T> T ** Allocate2DArray(int blockWidth, int blockHeight, T defaultVal);
|
template <typename T> T ** Allocate2DArray(int blockWidth, int blockHeight, T defaultVal);
|
||||||
template <typename T> void Deallocate2DArray(T ***array, int blockHeight);
|
template <typename T> void Deallocate2DArray(T ***array, int blockHeight);
|
||||||
void dealloc();
|
void dealloc();
|
||||||
|
@ -2368,6 +2368,14 @@ void Renderer::draw_grav()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int HeatToColour(float temp)
|
||||||
|
{
|
||||||
|
constexpr float min_temp = MIN_TEMP;
|
||||||
|
constexpr float max_temp = MAX_TEMP;
|
||||||
|
int caddress = int(restrict_flt((temp - min_temp) / (max_temp - min_temp) * 1024, 0, 1023)) * 3;
|
||||||
|
return PIXRGB((int)(color_data[caddress]*0.7f), (int)(color_data[caddress+1]*0.7f), (int)(color_data[caddress+2]*0.7f));
|
||||||
|
}
|
||||||
|
|
||||||
void Renderer::draw_air()
|
void Renderer::draw_air()
|
||||||
{
|
{
|
||||||
if(!sim->aheat_enable && (display_mode & DISPLAY_AIRH))
|
if(!sim->aheat_enable && (display_mode & DISPLAY_AIRH))
|
||||||
@ -2399,10 +2407,7 @@ void Renderer::draw_air()
|
|||||||
}
|
}
|
||||||
else if (display_mode & DISPLAY_AIRH)
|
else if (display_mode & DISPLAY_AIRH)
|
||||||
{
|
{
|
||||||
constexpr float min_temp = MIN_TEMP;
|
c = HeatToColour(hv[y][x]);
|
||||||
constexpr float max_temp = MAX_TEMP;
|
|
||||||
int caddress = int(restrict_flt((hv[y][x] - min_temp) / (max_temp - min_temp) * 1024, 0, 1023)) * 3;
|
|
||||||
c = PIXRGB((int)(color_data[caddress]*0.7f), (int)(color_data[caddress+1]*0.7f), (int)(color_data[caddress+2]*0.7f));
|
|
||||||
//c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f),//vx adds red
|
//c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f),//vx adds red
|
||||||
// clamp_flt(hv[y][x], 0.0f, 1600.0f),//heat adds green
|
// clamp_flt(hv[y][x], 0.0f, 1600.0f),//heat adds green
|
||||||
// clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f));//vy adds blue
|
// clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f));//vy adds blue
|
||||||
|
@ -50,6 +50,7 @@ GameModel::GameModel():
|
|||||||
colourSelector(false),
|
colourSelector(false),
|
||||||
colour(255, 0, 0, 255),
|
colour(255, 0, 0, 255),
|
||||||
edgeMode(0),
|
edgeMode(0),
|
||||||
|
ambientAirTemp(R_TEMP + 273.15f),
|
||||||
decoSpace(0)
|
decoSpace(0)
|
||||||
{
|
{
|
||||||
sim = new Simulation();
|
sim = new Simulation();
|
||||||
@ -95,6 +96,15 @@ GameModel::GameModel():
|
|||||||
//Load config into simulation
|
//Load config into simulation
|
||||||
edgeMode = Client::Ref().GetPrefInteger("Simulation.EdgeMode", 0);
|
edgeMode = Client::Ref().GetPrefInteger("Simulation.EdgeMode", 0);
|
||||||
sim->SetEdgeMode(edgeMode);
|
sim->SetEdgeMode(edgeMode);
|
||||||
|
ambientAirTemp = R_TEMP + 273.15;
|
||||||
|
{
|
||||||
|
auto temp = Client::Ref().GetPrefNumber("Simulation.AmbientAirTemp", ambientAirTemp);
|
||||||
|
if (MIN_TEMP <= temp && MAX_TEMP >= temp)
|
||||||
|
{
|
||||||
|
ambientAirTemp = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sim->air->ambientAirTemp = ambientAirTemp;
|
||||||
decoSpace = Client::Ref().GetPrefInteger("Simulation.DecoSpace", 0);
|
decoSpace = Client::Ref().GetPrefInteger("Simulation.DecoSpace", 0);
|
||||||
sim->SetDecoSpace(decoSpace);
|
sim->SetDecoSpace(decoSpace);
|
||||||
int ngrav_enable = Client::Ref().GetPrefInteger("Simulation.NewtonianGravity", 0);
|
int ngrav_enable = Client::Ref().GetPrefInteger("Simulation.NewtonianGravity", 0);
|
||||||
@ -140,6 +150,8 @@ GameModel::GameModel():
|
|||||||
|
|
||||||
mouseClickRequired = Client::Ref().GetPrefBool("MouseClickRequired", false);
|
mouseClickRequired = Client::Ref().GetPrefBool("MouseClickRequired", false);
|
||||||
includePressure = Client::Ref().GetPrefBool("Simulation.IncludePressure", true);
|
includePressure = Client::Ref().GetPrefBool("Simulation.IncludePressure", true);
|
||||||
|
|
||||||
|
ClearSimulation();
|
||||||
}
|
}
|
||||||
|
|
||||||
GameModel::~GameModel()
|
GameModel::~GameModel()
|
||||||
@ -519,6 +531,17 @@ int GameModel::GetEdgeMode()
|
|||||||
return this->edgeMode;
|
return this->edgeMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GameModel::SetAmbientAirTemperature(float ambientAirTemp)
|
||||||
|
{
|
||||||
|
this->ambientAirTemp = ambientAirTemp;
|
||||||
|
sim->air->ambientAirTemp = ambientAirTemp;
|
||||||
|
}
|
||||||
|
|
||||||
|
float GameModel::GetAmbientAirTemperature()
|
||||||
|
{
|
||||||
|
return this->ambientAirTemp;
|
||||||
|
}
|
||||||
|
|
||||||
void GameModel::SetDecoSpace(int decoSpace)
|
void GameModel::SetDecoSpace(int decoSpace)
|
||||||
{
|
{
|
||||||
sim->SetDecoSpace(decoSpace);
|
sim->SetDecoSpace(decoSpace);
|
||||||
@ -735,6 +758,7 @@ void GameModel::SetSave(SaveInfo * newSave, bool invertIncludePressure)
|
|||||||
SetPaused(saveData->paused | GetPaused());
|
SetPaused(saveData->paused | GetPaused());
|
||||||
sim->gravityMode = saveData->gravityMode;
|
sim->gravityMode = saveData->gravityMode;
|
||||||
sim->air->airMode = saveData->airMode;
|
sim->air->airMode = saveData->airMode;
|
||||||
|
sim->air->ambientAirTemp = saveData->ambientAirTemp;
|
||||||
sim->edgeMode = saveData->edgeMode;
|
sim->edgeMode = saveData->edgeMode;
|
||||||
sim->legacy_enable = saveData->legacyEnable;
|
sim->legacy_enable = saveData->legacyEnable;
|
||||||
sim->water_equal_test = saveData->waterEEnabled;
|
sim->water_equal_test = saveData->waterEEnabled;
|
||||||
@ -796,6 +820,7 @@ void GameModel::SetSaveFile(SaveFile * newSave, bool invertIncludePressure)
|
|||||||
SetPaused(saveData->paused | GetPaused());
|
SetPaused(saveData->paused | GetPaused());
|
||||||
sim->gravityMode = saveData->gravityMode;
|
sim->gravityMode = saveData->gravityMode;
|
||||||
sim->air->airMode = saveData->airMode;
|
sim->air->airMode = saveData->airMode;
|
||||||
|
sim->air->ambientAirTemp = saveData->ambientAirTemp;
|
||||||
sim->edgeMode = saveData->edgeMode;
|
sim->edgeMode = saveData->edgeMode;
|
||||||
sim->legacy_enable = saveData->legacyEnable;
|
sim->legacy_enable = saveData->legacyEnable;
|
||||||
sim->water_equal_test = saveData->waterEEnabled;
|
sim->water_equal_test = saveData->waterEEnabled;
|
||||||
@ -1111,6 +1136,7 @@ void GameModel::ClearSimulation()
|
|||||||
sim->legacy_enable = false;
|
sim->legacy_enable = false;
|
||||||
sim->water_equal_test = false;
|
sim->water_equal_test = false;
|
||||||
sim->SetEdgeMode(edgeMode);
|
sim->SetEdgeMode(edgeMode);
|
||||||
|
sim->air->ambientAirTemp = ambientAirTemp;
|
||||||
|
|
||||||
sim->clear_sim();
|
sim->clear_sim();
|
||||||
ren->ClearAccumulation();
|
ren->ClearAccumulation();
|
||||||
|
@ -78,6 +78,7 @@ private:
|
|||||||
ui::Colour colour;
|
ui::Colour colour;
|
||||||
|
|
||||||
int edgeMode;
|
int edgeMode;
|
||||||
|
float ambientAirTemp;
|
||||||
int decoSpace;
|
int decoSpace;
|
||||||
|
|
||||||
String infoTip;
|
String infoTip;
|
||||||
@ -112,6 +113,8 @@ public:
|
|||||||
|
|
||||||
void SetEdgeMode(int edgeMode);
|
void SetEdgeMode(int edgeMode);
|
||||||
int GetEdgeMode();
|
int GetEdgeMode();
|
||||||
|
void SetAmbientAirTemperature(float edgeMode);
|
||||||
|
float GetAmbientAirTemperature();
|
||||||
void SetDecoSpace(int decoSpace);
|
void SetDecoSpace(int decoSpace);
|
||||||
int GetDecoSpace();
|
int GetDecoSpace();
|
||||||
|
|
||||||
|
@ -23,6 +23,27 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
void ParseFloatProperty(String value, float &out)
|
||||||
|
{
|
||||||
|
if (value.EndsWith("C"))
|
||||||
|
{
|
||||||
|
float v = value.SubstrFromEnd(1).ToNumber<float>();
|
||||||
|
out = v + 273.15;
|
||||||
|
}
|
||||||
|
else if(value.EndsWith("F"))
|
||||||
|
{
|
||||||
|
float v = value.SubstrFromEnd(1).ToNumber<float>();
|
||||||
|
out = (v-32.0f)*5/9+273.15f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
out = value.ToNumber<float>();
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
std::cout << "Got float value " << out << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
class PropertyWindow: public ui::Window
|
class PropertyWindow: public ui::Window
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -189,23 +210,7 @@ void PropertyWindow::SetProperty()
|
|||||||
}
|
}
|
||||||
case StructProperty::Float:
|
case StructProperty::Float:
|
||||||
{
|
{
|
||||||
if (value.EndsWith("C"))
|
ParseFloatProperty(value, tool->propValue.Float);
|
||||||
{
|
|
||||||
float v = value.SubstrFromEnd(1).ToNumber<float>();
|
|
||||||
tool->propValue.Float = v + 273.15;
|
|
||||||
}
|
|
||||||
else if(value.EndsWith("F"))
|
|
||||||
{
|
|
||||||
float v = value.SubstrFromEnd(1).ToNumber<float>();
|
|
||||||
tool->propValue.Float = (v-32.0f)*5/9+273.15f;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tool->propValue.Float = value.ToNumber<float>();
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
|
||||||
std::cout << "Got float value " << tool->propValue.Float << std::endl;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -47,6 +47,11 @@ void OptionsController::SetAirMode(int airMode)
|
|||||||
model->SetAirMode(airMode);
|
model->SetAirMode(airMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OptionsController::SetAmbientAirTemperature(float ambientAirTemp)
|
||||||
|
{
|
||||||
|
model->SetAmbientAirTemperature(ambientAirTemp);
|
||||||
|
}
|
||||||
|
|
||||||
void OptionsController::SetEdgeMode(int edgeMode)
|
void OptionsController::SetEdgeMode(int edgeMode)
|
||||||
{
|
{
|
||||||
model->SetEdgeMode(edgeMode);
|
model->SetEdgeMode(edgeMode);
|
||||||
|
@ -22,6 +22,7 @@ public:
|
|||||||
void SetWaterEqualisation(bool state);
|
void SetWaterEqualisation(bool state);
|
||||||
void SetGravityMode(int gravityMode);
|
void SetGravityMode(int gravityMode);
|
||||||
void SetAirMode(int airMode);
|
void SetAirMode(int airMode);
|
||||||
|
void SetAmbientAirTemperature(float ambientAirTemp);
|
||||||
void SetEdgeMode(int edgeMode);
|
void SetEdgeMode(int edgeMode);
|
||||||
void SetFullscreen(bool fullscreen);
|
void SetFullscreen(bool fullscreen);
|
||||||
void SetAltFullscreen(bool altFullscreen);
|
void SetAltFullscreen(bool altFullscreen);
|
||||||
|
@ -90,6 +90,17 @@ void OptionsModel::SetEdgeMode(int edgeMode)
|
|||||||
notifySettingsChanged();
|
notifySettingsChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float OptionsModel::GetAmbientAirTemperature()
|
||||||
|
{
|
||||||
|
return gModel->GetSimulation()->air->ambientAirTemp;
|
||||||
|
}
|
||||||
|
void OptionsModel::SetAmbientAirTemperature(float ambientAirTemp)
|
||||||
|
{
|
||||||
|
Client::Ref().SetPref("Simulation.AmbientAirTemp", ambientAirTemp);
|
||||||
|
gModel->SetAmbientAirTemperature(ambientAirTemp);
|
||||||
|
notifySettingsChanged();
|
||||||
|
}
|
||||||
|
|
||||||
int OptionsModel::GetGravityMode()
|
int OptionsModel::GetGravityMode()
|
||||||
{
|
{
|
||||||
return sim->gravityMode;
|
return sim->gravityMode;
|
||||||
|
@ -28,6 +28,8 @@ public:
|
|||||||
void SetShowAvatars(bool state);
|
void SetShowAvatars(bool state);
|
||||||
int GetAirMode();
|
int GetAirMode();
|
||||||
void SetAirMode(int airMode);
|
void SetAirMode(int airMode);
|
||||||
|
float GetAmbientAirTemperature();
|
||||||
|
void SetAmbientAirTemperature(float ambientAirTemp);
|
||||||
int GetEdgeMode();
|
int GetEdgeMode();
|
||||||
void SetEdgeMode(int edgeMode);
|
void SetEdgeMode(int edgeMode);
|
||||||
int GetGravityMode();
|
int GetGravityMode();
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "OptionsView.h"
|
#include "OptionsView.h"
|
||||||
|
|
||||||
|
#include "simulation/ElementDefs.h"
|
||||||
#include "OptionsController.h"
|
#include "OptionsController.h"
|
||||||
#include "OptionsModel.h"
|
#include "OptionsModel.h"
|
||||||
|
|
||||||
@ -20,11 +21,14 @@
|
|||||||
#include "gui/interface/DropDown.h"
|
#include "gui/interface/DropDown.h"
|
||||||
#include "gui/interface/Engine.h"
|
#include "gui/interface/Engine.h"
|
||||||
#include "gui/interface/Checkbox.h"
|
#include "gui/interface/Checkbox.h"
|
||||||
|
#include "gui/interface/Textbox.h"
|
||||||
|
|
||||||
#include "graphics/Graphics.h"
|
#include "graphics/Graphics.h"
|
||||||
|
|
||||||
OptionsView::OptionsView():
|
OptionsView::OptionsView():
|
||||||
ui::Window(ui::Point(-1, -1), ui::Point(320, 340)){
|
ui::Window(ui::Point(-1, -1), ui::Point(320, 340)),
|
||||||
|
ambientAirTempPreviewValid(false)
|
||||||
|
{
|
||||||
|
|
||||||
auto autowidth = [this](ui::Component *c) {
|
auto autowidth = [this](ui::Component *c) {
|
||||||
c->Size.X = Size.X - c->Position.X - 12;
|
c->Size.X = Size.X - c->Position.X - 12;
|
||||||
@ -119,6 +123,41 @@ OptionsView::OptionsView():
|
|||||||
tempLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
|
tempLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
|
||||||
scrollPanel->AddChild(tempLabel);
|
scrollPanel->AddChild(tempLabel);
|
||||||
|
|
||||||
|
currentY+=20;
|
||||||
|
ambientAirTemp = new ui::Textbox(ui::Point(Size.X-95, currentY), ui::Point(60, 16));
|
||||||
|
ambientAirTemp->SetActionCallback({ [this] {
|
||||||
|
float temp;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
void ParseFloatProperty(String value, float &out);
|
||||||
|
ParseFloatProperty(ambientAirTemp->GetText(), temp);
|
||||||
|
ambientAirTempPreviewValid = true;
|
||||||
|
}
|
||||||
|
catch (const std::exception &ex)
|
||||||
|
{
|
||||||
|
ambientAirTempPreviewValid = false;
|
||||||
|
}
|
||||||
|
if (!(MIN_TEMP <= temp && MAX_TEMP >= temp))
|
||||||
|
{
|
||||||
|
ambientAirTempPreviewValid = false;
|
||||||
|
}
|
||||||
|
if (ambientAirTempPreviewValid)
|
||||||
|
{
|
||||||
|
ambientAirTempPreviewValue = temp;
|
||||||
|
c->SetAmbientAirTemperature(ambientAirTempPreviewValue);
|
||||||
|
}
|
||||||
|
UpdateAmbientAirTempPreview();
|
||||||
|
} });
|
||||||
|
scrollPanel->AddChild(ambientAirTemp);
|
||||||
|
|
||||||
|
ambientAirTempPreview = new ui::Button(ui::Point(Size.X-31, currentY), ui::Point(16, 16), "", "Preview");
|
||||||
|
scrollPanel->AddChild(ambientAirTempPreview);
|
||||||
|
|
||||||
|
tempLabel = new ui::Label(ui::Point(8, currentY), ui::Point(Size.X-96, 16), "Ambient Air Temperature");
|
||||||
|
tempLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
|
||||||
|
tempLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
|
||||||
|
scrollPanel->AddChild(tempLabel);
|
||||||
|
|
||||||
currentY+=20;
|
currentY+=20;
|
||||||
gravityMode = new ui::DropDown(ui::Point(Size.X-95, currentY), ui::Point(80, 16));
|
gravityMode = new ui::DropDown(ui::Point(Size.X-95, currentY), ui::Point(80, 16));
|
||||||
scrollPanel->AddChild(gravityMode);
|
scrollPanel->AddChild(gravityMode);
|
||||||
@ -330,6 +369,23 @@ OptionsView::OptionsView():
|
|||||||
scrollPanel->InnerSize = ui::Point(Size.X, currentY);
|
scrollPanel->InnerSize = ui::Point(Size.X, currentY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OptionsView::UpdateAmbientAirTempPreview()
|
||||||
|
{
|
||||||
|
if (ambientAirTempPreviewValid)
|
||||||
|
{
|
||||||
|
int HeatToColour(float temp);
|
||||||
|
int c = HeatToColour(ambientAirTempPreviewValue);
|
||||||
|
ambientAirTempPreview->Appearance.BackgroundInactive = ui::Colour(PIXR(c), PIXG(c), PIXB(c));
|
||||||
|
ambientAirTempPreview->SetText("");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ambientAirTempPreview->Appearance.BackgroundInactive = ui::Colour(0, 0, 0);
|
||||||
|
ambientAirTempPreview->SetText("?");
|
||||||
|
}
|
||||||
|
ambientAirTempPreview->Appearance.BackgroundHover = ambientAirTempPreview->Appearance.BackgroundInactive;
|
||||||
|
}
|
||||||
|
|
||||||
void OptionsView::NotifySettingsChanged(OptionsModel * sender)
|
void OptionsView::NotifySettingsChanged(OptionsModel * sender)
|
||||||
{
|
{
|
||||||
heatSimulation->SetChecked(sender->GetHeatSimulation());
|
heatSimulation->SetChecked(sender->GetHeatSimulation());
|
||||||
@ -337,6 +393,30 @@ void OptionsView::NotifySettingsChanged(OptionsModel * sender)
|
|||||||
newtonianGravity->SetChecked(sender->GetNewtonianGravity());
|
newtonianGravity->SetChecked(sender->GetNewtonianGravity());
|
||||||
waterEqualisation->SetChecked(sender->GetWaterEqualisation());
|
waterEqualisation->SetChecked(sender->GetWaterEqualisation());
|
||||||
airMode->SetOption(sender->GetAirMode());
|
airMode->SetOption(sender->GetAirMode());
|
||||||
|
if (!ambientAirTempPreviewValid)
|
||||||
|
{
|
||||||
|
// * ambientAirTempPreviewValid is initially false (see constructor). Thus, when
|
||||||
|
// NotifySettingsChanged is first called when the view is registered as an
|
||||||
|
// observer, this block executes. Once this happens, NotifySettingsChanged is
|
||||||
|
// only ever called when some setting is changed by the user in OptionsView.
|
||||||
|
// This means either a change that doesn't involve the ambientAirTemp Textbox,
|
||||||
|
// or one that does involve it. The latter case can only happen if the action
|
||||||
|
// callback of the Textbox called OptionsController::SetAmbientAirTemperature,
|
||||||
|
// which in turn implies that ambientAirTempPreviewValid is already true.
|
||||||
|
// * What this all boils down to is that this block is only ever run on two
|
||||||
|
// occasions: when OptionsView is initialized and when the user decides to
|
||||||
|
// cancel changing the ambient temperature via the ambientAirTemp Textbox,
|
||||||
|
// and hasn't yet succeeded. What we want to avoid is SetText being called
|
||||||
|
// on the Textbox while the user is actively editing its contents, so this
|
||||||
|
// works out perfectly.
|
||||||
|
// * Rather twisted. I blame the MVC pattern TPT uses. -- LBPHacker
|
||||||
|
ambientAirTempPreviewValid = true;
|
||||||
|
ambientAirTempPreviewValue = sender->GetAmbientAirTemperature();
|
||||||
|
UpdateAmbientAirTempPreview();
|
||||||
|
StringBuilder sb;
|
||||||
|
sb << Format::Precision(2) << ambientAirTempPreviewValue;
|
||||||
|
ambientAirTemp->SetText(sb.Build());
|
||||||
|
}
|
||||||
gravityMode->SetOption(sender->GetGravityMode());
|
gravityMode->SetOption(sender->GetGravityMode());
|
||||||
decoSpace->SetOption(sender->GetDecoSpace());
|
decoSpace->SetOption(sender->GetDecoSpace());
|
||||||
edgeMode->SetOption(sender->GetEdgeMode());
|
edgeMode->SetOption(sender->GetEdgeMode());
|
||||||
|
@ -8,7 +8,8 @@ namespace ui
|
|||||||
{
|
{
|
||||||
class Checkbox;
|
class Checkbox;
|
||||||
class DropDown;
|
class DropDown;
|
||||||
class DropDown;
|
class Textbox;
|
||||||
|
class Button;
|
||||||
}
|
}
|
||||||
|
|
||||||
class OptionsModel;
|
class OptionsModel;
|
||||||
@ -21,6 +22,8 @@ class OptionsView: public ui::Window
|
|||||||
ui::Checkbox * newtonianGravity;
|
ui::Checkbox * newtonianGravity;
|
||||||
ui::Checkbox * waterEqualisation;
|
ui::Checkbox * waterEqualisation;
|
||||||
ui::DropDown * airMode;
|
ui::DropDown * airMode;
|
||||||
|
ui::Textbox * ambientAirTemp;
|
||||||
|
ui::Button * ambientAirTempPreview;
|
||||||
ui::DropDown * gravityMode;
|
ui::DropDown * gravityMode;
|
||||||
ui::DropDown * edgeMode;
|
ui::DropDown * edgeMode;
|
||||||
ui::DropDown * scale;
|
ui::DropDown * scale;
|
||||||
@ -36,6 +39,9 @@ class OptionsView: public ui::Window
|
|||||||
ui::Checkbox * includePressure;
|
ui::Checkbox * includePressure;
|
||||||
ui::Checkbox * perfectCirclePressure;
|
ui::Checkbox * perfectCirclePressure;
|
||||||
ui::ScrollPanel * scrollPanel;
|
ui::ScrollPanel * scrollPanel;
|
||||||
|
bool ambientAirTempPreviewValid;
|
||||||
|
float ambientAirTempPreviewValue;
|
||||||
|
void UpdateAmbientAirTempPreview();
|
||||||
public:
|
public:
|
||||||
OptionsView();
|
OptionsView();
|
||||||
void NotifySettingsChanged(OptionsModel * sender);
|
void NotifySettingsChanged(OptionsModel * sender);
|
||||||
|
@ -1935,7 +1935,7 @@ int LuaScriptInterface::simulation_ambientAirTemp(lua_State * l)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
float ambientAirTemp = luaL_optnumber(l, 1, 295.15f);
|
float ambientAirTemp = luaL_optnumber(l, 1, 295.15f);
|
||||||
luacon_sim->air->ambientAirTemp = ambientAirTemp;
|
luacon_model->SetAmbientAirTemperature(ambientAirTemp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -385,7 +385,7 @@ void Air::RecalculateBlockAirMaps()
|
|||||||
Air::Air(Simulation & simulation):
|
Air::Air(Simulation & simulation):
|
||||||
sim(simulation),
|
sim(simulation),
|
||||||
airMode(0),
|
airMode(0),
|
||||||
ambientAirTemp(295.15f)
|
ambientAirTemp(R_TEMP + 273.15f)
|
||||||
{
|
{
|
||||||
//Simulation should do this.
|
//Simulation should do this.
|
||||||
make_kernel();
|
make_kernel();
|
||||||
|
@ -551,6 +551,7 @@ void Simulation::SaveSimOptions(GameSave * gameSave)
|
|||||||
return;
|
return;
|
||||||
gameSave->gravityMode = gravityMode;
|
gameSave->gravityMode = gravityMode;
|
||||||
gameSave->airMode = air->airMode;
|
gameSave->airMode = air->airMode;
|
||||||
|
gameSave->ambientAirTemp = air->ambientAirTemp;
|
||||||
gameSave->edgeMode = edgeMode;
|
gameSave->edgeMode = edgeMode;
|
||||||
gameSave->legacyEnable = legacy_enable;
|
gameSave->legacyEnable = legacy_enable;
|
||||||
gameSave->waterEEnabled = water_equal_test;
|
gameSave->waterEEnabled = water_equal_test;
|
||||||
|
Reference in New Issue
Block a user