summaryrefslogtreecommitdiff
path: root/ZAPD/ZRoom/Commands/SetLightingSettings.cpp
blob: 08cd83d14102309b232d3545d22b9db37d3e3ac0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "SetLightingSettings.h"

#include "Globals.h"
#include "Utils/BitConverter.h"
#include "Utils/StringHelper.h"
#include "ZFile.h"
#include "ZRoom/ZRoom.h"

SetLightingSettings::SetLightingSettings(ZFile* nParent) : ZRoomCommand(nParent)
{
}

void SetLightingSettings::ParseRawData()
{
	ZRoomCommand::ParseRawData();
	uint8_t numLights = cmdArg1;

	for (int i = 0; i < numLights; i++)
		settings.push_back(LightingSettings(parent->GetRawData(), segmentOffset + (i * 22)));
}

void SetLightingSettings::DeclareReferences(const std::string& prefix)
{
	if (settings.size() > 0)
	{
		std::string declaration;

		for (size_t i = 0; i < settings.size(); i++)
		{
			declaration +=
				StringHelper::Sprintf("\t{ %s },", settings.at(i).GetBodySourceCode().c_str());
			if (i + 1 < settings.size())
				declaration += "\n";
		}

		parent->AddDeclarationArray(
			segmentOffset, DeclarationAlignment::Align4,
			settings.size() * settings.front().GetRawDataSize(), "LightSettings",
			StringHelper::Sprintf("%sLightSettings0x%06X", prefix.c_str(), segmentOffset),
			settings.size(), declaration);
	}
}

std::string SetLightingSettings::GetBodySourceCode() const
{
	std::string listName;
	Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "LightSettings", listName);
	return StringHelper::Sprintf("SCENE_CMD_ENV_LIGHT_SETTINGS(%i, %s)", settings.size(),
	                             listName.c_str());
}

std::string SetLightingSettings::GetCommandCName() const
{
	return "SCmdLightSettingList";
}

RoomCommand SetLightingSettings::GetRoomCommand() const
{
	return RoomCommand::SetLightingSettings;
}

LightingSettings::LightingSettings(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex)
{
	ambientClrR = rawData.at(rawDataIndex + 0);
	ambientClrG = rawData.at(rawDataIndex + 1);
	ambientClrB = rawData.at(rawDataIndex + 2);

	diffuseClrA_R = rawData.at(rawDataIndex + 3);
	diffuseClrA_G = rawData.at(rawDataIndex + 4);
	diffuseClrA_B = rawData.at(rawDataIndex + 5);

	diffuseDirA_X = rawData.at(rawDataIndex + 6);
	diffuseDirA_Y = rawData.at(rawDataIndex + 7);
	diffuseDirA_Z = rawData.at(rawDataIndex + 8);

	diffuseClrB_R = rawData.at(rawDataIndex + 9);
	diffuseClrB_G = rawData.at(rawDataIndex + 10);
	diffuseClrB_B = rawData.at(rawDataIndex + 11);

	diffuseDirB_X = rawData.at(rawDataIndex + 12);
	diffuseDirB_Y = rawData.at(rawDataIndex + 13);
	diffuseDirB_Z = rawData.at(rawDataIndex + 14);

	fogClrR = rawData.at(rawDataIndex + 15);
	fogClrG = rawData.at(rawDataIndex + 16);
	fogClrB = rawData.at(rawDataIndex + 17);

	unk = BitConverter::ToInt16BE(rawData, rawDataIndex + 18);
	drawDistance = BitConverter::ToInt16BE(rawData, rawDataIndex + 20);
}

std::string LightingSettings::GetBodySourceCode() const
{
	return StringHelper::Sprintf(
		"0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, "
		"0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%04X, 0x%04X",
		ambientClrR, ambientClrG, ambientClrB, diffuseClrA_R, diffuseClrA_G, diffuseClrA_B,
		diffuseDirA_X, diffuseDirA_Y, diffuseDirA_Z, diffuseClrB_R, diffuseClrB_G, diffuseClrB_B,
		diffuseDirB_X, diffuseDirB_Y, diffuseDirB_Z, fogClrR, fogClrG, fogClrB, unk, drawDistance);
}

size_t LightingSettings::GetRawDataSize() const
{
	return 0x16;
}