TDME2  1.9.200
SceneWriter.cpp
Go to the documentation of this file.
2 
3 #include <iomanip>
4 #include <iostream>
5 #include <sstream>
6 #include <string>
7 
8 #include <tdme/tdme.h>
10 #include <tdme/engine/Color4.h>
19 #include <tdme/engine/Engine.h>
21 #include <tdme/engine/Rotation.h>
22 #include <tdme/engine/Transform.h>
23 #include <tdme/math/Vector3.h>
24 #include <tdme/math/Vector4.h>
27 
28 #include <ext/rapidjson/document.h>
29 #include <ext/rapidjson/stringbuffer.h>
30 #include <ext/rapidjson/writer.h>
31 
32 using std::string;
33 
53 
54 using rapidjson::Document;
55 using rapidjson::StringBuffer;
56 using rapidjson::Value;
57 using rapidjson::Writer;
58 
59 void SceneWriter::write(const string& pathName, const string& fileName, Scene* scene)
60 {
61  scene->setFileName((pathName.empty() == false?pathName + "/":"") + fileName);
62  auto sceneLibrary = scene->getLibrary();
63  Document jDocument;
64  jDocument.SetObject();
65  auto& jAllocator = jDocument.GetAllocator();
66  jDocument.AddMember("version", Value("1.99", jAllocator), jAllocator);
67  jDocument.AddMember("ro", Value(scene->getRotationOrder()->getName(), jAllocator), jAllocator);
68  // lights
69  {
70  Value jLights;
71  jLights.SetArray();
72  auto i = 0;
73  for (auto light: scene->getLights()) {
74  Value jLight;
75  jLight.SetObject();
76  jLight.AddMember("id", Value(i), jAllocator);
77  jLight.AddMember("ar", Value(light->getAmbient().getRed()), jAllocator);
78  jLight.AddMember("ag", Value(light->getAmbient().getGreen()), jAllocator);
79  jLight.AddMember("ab", Value(light->getAmbient().getBlue()), jAllocator);
80  jLight.AddMember("aa", Value(light->getAmbient().getAlpha()), jAllocator);
81  jLight.AddMember("dr", Value(light->getDiffuse().getRed()), jAllocator);
82  jLight.AddMember("dg", Value(light->getDiffuse().getGreen()), jAllocator);
83  jLight.AddMember("db", Value(light->getDiffuse().getBlue()), jAllocator);
84  jLight.AddMember("da", Value(light->getDiffuse().getAlpha()), jAllocator);
85  jLight.AddMember("sr", Value(light->getSpecular().getRed()), jAllocator);
86  jLight.AddMember("sg", Value(light->getSpecular().getGreen()), jAllocator);
87  jLight.AddMember("sb", Value(light->getSpecular().getBlue()), jAllocator);
88  jLight.AddMember("sa", Value(light->getSpecular().getAlpha()), jAllocator);
89  jLight.AddMember("px", Value(light->getPosition().getX()), jAllocator);
90  jLight.AddMember("py", Value(light->getPosition().getY()), jAllocator);
91  jLight.AddMember("pz", Value(light->getPosition().getZ()), jAllocator);
92  jLight.AddMember("pw", Value(light->getPosition().getW()), jAllocator);
93  jLight.AddMember("sdx", Value(light->getSpotDirection().getX()), jAllocator);
94  jLight.AddMember("sdy", Value(light->getSpotDirection().getY()), jAllocator);
95  jLight.AddMember("sdz", Value(light->getSpotDirection().getZ()), jAllocator);
96  jLight.AddMember("se", Value(light->getSpotExponent()), jAllocator);
97  jLight.AddMember("sco", Value(light->getSpotCutOff()), jAllocator);
98  jLight.AddMember("ca", Value(light->getConstantAttenuation()), jAllocator);
99  jLight.AddMember("la", Value(light->getLinearAttenuation()), jAllocator);
100  jLight.AddMember("qa", Value(light->getQuadraticAttenuation()), jAllocator);
101  jLight.AddMember("e", Value(light->isEnabled()), jAllocator);
102  jLights.PushBack(jLight, jAllocator);
103  i++;
104  }
105  jDocument.AddMember("lights", jLights, jAllocator);
106  }
107  // scene library
108  {
109  Value jSceneLibrary;
110  jSceneLibrary.SetArray();
111  for (auto prototype: sceneLibrary->getPrototypes()) {
112  Value jPrototype;
113  jPrototype.SetObject();
114  if (prototype->isEmbedded() == true) {
115  Value jEmbeddedPrototype;
116  jEmbeddedPrototype.SetObject();
117  PrototypeWriter::write(
118  jDocument,
119  jEmbeddedPrototype,
120  prototype
121  );
122  jPrototype.AddMember("type", Value(prototype->getType()->getName(), jAllocator), jAllocator);
123  jPrototype.AddMember("entity", jEmbeddedPrototype, jAllocator);
124  }
125  jPrototype.AddMember("id", Value().SetInt(prototype->getId()), jAllocator);
126  jPrototype.AddMember("e", Value(prototype->isEmbedded()), jAllocator);
127  jPrototype.AddMember("pf", Value(prototype->getFileName(), jAllocator), jAllocator);
128  jSceneLibrary.PushBack(jPrototype, jAllocator);
129  }
130  jDocument.AddMember("models", jSceneLibrary, jAllocator);
131  }
132  // scene properties
133  {
134  Value jSceneProperties;
135  jSceneProperties.SetArray();
136  for (auto i = 0; i < scene->getPropertyCount(); i++) {
137  auto sceneProperty = scene->getPropertyAt(i);
138  Value jSceneProperty;
139  jSceneProperty.SetObject();
140  jSceneProperty.AddMember("name", Value(sceneProperty->getName(), jAllocator), jAllocator);
141  jSceneProperty.AddMember("value", Value(sceneProperty->getValue(), jAllocator), jAllocator);
142  jSceneProperties.PushBack(jSceneProperty, jAllocator);
143  }
144  jDocument.AddMember("properties", jSceneProperties, jAllocator);
145  }
146  // entities
147  {
148  Value jEntities;
149  jEntities.SetArray();
150  for (auto sceneEntity: scene->getEntities()) {
151  Value jEntity;
152  jEntity.SetObject();
153  const auto& transform = sceneEntity->getTransform();
154  const auto& translation = transform.getTranslation();
155  const auto& scale = transform.getScale();
156  const auto& rotationAroundXAxis = transform.getRotation(scene->getRotationOrder()->getAxisXIndex());
157  const auto& rotationAroundYAxis = transform.getRotation(scene->getRotationOrder()->getAxisYIndex());
158  const auto& rotationAroundZAxis = transform.getRotation(scene->getRotationOrder()->getAxisZIndex());
159  jEntity.AddMember("id", Value(sceneEntity->getId(), jAllocator), jAllocator);
160  jEntity.AddMember("descr", Value(sceneEntity->getDescription(), jAllocator), jAllocator);;
161  jEntity.AddMember("mid", Value(sceneEntity->getPrototype()->getId()), jAllocator);
162  jEntity.AddMember("tx", Value(translation.getX()), jAllocator);
163  jEntity.AddMember("ty", Value(translation.getY()), jAllocator);
164  jEntity.AddMember("tz", Value(translation.getZ()), jAllocator);
165  jEntity.AddMember("sx", Value(scale.getX()), jAllocator);
166  jEntity.AddMember("sy", Value(scale.getY()), jAllocator);
167  jEntity.AddMember("sz", Value(scale.getZ()), jAllocator);
168  jEntity.AddMember("rx", Value(rotationAroundXAxis.getAngle()), jAllocator);
169  jEntity.AddMember("ry", Value(rotationAroundYAxis.getAngle()), jAllocator);
170  jEntity.AddMember("rz", Value(rotationAroundZAxis.getAngle()), jAllocator);
171  jEntity.AddMember("r", Value(sceneEntity->getReflectionEnvironmentMappingId(), jAllocator), jAllocator);
172  Value jEntityProperties;
173  jEntityProperties.SetArray();
174  for (auto sceneEntityProperty: sceneEntity->getProperties()) {
175  Value jSceneEntityProperty;
176  jSceneEntityProperty.SetObject();
177  jSceneEntityProperty.AddMember("name", Value(sceneEntityProperty->getName(), jAllocator), jAllocator);
178  jSceneEntityProperty.AddMember("value", Value(sceneEntityProperty->getValue(), jAllocator), jAllocator);
179  jEntityProperties.PushBack(jSceneEntityProperty, jAllocator);
180  }
181  jEntity.AddMember("properties", jEntityProperties, jAllocator);
182  jEntities.PushBack(jEntity, jAllocator);
183  }
184  jDocument.AddMember("objects", jEntities, jAllocator);
185  jDocument.AddMember("objects_eidx", Value(scene->getEntityIdx()), jAllocator);
186  }
187  // sky shader parameters
188  {
189  const auto& skyShaderParameters = scene->getSkyShaderParameters();
190  Value jSkyShaderParameters;
191  jSkyShaderParameters.SetObject();
192  for (const auto& shaderParameterName: Engine::getShaderParameterNames("sky")) {
193  jSkyShaderParameters.AddMember(
194  Value(shaderParameterName, jAllocator),
195  Value(skyShaderParameters.getShaderParameter(shaderParameterName).getValueAsString(), jAllocator),
196  jAllocator
197  );
198  }
199  jDocument.AddMember("skyshader", jSkyShaderParameters, jAllocator);
200  }
201  // post processing shaders
202  {
203  const auto& postProcessingShaderParameters = scene->getEnabledPostProcessingShader();
204  //
205  Value jEnabledPostProcessingShaders;
206  jEnabledPostProcessingShaders.SetArray();
207  for (const auto& shaderId: Engine::getRegisteredShader(Engine::SHADERTYPE_POSTPROCESSING, false)) {
208  if (scene->isPostProcessingShaderEnabled(shaderId) == false) continue;
209  jEnabledPostProcessingShaders.PushBack(Value(shaderId, jAllocator), jAllocator);
210  }
211  //
212  Value jAllPostProcessingShaderParameters;
213  jAllPostProcessingShaderParameters.SetObject();
214  for (const auto& shaderId: Engine::getRegisteredShader(Engine::SHADERTYPE_POSTPROCESSING, false)) {
215  //
216  const auto& shaderParameters = scene->getPostProcessingShaderParameters(shaderId);
217  if (shaderParameters == nullptr) continue;
218  //
219  Value jShaderParameters;
220  jShaderParameters.SetObject();
221  for (const auto& shaderParameterName: Engine::getShaderParameterNames(shaderId)) {
222  jShaderParameters.AddMember(
223  Value(shaderParameterName, jAllocator),
224  Value(shaderParameters->getShaderParameter(shaderParameterName).getValueAsString(), jAllocator),
225  jAllocator
226  );
227  }
228  //
229  jAllPostProcessingShaderParameters.AddMember(
230  Value(shaderId, jAllocator),
231  jShaderParameters,
232  jAllocator
233  );
234  }
235  //
236  Value jPostProcessingShaderParameters;
237  jPostProcessingShaderParameters.SetObject();
238  jPostProcessingShaderParameters.AddMember(
239  Value("enabled", jAllocator),
240  jEnabledPostProcessingShaders,
241  jAllocator
242  );
243  jPostProcessingShaderParameters.AddMember(
244  Value("parameters", jAllocator),
245  jAllPostProcessingShaderParameters,
246  jAllocator
247  );
248  //
249  jDocument.AddMember("postprocessingshaders", jPostProcessingShaderParameters, jAllocator);
250  }
251  //
252  jDocument.AddMember("gui", Value(scene->getGUIFileName(), jAllocator), jAllocator);
253 
254  //
255  StringBuffer strbuf;
256  Writer<StringBuffer> writer(strbuf);
257  jDocument.Accept(writer);
258 
259  //
260  FileSystem::getInstance()->setContentFromString(pathName, fileName, strbuf.GetString());
261 }
Color 4 definition class.
Definition: Color4.h:18
Engine main class.
Definition: Engine.h:131
static const vector< string > getRegisteredShader(ShaderType type, bool sort=true)
Returns registered shaders for given type.
Definition: Engine.h:837
static const vector< string > getShaderParameterNames(const string &shaderId)
Returns shader parameter names of shader with given id.
Definition: Engine.h:896
TDME2 engine entity shader parameters.
Rotation representation.
Definition: Rotation.h:18
Transform which contain scale, rotations and translation.
Definition: Transform.h:29
Represents rotation orders of a model.
Definition: RotationOrder.h:23
const BaseProperty * getPropertyAt(int idx) const
Get property by index.
Base property model class.
Definition: BaseProperty.h:15
Prototype definition.
Definition: Prototype.h:55
Scene entity definition.
Definition: SceneEntity.h:23
Scene prototype library definition.
Definition: SceneLibrary.h:32
Scene light definition.
Definition: SceneLight.h:20
Scene definition.
Definition: Scene.h:50
void setFileName(const string &fileName)
Set up scene file name including relative path.
Definition: Scene.h:119
RotationOrder * getRotationOrder()
Definition: Scene.h:126
bool isPostProcessingShaderEnabled(const string &shaderId)
Is post processing shader enabled.
Definition: Scene.h:345
UniquePtrSequenceIterator< SceneLight > getLights()
Definition: Scene.h:141
const EntityShaderParameters & getSkyShaderParameters()
Get sky shader parameters.
Definition: Scene.h:320
UniquePtrSequenceIterator< SceneEntity > getEntities()
Definition: Scene.h:267
const string & getGUIFileName()
Definition: Scene.h:387
SceneLibrary * getLibrary()
Definition: Scene.h:185
unordered_set< string > getEnabledPostProcessingShader()
Return enabled processing shader.
Definition: Scene.h:336
const EntityShaderParameters * getPostProcessingShaderParameters(const string &shaderId)
Get post processing shader parameters.
Definition: Scene.h:370
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
Vector4 class representing vector4 mathematical structure and operations with x, y,...
Definition: Vector4.h:22
File system singleton class.
Definition: FileSystem.h:17
const string & getName() const
Definition: Enum.h:37