VN Textbox Scroll initial version
This commit is contained in:
@@ -13,6 +13,8 @@ void SceneGenerator::generate(
|
||||
struct MethodGenInfo &methodAssets,
|
||||
struct MethodGenInfo &methodInit
|
||||
) {
|
||||
assertNotNull(scene);
|
||||
|
||||
classInfo.clazz = scene->name;
|
||||
classInfo.constructorArgs = "DawnGame *game";
|
||||
classInfo.extendArgs = "game";
|
||||
@@ -54,10 +56,12 @@ void SceneGenerator::generate(
|
||||
int32_t childNumber = 0;
|
||||
int32_t componentNumber = 0;
|
||||
std::map<std::string, std::string> assetMap;
|
||||
std::vector<struct SceneItemComponent> componentsUnused;
|
||||
|
||||
auto sceneItems = scene->items.begin();
|
||||
while(sceneItems != scene->items.end()) {
|
||||
SceneItemGenerator::generate(
|
||||
auto itDeps = scene->dependencies.begin();
|
||||
while(itDeps != scene->dependencies.end()) {
|
||||
auto dep = *itDeps;
|
||||
SceneItemGenerator::generateDependency(
|
||||
assetNumber,
|
||||
componentNumber,
|
||||
childNumber,
|
||||
@@ -68,24 +72,15 @@ void SceneGenerator::generate(
|
||||
&methodAssets.body,
|
||||
"",
|
||||
"this",
|
||||
&(*sceneItems),
|
||||
""
|
||||
componentsUnused,
|
||||
scene->items,
|
||||
scene->code,
|
||||
dep
|
||||
);
|
||||
++sceneItems;
|
||||
++itDeps;
|
||||
}
|
||||
|
||||
|
||||
// Seal methods
|
||||
line(&methodAssets.body, "return assets;", "");
|
||||
|
||||
// Code
|
||||
auto itCode = scene->code.begin();
|
||||
while(itCode != scene->code.end()) {
|
||||
SceneCodeGenerator::generate(
|
||||
&classInfo.publicProperties,
|
||||
&methodInit.body,
|
||||
&(*itCode),
|
||||
""
|
||||
);
|
||||
++itCode;
|
||||
}
|
||||
}
|
@@ -7,6 +7,76 @@
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
void SceneItemGenerator::generateDependency(
|
||||
int32_t &assetNumber,
|
||||
int32_t &componentNumber,
|
||||
int32_t &childNumber,
|
||||
std::map<std::string, std::string> &assetMap,
|
||||
std::vector<std::string> &includes,
|
||||
std::vector<std::string> *publicProperties,
|
||||
std::vector<std::string> *initBody,
|
||||
std::vector<std::string> *assetBody,
|
||||
std::string name,
|
||||
std::string sceneRef,
|
||||
std::vector<struct SceneItemComponent> &components,
|
||||
std::vector<struct SceneItem> &children,
|
||||
std::vector<struct SceneCode> &code,
|
||||
struct SceneItemDependency dep
|
||||
) {
|
||||
switch(dep.type) {
|
||||
case SCENE_ITEM_DEPENDENCY_TYPE_CODE: {
|
||||
auto i = &code[dep.position];
|
||||
SceneCodeGenerator::generate(
|
||||
publicProperties,
|
||||
initBody,
|
||||
i,
|
||||
""
|
||||
);
|
||||
line(initBody, "", "");
|
||||
break;
|
||||
}
|
||||
|
||||
case SCENE_ITEM_DEPENDENCY_TYPE_COMPONENT: {
|
||||
auto i = &components[dep.position];
|
||||
SceneItemComponentGenerator::generate(
|
||||
assetMap,
|
||||
componentNumber,
|
||||
includes,
|
||||
name,
|
||||
publicProperties,
|
||||
initBody,
|
||||
i,
|
||||
""
|
||||
);
|
||||
line(initBody, "", "");
|
||||
break;
|
||||
}
|
||||
|
||||
case SCENE_ITEM_DEPENDENCY_TYPE_ITEM: {
|
||||
auto i = &children[dep.position];
|
||||
SceneItemGenerator::generate(
|
||||
assetNumber,
|
||||
componentNumber,
|
||||
childNumber,
|
||||
assetMap,
|
||||
includes,
|
||||
publicProperties,
|
||||
initBody,
|
||||
assetBody,
|
||||
name,
|
||||
sceneRef,
|
||||
i,
|
||||
""
|
||||
);
|
||||
line(initBody, "", "");
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
assertUnreachable();
|
||||
}
|
||||
}
|
||||
|
||||
void SceneItemGenerator::generate(
|
||||
int32_t &assetNumber,
|
||||
int32_t &componentNumber,
|
||||
@@ -21,6 +91,11 @@ void SceneItemGenerator::generate(
|
||||
struct SceneItem *item,
|
||||
std::string tabs
|
||||
) {
|
||||
assertNotNull(publicProperties);
|
||||
assertNotNull(initBody);
|
||||
assertNotNull(assetBody);
|
||||
assertNotNull(item);
|
||||
|
||||
// Determine interface
|
||||
std::string name = "itm" + std::to_string(childNumber++);
|
||||
std::string itemType = "SceneItem";
|
||||
@@ -82,26 +157,11 @@ void SceneItemGenerator::generate(
|
||||
++itAssets;
|
||||
}
|
||||
|
||||
// Add components for children
|
||||
auto itComponents = item->components.begin();
|
||||
while(itComponents != item->components.end()) {
|
||||
SceneItemComponentGenerator::generate(
|
||||
assetMap,
|
||||
componentNumber,
|
||||
includes,
|
||||
name,
|
||||
publicProperties,
|
||||
initBody,
|
||||
&(*itComponents),
|
||||
""
|
||||
);
|
||||
++itComponents;
|
||||
}
|
||||
|
||||
// Process sub children
|
||||
auto itChildren = item->children.begin();
|
||||
while(itChildren != item->children.end()) {
|
||||
SceneItemGenerator::generate(
|
||||
// Add the dependencies
|
||||
auto itDeps = item->dependencies.begin();
|
||||
while(itDeps != item->dependencies.end()) {
|
||||
auto dep = *itDeps;
|
||||
SceneItemGenerator::generateDependency(
|
||||
assetNumber,
|
||||
componentNumber,
|
||||
childNumber,
|
||||
@@ -112,26 +172,16 @@ void SceneItemGenerator::generate(
|
||||
assetBody,
|
||||
name,
|
||||
sceneRef,
|
||||
&(*itChildren),
|
||||
""
|
||||
item->components,
|
||||
item->children,
|
||||
item->code,
|
||||
dep
|
||||
);
|
||||
++itChildren;
|
||||
++itDeps;
|
||||
}
|
||||
|
||||
// Set parent
|
||||
if(!parentRef.empty()) {
|
||||
line(initBody, name + "->transform.setParent(&"+parentRef+"->transform);", "");
|
||||
}
|
||||
|
||||
// Code
|
||||
auto itCode = item->code.begin();
|
||||
while(itCode != item->code.end()) {
|
||||
SceneCodeGenerator::generate(
|
||||
publicProperties,
|
||||
initBody,
|
||||
&(*itCode),
|
||||
""
|
||||
);
|
||||
++itCode;
|
||||
}
|
||||
}
|
@@ -12,6 +12,23 @@
|
||||
namespace Dawn {
|
||||
class SceneItemGenerator : public CodeGen {
|
||||
public:
|
||||
static void generateDependency(
|
||||
int32_t &assetNumber,
|
||||
int32_t &componentNumber,
|
||||
int32_t &childNumber,
|
||||
std::map<std::string, std::string> &assetMap,
|
||||
std::vector<std::string> &includes,
|
||||
std::vector<std::string> *publicProperties,
|
||||
std::vector<std::string> *initBody,
|
||||
std::vector<std::string> *assetBody,
|
||||
std::string name,
|
||||
std::string sceneRef,
|
||||
std::vector<struct SceneItemComponent> &components,
|
||||
std::vector<struct SceneItem> &children,
|
||||
std::vector<struct SceneCode> &code,
|
||||
struct SceneItemDependency dep
|
||||
);
|
||||
|
||||
static void generate(
|
||||
int32_t &assetNumber,
|
||||
int32_t &componentNumber,
|
||||
|
@@ -54,6 +54,8 @@ int32_t SceneItemParser::onParse(
|
||||
|
||||
out->prefab = values["prefab"];
|
||||
|
||||
struct SceneItemDependency dep;
|
||||
|
||||
auto itChildren = node->children.begin();
|
||||
while(itChildren != node->children.end()) {
|
||||
// Parse child nodes, they may be components or not
|
||||
@@ -65,6 +67,12 @@ int32_t SceneItemParser::onParse(
|
||||
auto ret = (SceneItemParser()).parse(c, &child, error);
|
||||
if(ret != 0) return ret;
|
||||
out->children.push_back(child);
|
||||
|
||||
// Add a dependency. This solves the reference order problem.
|
||||
struct SceneItemDependency dep;
|
||||
dep.type = SCENE_ITEM_DEPENDENCY_TYPE_ITEM;
|
||||
dep.position = out->children.size() - 1;
|
||||
out->dependencies.push_back(dep);
|
||||
|
||||
} else if(c->node == "asset") {
|
||||
struct SceneAsset asset;
|
||||
@@ -77,6 +85,11 @@ int32_t SceneItemParser::onParse(
|
||||
auto ret = (SceneCodeParser()).parse(c, &code, error);
|
||||
if(ret != 0) return ret;
|
||||
out->code.push_back(code);
|
||||
|
||||
// Add Dep
|
||||
dep.type = SCENE_ITEM_DEPENDENCY_TYPE_CODE;
|
||||
dep.position = out->code.size() - 1;
|
||||
out->dependencies.push_back(dep);
|
||||
|
||||
} else {
|
||||
struct SceneItemComponent component;
|
||||
@@ -84,6 +97,12 @@ int32_t SceneItemParser::onParse(
|
||||
auto ret = (SceneItemComponentParser()).parse(c, &component, error);
|
||||
if(ret != 0) return ret;
|
||||
out->components.push_back(component);
|
||||
|
||||
// Add dep
|
||||
struct SceneItemDependency dep;
|
||||
dep.type = SCENE_ITEM_DEPENDENCY_TYPE_COMPONENT;
|
||||
dep.position = out->components.size() - 1;
|
||||
out->dependencies.push_back(dep);
|
||||
}
|
||||
++itChildren;
|
||||
}
|
||||
|
@@ -9,6 +9,17 @@
|
||||
#include "util/parser/SceneCodeParser.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
enum SceneItemDependencyType {
|
||||
SCENE_ITEM_DEPENDENCY_TYPE_ITEM,
|
||||
SCENE_ITEM_DEPENDENCY_TYPE_COMPONENT,
|
||||
SCENE_ITEM_DEPENDENCY_TYPE_CODE,
|
||||
};
|
||||
|
||||
struct SceneItemDependency {
|
||||
enum SceneItemDependencyType type;
|
||||
size_t position;
|
||||
};
|
||||
|
||||
struct SceneItem {
|
||||
struct SceneItemComponentRegistry *registry;
|
||||
std::string ref;
|
||||
@@ -21,6 +32,7 @@ namespace Dawn {
|
||||
std::vector<struct SceneItem> children;
|
||||
std::vector<struct SceneAsset> assets;
|
||||
std::vector<struct SceneCode> code;
|
||||
std::vector<struct SceneItemDependency> dependencies;
|
||||
};
|
||||
|
||||
class SceneItemParser : public XmlParser<struct SceneItem> {
|
||||
|
@@ -29,6 +29,8 @@ int32_t SceneParser::onParse(
|
||||
out->name = values["name"];
|
||||
out->extend = values["extend"];
|
||||
|
||||
struct SceneItemDependency dep;
|
||||
|
||||
//Parse the children
|
||||
auto itChildren = node->children.begin();
|
||||
while(itChildren != node->children.end()) {
|
||||
@@ -40,12 +42,22 @@ int32_t SceneParser::onParse(
|
||||
ret = (SceneItemParser()).parse(child, &item, error);
|
||||
if(ret != 0) return 1;
|
||||
out->items.push_back(item);
|
||||
|
||||
//Add the dependency
|
||||
dep.type = SCENE_ITEM_DEPENDENCY_TYPE_ITEM;
|
||||
dep.position = out->items.size() - 1;
|
||||
out->dependencies.push_back(dep);
|
||||
|
||||
} else if(child->node == "code") {
|
||||
struct SceneCode code;
|
||||
ret = (SceneCodeParser()).parse(child, &code, error);
|
||||
if(ret != 0) return ret;
|
||||
out->code.push_back(code);
|
||||
|
||||
//Add the dependency
|
||||
dep.type = SCENE_ITEM_DEPENDENCY_TYPE_CODE;
|
||||
dep.position = out->code.size() - 1;
|
||||
out->dependencies.push_back(dep);
|
||||
}
|
||||
|
||||
++itChildren;
|
||||
|
@@ -14,6 +14,7 @@ namespace Dawn {
|
||||
std::vector<struct SceneItem> items;
|
||||
std::vector<struct SceneCode> code;
|
||||
struct SceneItemComponentRegistry *registry;
|
||||
std::vector<struct SceneItemDependency> dependencies;
|
||||
};
|
||||
|
||||
class SceneParser : public XmlParser<struct Scene> {
|
||||
|
Reference in New Issue
Block a user