colobot/colobot-base/ui/screen/screen_appearance.cpp

732 lines
22 KiB
C++
Raw Permalink Normal View History

2015-08-04 21:28:58 +00:00
/*
* This file is part of the Colobot: Gold Edition source code
2023-08-06 21:15:48 +00:00
* Copyright (C) 2001-2023, Daniel Roux, EPSITEC SA & TerranovaTeam
2015-08-22 14:40:02 +00:00
* http://epsitec.ch; http://colobot.info; http://github.com/colobot
2015-08-04 21:28:58 +00:00
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://gnu.org/licenses
*/
2022-01-24 18:51:00 +00:00
#include "ui/screen/screen_appearance.h"
2015-08-04 21:28:58 +00:00
#include "app/app.h"
#include "common/restext.h"
2015-08-04 21:28:58 +00:00
#include "graphics/engine/camera.h"
#include "graphics/engine/engine.h"
2015-08-04 21:28:58 +00:00
#include "level/player_profile.h"
#include "level/robotmain.h"
#include "math/geometry.h"
#include "ui/controls/button.h"
#include "ui/controls/color.h"
#include "ui/controls/interface.h"
#include "ui/controls/label.h"
#include "ui/controls/slider.h"
#include "ui/controls/window.h"
2015-08-04 21:28:58 +00:00
namespace Ui
{
2015-08-04 21:28:58 +00:00
const int PERSO_COLOR[3*10*3] =
2015-08-04 21:28:58 +00:00
{
// hair:
193, 221, 226, // white
255, 255, 181, // yellow
204, 155, 84, // blond
165, 48, 10, // red
140, 75, 84, // brown
83, 64, 51, // brown
90, 95, 85, // black
85, 48, 9, // brown
60, 0, 23, // black
0, 0, 0, //
// spacesuit:
203, 206, 204, // dirty white
0, 205, 203, // bluish
108, 176, 0, // greenish
207, 207, 32, // yellow
170, 141, 0, // orange
108, 84, 0, // brown
0, 84, 136, // bluish
56, 61, 146, // bluish
56, 56, 56, // black
0, 0, 0, //
// strips:
255, 255, 255, // white
255, 255, 0, // yellow
255, 132, 1, // orange
255, 0, 255, // magenta
255, 0, 0, // red
0, 255, 0, // green
0, 255, 255, // cyan
0, 0, 255, // blue
70, 51, 84, // dark
0, 0, 0, //
};
2022-01-24 18:51:00 +00:00
CScreenAppearance::CScreenAppearance()
: m_appearanceTab(0),
m_appearanceAngle(0.0f)
2015-08-04 21:28:58 +00:00
{
}
2022-01-24 18:51:00 +00:00
void CScreenAppearance::CreateInterface()
2015-08-04 21:28:58 +00:00
{
CWindow* pw;
CLabel* pl;
CButton* pb;
CColor* pco;
CSlider* psl;
glm::vec2 pos, ddim;
2015-08-04 21:28:58 +00:00
std::string name;
pos.x = 0.10f;
pos.y = 0.10f;
ddim.x = 0.80f;
ddim.y = 0.80f;
pw = m_interface->CreateWindows(pos, ddim, 12, EVENT_WINDOW5);
GetResource(RES_TEXT, RT_TITLE_PERSO, name);
pw->SetName(name);
pos.x = 0.10f;
pos.y = 0.40f;
ddim.x = 0.50f;
ddim.y = 0.50f;
pw->CreateGroup(pos, ddim, 5, EVENT_INTERFACE_GLINTl); // orange corner
pos.x = 0.40f;
pos.y = 0.10f;
ddim.x = 0.50f;
ddim.y = 0.50f;
pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner
pos.x = 95.0f/640.0f;
pos.y = 108.0f/480.0f;
ddim.x = 220.0f/640.0f;
ddim.y = 274.0f/480.0f;
pw->CreateGroup(pos, ddim, 17, EVENT_NULL); // frame
pos.x = 100.0f/640.0f;
pos.y = 364.0f/480.0f;
ddim.x = 210.0f/640.0f;
ddim.y = 14.0f/480.0f;
pw->CreateGroup(pos, ddim, 3, EVENT_NULL); // transparent -> gray
pos.x = 120.0f/640.0f;
pos.y = 364.0f/480.0f;
ddim.x = 80.0f/640.0f;
ddim.y = 28.0f/480.0f;
pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PHEAD);
pb->SetState(STATE_SHADOW);
pb->SetState(STATE_CARD);
pos.x = 210.0f/640.0f;
pos.y = 364.0f/480.0f;
ddim.x = 80.0f/640.0f;
ddim.y = 28.0f/480.0f;
pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PBODY);
pb->SetState(STATE_SHADOW);
pb->SetState(STATE_CARD);
pos.x = 100.0f/640.0f;
pos.y = 354.0f/480.0f;
ddim.x = 210.0f/640.0f;
ddim.y = 10.0f/480.0f;
pw->CreateGroup(pos, ddim, 1, EVENT_INTERFACE_GLINTb); // orange bar
pos.x = 100.0f/640.0f;
pos.y = 154.0f/480.0f;
ddim.x = 210.0f/640.0f;
ddim.y = 200.0f/480.0f;
pw->CreateGroup(pos, ddim, 2, EVENT_INTERFACE_GLINTu); // orange -> transparent
// Face
pos.x = 340.0f/640.0f;
pos.y = 356.0f/480.0f;
ddim.x = 200.0f/640.0f;
ddim.y = 16.0f/480.0f;
pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL11, "");
pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT);
pos.x = 340.0f/640.0f;
pos.y = 312.0f/480.0f;
ddim.x = 44.0f/640.0f;
ddim.y = 44.0f/480.0f;
pb = pw->CreateButton(pos, ddim, 43, EVENT_INTERFACE_PFACE1);
pb->SetState(STATE_SHADOW);
pos.x += 50.0f/640.0f;
pb = pw->CreateButton(pos, ddim, 44, EVENT_INTERFACE_PFACE2);
2015-08-04 21:28:58 +00:00
pb->SetState(STATE_SHADOW);
pos.x += 50.0f/640.0f;
pb = pw->CreateButton(pos, ddim, 45, EVENT_INTERFACE_PFACE3);
pb->SetState(STATE_SHADOW);
pos.x += 50.0f/640.0f;
pb = pw->CreateButton(pos, ddim, 46, EVENT_INTERFACE_PFACE4);
2015-08-04 21:28:58 +00:00
pb->SetState(STATE_SHADOW);
// Glasses
pos.x = 340.0f/640.0f;
pos.y = 270.0f/480.0f;
ddim.x = 200.0f/640.0f;
ddim.y = 16.0f/480.0f;
pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, "");
pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT);
pos.x = 340.0f/640.0f;
pos.y = 240.0f/480.0f;
ddim.x = 30.0f/640.0f;
ddim.y = 30.0f/480.0f;
for ( int i=0 ; i<6 ; i++ )
{
int ti[6] = {11, 179, 180, 181, 182, 183};
pb = pw->CreateButton(pos, ddim, ti[i], static_cast<EventType>(EVENT_INTERFACE_PGLASS0+i));
pb->SetState(STATE_SHADOW);
pos.x += (30.0f+2.8f)/640.0f;
}
// Color A
pos.x = 340.0f/640.0f;
pos.y = 300.0f/480.0f;
ddim.x = 200.0f/640.0f;
ddim.y = 16.0f/480.0f;
pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL14, "");
pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT);
pos.y = 282.0f/480.0f;
ddim.x = 18.0f/640.0f;
ddim.y = 18.0f/480.0f;
for ( int j=0 ; j<3 ; j++ )
{
pos.x = 340.0f/640.0f;
for ( int i=0 ; i<3 ; i++ )
{
pco = pw->CreateColor(pos, ddim, -1, static_cast<EventType>(EVENT_INTERFACE_PC0a+j*3+i));
pco->SetState(STATE_SHADOW);
pos.x += 20.0f/640.0f;
}
pos.y -= 20.0f/480.0f;
}
pos.x = 420.0f/640.0f;
pos.y = 282.0f/480.0f;
ddim.x = 100.0f/640.0f;
ddim.y = 18.0f/480.0f;
for ( int i=0 ; i<3 ; i++ )
{
psl = pw->CreateSlider(pos, ddim, 0, static_cast<EventType>(EVENT_INTERFACE_PCRa+i));
psl->SetState(STATE_SHADOW);
psl->SetLimit(0.0f, 255.0f);
psl->SetArrowStep(16.0f);
pos.y -= 20.0f/480.0f;
}
// Color B
pos.x = 340.0f/640.0f;
pos.y = 192.0f/480.0f;
ddim.x = 200.0f/640.0f;
ddim.y = 16.0f/480.0f;
pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL13, "");
pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT);
pos.y = 174.0f/480.0f;
ddim.x = 18.0f/640.0f;
ddim.y = 18.0f/480.0f;
for ( int j=0 ; j<3 ; j++ )
{
pos.x = 340.0f/640.0f;
for ( int i=0 ; i<3 ; i++ )
{
pco = pw->CreateColor(pos, ddim, -1, static_cast<EventType>(EVENT_INTERFACE_PC0b+j*3+i));
pco->SetState(STATE_SHADOW);
pos.x += 20.0f/640.0f;
}
pos.y -= 20.0f/480.0f;
}
pos.x = 420.0f/640.0f;
pos.y = 174.0f/480.0f;
ddim.x = 100.0f/640.0f;
ddim.y = 18.0f/480.0f;
for ( int i=0 ; i<3 ; i++ )
{
psl = pw->CreateSlider(pos, ddim, 0, static_cast<EventType>(EVENT_INTERFACE_PCRb+i));
psl->SetState(STATE_SHADOW);
psl->SetLimit(0.0f, 255.0f);
psl->SetArrowStep(16.0f);
pos.y -= 20.0f/480.0f;
}
// Rotation
pos.x = 100.0f/640.0f;
pos.y = 113.0f/480.0f;
ddim.x = 20.0f/640.0f;
ddim.y = 20.0f/480.0f;
pb = pw->CreateButton(pos, ddim, 55, EVENT_INTERFACE_PLROT); // <
pb->SetState(STATE_SHADOW);
pb->SetRepeat(true);
pos.x = 290.0f/640.0f;
pos.y = 113.0f/480.0f;
ddim.x = 20.0f/640.0f;
ddim.y = 20.0f/480.0f;
pb = pw->CreateButton(pos, ddim, 48, EVENT_INTERFACE_PRROT); // >
pb->SetState(STATE_SHADOW);
pb->SetRepeat(true);
pos.x = 100.0f/640.0f;
pos.y = 70.0f/480.0f;
ddim.x = 100.0f/640.0f;
ddim.y = 32.0f/480.0f;
pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_POK);
pb->SetState(STATE_SHADOW);
pos.x = 210.0f/640.0f;
pos.y = 70.0f/480.0f;
ddim.x =100.0f/640.0f;
ddim.y = 32.0f/480.0f;
pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PCANCEL);
pb->SetState(STATE_SHADOW);
pos.x = 340.0f/640.0f;
pos.y = 70.0f/480.0f;
ddim.x =194.0f/640.0f;
ddim.y = 32.0f/480.0f;
pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PDEF);
pb->SetState(STATE_SHADOW);
2022-01-24 18:51:00 +00:00
m_appearanceTab = 0;
m_appearanceAngle = -0.6f;
m_main->GetPlayerProfile()->LoadAppearance();
2015-08-04 21:28:58 +00:00
UpdatePerso();
m_main->ScenePerso();
CameraPerso();
}
2022-01-24 18:51:00 +00:00
bool CScreenAppearance::EventProcess(const Event &event)
2015-08-04 21:28:58 +00:00
{
2022-01-24 18:51:00 +00:00
PlayerAppearance& appearance = m_main->GetPlayerProfile()->GetAppearance();
2015-08-04 21:28:58 +00:00
switch( event.type )
{
case EVENT_KEY_DOWN:
{
auto data = event.GetData<KeyEventData>();
if (data->key == KEY(RETURN))
2015-08-04 21:28:58 +00:00
{
m_main->ChangePhase(PHASE_MAIN_MENU);
}
if (data->key == KEY(ESCAPE))
2015-08-04 21:28:58 +00:00
{
m_main->ChangePhase(PHASE_PLAYER_SELECT);
}
break;
}
2015-08-04 21:28:58 +00:00
case EVENT_UPDINTERFACE:
CameraPerso();
break;
2015-08-04 21:28:58 +00:00
case EVENT_INTERFACE_PHEAD:
2022-01-24 18:51:00 +00:00
m_appearanceTab = 0;
2015-08-04 21:28:58 +00:00
UpdatePerso();
m_main->ScenePerso();
CameraPerso();
break;
case EVENT_INTERFACE_PBODY:
2022-01-24 18:51:00 +00:00
m_appearanceTab = 1;
2015-08-04 21:28:58 +00:00
UpdatePerso();
m_main->ScenePerso();
CameraPerso();
break;
case EVENT_INTERFACE_PFACE1:
case EVENT_INTERFACE_PFACE2:
case EVENT_INTERFACE_PFACE3:
case EVENT_INTERFACE_PFACE4:
2022-01-24 18:51:00 +00:00
appearance.face = event.type-EVENT_INTERFACE_PFACE1;
appearance.DefHairColor();
2015-08-04 21:28:58 +00:00
UpdatePerso();
m_main->ScenePerso();
break;
case EVENT_INTERFACE_PGLASS0:
case EVENT_INTERFACE_PGLASS1:
case EVENT_INTERFACE_PGLASS2:
case EVENT_INTERFACE_PGLASS3:
case EVENT_INTERFACE_PGLASS4:
case EVENT_INTERFACE_PGLASS5:
case EVENT_INTERFACE_PGLASS6:
case EVENT_INTERFACE_PGLASS7:
case EVENT_INTERFACE_PGLASS8:
case EVENT_INTERFACE_PGLASS9:
2022-01-24 18:51:00 +00:00
appearance.glasses = event.type-EVENT_INTERFACE_PGLASS0;
2015-08-04 21:28:58 +00:00
UpdatePerso();
m_main->ScenePerso();
break;
case EVENT_INTERFACE_PC0a:
case EVENT_INTERFACE_PC1a:
case EVENT_INTERFACE_PC2a:
case EVENT_INTERFACE_PC3a:
case EVENT_INTERFACE_PC4a:
case EVENT_INTERFACE_PC5a:
case EVENT_INTERFACE_PC6a:
case EVENT_INTERFACE_PC7a:
case EVENT_INTERFACE_PC8a:
case EVENT_INTERFACE_PC9a:
FixPerso(event.type-EVENT_INTERFACE_PC0a, 0);
UpdatePerso();
m_main->ScenePerso();
break;
case EVENT_INTERFACE_PC0b:
case EVENT_INTERFACE_PC1b:
case EVENT_INTERFACE_PC2b:
case EVENT_INTERFACE_PC3b:
case EVENT_INTERFACE_PC4b:
case EVENT_INTERFACE_PC5b:
case EVENT_INTERFACE_PC6b:
case EVENT_INTERFACE_PC7b:
case EVENT_INTERFACE_PC8b:
case EVENT_INTERFACE_PC9b:
FixPerso(event.type-EVENT_INTERFACE_PC0b, 1);
UpdatePerso();
m_main->ScenePerso();
break;
case EVENT_INTERFACE_PCRa:
case EVENT_INTERFACE_PCGa:
case EVENT_INTERFACE_PCBa:
case EVENT_INTERFACE_PCRb:
case EVENT_INTERFACE_PCGb:
case EVENT_INTERFACE_PCBb:
ColorPerso();
UpdatePerso();
m_main->ScenePerso();
break;
case EVENT_INTERFACE_PDEF:
2022-01-24 18:51:00 +00:00
appearance.DefPerso();
2015-08-04 21:28:58 +00:00
UpdatePerso();
m_main->ScenePerso();
break;
case EVENT_INTERFACE_PLROT:
2022-01-24 18:51:00 +00:00
m_appearanceAngle += 0.2f;
2015-08-04 21:28:58 +00:00
break;
case EVENT_INTERFACE_PRROT:
2022-01-24 18:51:00 +00:00
m_appearanceAngle -= 0.2f;
2015-08-04 21:28:58 +00:00
break;
case EVENT_INTERFACE_POK:
2022-01-24 18:51:00 +00:00
m_main->GetPlayerProfile()->SaveAppearance();
2015-08-04 21:28:58 +00:00
m_main->ChangePhase(PHASE_MAIN_MENU);
break;
case EVENT_INTERFACE_PCANCEL:
2022-01-24 18:51:00 +00:00
m_main->GetPlayerProfile()->LoadAppearance(); // reload appearance from file
2015-08-04 21:28:58 +00:00
m_main->ChangePhase(PHASE_PLAYER_SELECT);
break;
default:
return true;
}
return false;
}
2022-01-24 18:51:00 +00:00
bool CScreenAppearance::GetGamerOnlyHead()
2015-08-04 21:28:58 +00:00
{
2022-01-24 18:51:00 +00:00
return m_appearanceTab == 0;
2015-08-04 21:28:58 +00:00
}
2022-01-24 18:51:00 +00:00
float CScreenAppearance::GetPersoAngle()
2015-08-04 21:28:58 +00:00
{
2022-01-24 18:51:00 +00:00
return m_appearanceAngle;
2015-08-04 21:28:58 +00:00
}
// Tests whether two colors are equal or nearly are.
static bool EqColor(const Gfx::Color &c1, const Gfx::Color &c2)
2015-08-04 21:28:58 +00:00
{
return (fabs(c1.r-c2.r) < 0.01f &&
fabs(c1.g-c2.g) < 0.01f &&
fabs(c1.b-c2.b) < 0.01f );
}
// Updates all the buttons for the character.
2022-01-24 18:51:00 +00:00
void CScreenAppearance::UpdatePerso()
2015-08-04 21:28:58 +00:00
{
CWindow* pw;
CLabel* pl;
CButton* pb;
CColor* pc;
CSlider* ps;
Gfx::Color color;
std::string name;
int i;
2022-01-24 18:51:00 +00:00
PlayerAppearance& appearance = m_main->GetPlayerProfile()->GetAppearance();
2015-08-04 21:28:58 +00:00
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
2015-08-17 20:40:52 +00:00
if ( pw == nullptr ) return;
2015-08-04 21:28:58 +00:00
pb = static_cast<CButton*>(pw->SearchControl(EVENT_INTERFACE_PHEAD));
2015-08-17 20:40:52 +00:00
if ( pb != nullptr )
2015-08-04 21:28:58 +00:00
{
2022-01-24 18:51:00 +00:00
pb->SetState(STATE_CHECK, m_appearanceTab==0);
2015-08-04 21:28:58 +00:00
}
pb = static_cast<CButton*>(pw->SearchControl(EVENT_INTERFACE_PBODY));
2015-08-17 20:40:52 +00:00
if ( pb != nullptr )
2015-08-04 21:28:58 +00:00
{
2022-01-24 18:51:00 +00:00
pb->SetState(STATE_CHECK, m_appearanceTab==1);
2015-08-04 21:28:58 +00:00
}
pl = static_cast<CLabel*>(pw->SearchControl(EVENT_LABEL11));
2015-08-17 20:40:52 +00:00
if ( pl != nullptr )
2015-08-04 21:28:58 +00:00
{
2022-01-24 18:51:00 +00:00
if ( m_appearanceTab == 0 )
2015-08-04 21:28:58 +00:00
{
pl->SetState(STATE_VISIBLE);
GetResource(RES_TEXT, RT_PERSO_FACE, name);
pl->SetName(name);
}
else
{
pl->ClearState(STATE_VISIBLE);
}
}
pl = static_cast<CLabel*>(pw->SearchControl(EVENT_LABEL12));
2015-08-17 20:40:52 +00:00
if ( pl != nullptr )
2015-08-04 21:28:58 +00:00
{
2022-01-24 18:51:00 +00:00
if ( m_appearanceTab == 0 )
2015-08-04 21:28:58 +00:00
{
pl->SetState(STATE_VISIBLE);
GetResource(RES_TEXT, RT_PERSO_GLASSES, name);
pl->SetName(name);
}
else
{
pl->ClearState(STATE_VISIBLE);
}
}
pl = static_cast<CLabel*>(pw->SearchControl(EVENT_LABEL13));
2015-08-17 20:40:52 +00:00
if ( pl != nullptr )
2015-08-04 21:28:58 +00:00
{
2022-01-24 18:51:00 +00:00
if ( m_appearanceTab == 0 ) GetResource(RES_TEXT, RT_PERSO_HAIR, name);
2015-08-04 21:28:58 +00:00
else GetResource(RES_TEXT, RT_PERSO_BAND, name);
pl->SetName(name);
}
pl = static_cast<CLabel*>(pw->SearchControl(EVENT_LABEL14));
2015-08-17 20:40:52 +00:00
if ( pl != nullptr )
2015-08-04 21:28:58 +00:00
{
2022-01-24 18:51:00 +00:00
if ( m_appearanceTab == 0 )
2015-08-04 21:28:58 +00:00
{
pl->ClearState(STATE_VISIBLE);
}
else
{
pl->SetState(STATE_VISIBLE);
GetResource(RES_TEXT, RT_PERSO_COMBI, name);
pl->SetName(name);
}
}
for ( i=0 ; i<4 ; i++ )
{
pb = static_cast<CButton*>(pw->SearchControl(static_cast<EventType>(EVENT_INTERFACE_PFACE1+i)));
2015-08-17 20:40:52 +00:00
if ( pb == nullptr ) break;
2022-01-24 18:51:00 +00:00
pb->SetState(STATE_VISIBLE, m_appearanceTab==0);
pb->SetState(STATE_CHECK, i==appearance.face);
2015-08-04 21:28:58 +00:00
}
for ( i=0 ; i<10 ; i++ )
{
pb = static_cast<CButton*>(pw->SearchControl(static_cast<EventType>(EVENT_INTERFACE_PGLASS0+i)));
2015-08-17 20:40:52 +00:00
if ( pb == nullptr ) break;
2022-01-24 18:51:00 +00:00
pb->SetState(STATE_VISIBLE, m_appearanceTab==0);
pb->SetState(STATE_CHECK, i==appearance.glasses);
2015-08-04 21:28:58 +00:00
}
for ( i=0 ; i<3*3 ; i++ )
{
pc = static_cast<CColor*>(pw->SearchControl(static_cast<EventType>(EVENT_INTERFACE_PC0a+i)));
2015-08-17 20:40:52 +00:00
if ( pc == nullptr ) break;
2022-01-24 18:51:00 +00:00
if ( m_appearanceTab == 0 )
2015-08-04 21:28:58 +00:00
{
pc->ClearState(STATE_VISIBLE);
}
else
{
pc->SetState(STATE_VISIBLE);
color.r = PERSO_COLOR[3*10*1+3*i+0]/255.0f;
color.g = PERSO_COLOR[3*10*1+3*i+1]/255.0f;
color.b = PERSO_COLOR[3*10*1+3*i+2]/255.0f;
2015-08-04 21:28:58 +00:00
color.a = 0.0f;
pc->SetColor(color);
2022-01-24 18:51:00 +00:00
pc->SetState(STATE_CHECK, EqColor(color, appearance.colorCombi));
2015-08-04 21:28:58 +00:00
}
pc = static_cast<CColor*>(pw->SearchControl(static_cast<EventType>(EVENT_INTERFACE_PC0b+i)));
2015-08-17 20:40:52 +00:00
if ( pc == nullptr ) break;
2022-01-24 18:51:00 +00:00
color.r = PERSO_COLOR[3*10*2*m_appearanceTab+3*i+0]/255.0f;
color.g = PERSO_COLOR[3*10*2*m_appearanceTab+3*i+1]/255.0f;
color.b = PERSO_COLOR[3*10*2*m_appearanceTab+3*i+2]/255.0f;
2015-08-04 21:28:58 +00:00
color.a = 0.0f;
pc->SetColor(color);
2022-01-24 18:51:00 +00:00
pc->SetState(STATE_CHECK, EqColor(color, m_appearanceTab?appearance.colorBand:appearance.colorHair));
2015-08-04 21:28:58 +00:00
}
for ( i=0 ; i<3 ; i++ )
{
ps = static_cast<CSlider*>(pw->SearchControl(static_cast<EventType>(EVENT_INTERFACE_PCRa+i)));
2015-08-17 20:40:52 +00:00
if ( ps == nullptr ) break;
2022-01-24 18:51:00 +00:00
ps->SetState(STATE_VISIBLE, m_appearanceTab==1);
2015-08-04 21:28:58 +00:00
}
2022-01-24 18:51:00 +00:00
if ( m_appearanceTab == 1 )
2015-08-04 21:28:58 +00:00
{
2022-01-24 18:51:00 +00:00
color = appearance.colorCombi;
2015-08-04 21:28:58 +00:00
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_PCRa));
2015-08-17 20:40:52 +00:00
if ( ps != nullptr ) ps->SetVisibleValue(color.r*255.0f);
2015-08-04 21:28:58 +00:00
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_PCGa));
2015-08-17 20:40:52 +00:00
if ( ps != nullptr ) ps->SetVisibleValue(color.g*255.0f);
2015-08-04 21:28:58 +00:00
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_PCBa));
2015-08-17 20:40:52 +00:00
if ( ps != nullptr ) ps->SetVisibleValue(color.b*255.0f);
2015-08-04 21:28:58 +00:00
}
2022-01-24 18:51:00 +00:00
if ( m_appearanceTab == 0 ) color = appearance.colorHair;
else color = appearance.colorBand;
2015-08-04 21:28:58 +00:00
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_PCRb));
2015-08-17 20:40:52 +00:00
if ( ps != nullptr ) ps->SetVisibleValue(color.r*255.0f);
2015-08-04 21:28:58 +00:00
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_PCGb));
2015-08-17 20:40:52 +00:00
if ( ps != nullptr ) ps->SetVisibleValue(color.g*255.0f);
2015-08-04 21:28:58 +00:00
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_PCBb));
2015-08-17 20:40:52 +00:00
if ( ps != nullptr ) ps->SetVisibleValue(color.b*255.0f);
2015-08-04 21:28:58 +00:00
}
// Updates the camera for the character.
2022-01-24 18:51:00 +00:00
void CScreenAppearance::CameraPerso()
2015-08-04 21:28:58 +00:00
{
2022-01-24 18:51:00 +00:00
if ( m_appearanceTab == 0 )
2015-08-04 21:28:58 +00:00
{
SetCamera(0.325f, -0.15f, 5.0f);
2015-08-04 21:28:58 +00:00
}
else
{
SetCamera(0.325f, 0.3f, 18.0f);
2015-08-04 21:28:58 +00:00
}
}
// Sets a fixed color.
2022-01-24 18:51:00 +00:00
void CScreenAppearance::FixPerso(int rank, int index)
2015-08-04 21:28:58 +00:00
{
2022-01-24 18:51:00 +00:00
PlayerAppearance& appearance = m_main->GetPlayerProfile()->GetAppearance();
if ( m_appearanceTab == 0 )
2015-08-04 21:28:58 +00:00
{
if ( index == 1 )
{
2022-01-24 18:51:00 +00:00
appearance.colorHair.r = PERSO_COLOR[3*10*0+rank*3+0]/255.0f;
appearance.colorHair.g = PERSO_COLOR[3*10*0+rank*3+1]/255.0f;
appearance.colorHair.b = PERSO_COLOR[3*10*0+rank*3+2]/255.0f;
2015-08-04 21:28:58 +00:00
}
}
2022-01-24 18:51:00 +00:00
if ( m_appearanceTab == 1 )
2015-08-04 21:28:58 +00:00
{
if ( index == 0 )
{
2022-01-24 18:51:00 +00:00
appearance.colorCombi.r = PERSO_COLOR[3*10*1+rank*3+0]/255.0f;
appearance.colorCombi.g = PERSO_COLOR[3*10*1+rank*3+1]/255.0f;
appearance.colorCombi.b = PERSO_COLOR[3*10*1+rank*3+2]/255.0f;
2015-08-04 21:28:58 +00:00
}
if ( index == 1 )
{
2022-01-24 18:51:00 +00:00
appearance.colorBand.r = PERSO_COLOR[3*10*2+rank*3+0]/255.0f;
appearance.colorBand.g = PERSO_COLOR[3*10*2+rank*3+1]/255.0f;
appearance.colorBand.b = PERSO_COLOR[3*10*2+rank*3+2]/255.0f;
2015-08-04 21:28:58 +00:00
}
}
}
// Updates the color of the character.
2022-01-24 18:51:00 +00:00
void CScreenAppearance::ColorPerso()
2015-08-04 21:28:58 +00:00
{
CWindow* pw;
CSlider* ps;
Gfx::Color color;
2022-01-24 18:51:00 +00:00
PlayerAppearance& appearance = m_main->GetPlayerProfile()->GetAppearance();
2015-08-04 21:28:58 +00:00
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
2015-08-17 20:40:52 +00:00
if ( pw == nullptr ) return;
2015-08-04 21:28:58 +00:00
color.a = 0.0f;
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_PCRa));
2015-08-17 20:40:52 +00:00
if ( ps != nullptr ) color.r = ps->GetVisibleValue()/255.0f;
2015-08-04 21:28:58 +00:00
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_PCGa));
2015-08-17 20:40:52 +00:00
if ( ps != nullptr ) color.g = ps->GetVisibleValue()/255.0f;
2015-08-04 21:28:58 +00:00
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_PCBa));
2015-08-17 20:40:52 +00:00
if ( ps != nullptr ) color.b = ps->GetVisibleValue()/255.0f;
2022-01-24 18:51:00 +00:00
if ( m_appearanceTab == 1 ) appearance.colorCombi = color;
2015-08-04 21:28:58 +00:00
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_PCRb));
2015-08-17 20:40:52 +00:00
if ( ps != nullptr ) color.r = ps->GetVisibleValue()/255.0f;
2015-08-04 21:28:58 +00:00
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_PCGb));
2015-08-17 20:40:52 +00:00
if ( ps != nullptr ) color.g = ps->GetVisibleValue()/255.0f;
2015-08-04 21:28:58 +00:00
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_PCBb));
2015-08-17 20:40:52 +00:00
if ( ps != nullptr ) color.b = ps->GetVisibleValue()/255.0f;
2022-01-24 18:51:00 +00:00
if ( m_appearanceTab == 0 ) appearance.colorHair = color;
else appearance.colorBand = color;
2015-08-04 21:28:58 +00:00
}
2022-01-24 18:51:00 +00:00
void CScreenAppearance::SetCamera(float x, float y, float cameraDistance)
{
Gfx::CCamera* camera = m_main->GetCamera();
Gfx::CEngine* engine = Gfx::CEngine::GetInstancePointer();
camera->SetType(Gfx::CAM_TYPE_SCRIPT);
glm::vec3 p2D(x, y, cameraDistance);
glm::vec3 p3D{};
glm::mat4 matView;
glm::mat4 matProj = engine->GetMatProj();
Math::LoadViewMatrix(matView, glm::vec3(0.0f, 0.0f, -cameraDistance),
glm::vec3(0.0f, 0.0f, 0.0f),
glm::vec3(0.0f, 0.0f, 1.0f));
p2D.x = p2D.x * 2.0f - 1.0f; // [0..1] -> [-1..1]
p2D.y = p2D.y * 2.0f - 1.0f;
p3D.x = p2D.x * p2D.z / matProj[0][0];
p3D.y = p2D.y * p2D.z / matProj[1][1];
p3D.z = p2D.z;
p3D = Math::Transform(glm::inverse(matView), p3D);
p3D = -p3D;
camera->SetScriptCamera(glm::vec3(cameraDistance, p3D.y, p3D.x),
glm::vec3(0.0f, p3D.y, p3D.x));
}
2015-08-04 21:28:58 +00:00
} // namespace Ui