VN Textbox Scroll initial version

This commit is contained in:
2023-05-20 22:13:22 -07:00
parent d3ac3b688b
commit f8ca5f2e17
16 changed files with 347 additions and 72 deletions

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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,

View File

@@ -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;
}

View File

@@ -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> {

View File

@@ -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;

View File

@@ -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> {