gui: more xml and lua support
This commit is contained in:
@@ -1,10 +1,26 @@
|
|||||||
<inventory color="#1F1F1FE0" size="0,400">
|
<inventory color="#1F1F1FE0" size="0,600">
|
||||||
<slots-grid rows="4" count="40" sharefunc="inventory_share_func"/>
|
<slots-grid rows="4" count="40" sharefunc="inventory_share_func"/>
|
||||||
<button id="btn"
|
<panel coord="10,230" padding="4,4,4,4" size="300,100">
|
||||||
coord="8,300"
|
<label>fps: 62 / 59</label>
|
||||||
size="140,30"
|
<label>meshes: 4143</label>
|
||||||
z-index="1"
|
<label>frustum-culling: on</label>
|
||||||
onclick="document.btn.text = tostring(time.uptime())">
|
<label>chunks: 3206 visible: 1153</label>
|
||||||
-----
|
<label>block: 0 0 (core:air)</label>
|
||||||
</button>
|
<label>seed: 42</label>
|
||||||
|
<container size="200,30">
|
||||||
|
<label size="100,30">x:</label>
|
||||||
|
<textbox coord="40,0">4321.40</textbox>
|
||||||
|
</container>
|
||||||
|
<container size="200,30">
|
||||||
|
<label size="100,30">y:</label>
|
||||||
|
<textbox coord="40,0">120.0</textbox>
|
||||||
|
</container>
|
||||||
|
<container size="200,30">
|
||||||
|
<label size="100,30">z:</label>
|
||||||
|
<textbox coord="40,0">-424.10</textbox>
|
||||||
|
</container>
|
||||||
|
<label>time: 19:50</label>
|
||||||
|
<trackbar min="0.0" max="1.0" step="0.005f" track-width="8" consumer="time_change"/>
|
||||||
|
<trackbar min="0.0" max="1.0" step="0.005f" value="0.5" track-width="8"/>
|
||||||
|
</panel>
|
||||||
</inventory>
|
</inventory>
|
||||||
|
|||||||
@@ -9,3 +9,7 @@ end
|
|||||||
function inventory_share_func(invid, slotid)
|
function inventory_share_func(invid, slotid)
|
||||||
inventory.set(invid, slotid, 0, 0)
|
inventory.set(invid, slotid, 0, 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function time_change(x)
|
||||||
|
world.set_day_time(x)
|
||||||
|
end
|
||||||
|
|||||||
@@ -8,5 +8,7 @@ using runnable = std::function<void()>;
|
|||||||
using stringconsumer = std::function<void(const std::string&)>;
|
using stringconsumer = std::function<void(const std::string&)>;
|
||||||
using wstringsupplier = std::function<std::wstring()>;
|
using wstringsupplier = std::function<std::wstring()>;
|
||||||
using wstringconsumer = std::function<void(const std::wstring&)>;
|
using wstringconsumer = std::function<void(const std::wstring&)>;
|
||||||
|
using doublesupplier = std::function<double()>;
|
||||||
|
using doubleconsumer = std::function<void(double)>;
|
||||||
|
|
||||||
#endif // DELEGATES_H_
|
#endif // DELEGATES_H_
|
||||||
|
|||||||
@@ -208,6 +208,10 @@ void Engine::loadAllPacks() {
|
|||||||
ContentPack::scan(paths, contentPacks);
|
ContentPack::scan(paths, contentPacks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double Engine::getDelta() const {
|
||||||
|
return delta;
|
||||||
|
}
|
||||||
|
|
||||||
void Engine::setScreen(std::shared_ptr<Screen> screen) {
|
void Engine::setScreen(std::shared_ptr<Screen> screen) {
|
||||||
this->screen = screen;
|
this->screen = screen;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ public:
|
|||||||
void loadContent();
|
void loadContent();
|
||||||
void loadWorldContent(const fs::path& folder);
|
void loadWorldContent(const fs::path& folder);
|
||||||
void loadAllPacks();
|
void loadAllPacks();
|
||||||
|
double getDelta() const;
|
||||||
|
|
||||||
std::shared_ptr<Screen> getScreen();
|
std::shared_ptr<Screen> getScreen();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -17,9 +17,6 @@ class Batch2D;
|
|||||||
class Assets;
|
class Assets;
|
||||||
|
|
||||||
namespace gui {
|
namespace gui {
|
||||||
using doublesupplier = std::function<double()>;
|
|
||||||
using doubleconsumer = std::function<void(double)>;
|
|
||||||
|
|
||||||
using boolsupplier = std::function<bool()>;
|
using boolsupplier = std::function<bool()>;
|
||||||
using boolconsumer = std::function<void(bool)>;
|
using boolconsumer = std::function<void(bool)>;
|
||||||
|
|
||||||
|
|||||||
@@ -124,6 +124,13 @@ static std::shared_ptr<UINode> readContainer(UiXmlReader& reader, xml::xmlelemen
|
|||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::shared_ptr<UINode> readPanel(UiXmlReader& reader, xml::xmlelement element) {
|
||||||
|
float interval = element->attr("interval", "2").asFloat();
|
||||||
|
auto panel = std::make_shared<Panel>(glm::vec2(), glm::vec4(), interval);
|
||||||
|
_readPanel(reader, element, *panel);
|
||||||
|
return panel;
|
||||||
|
}
|
||||||
|
|
||||||
static std::shared_ptr<UINode> readButton(UiXmlReader& reader, xml::xmlelement element) {
|
static std::shared_ptr<UINode> readButton(UiXmlReader& reader, xml::xmlelement element) {
|
||||||
std::wstring text = readAndProcessInnerText(element);
|
std::wstring text = readAndProcessInnerText(element);
|
||||||
auto button = std::make_shared<Button>(text, glm::vec4(0.0f), nullptr);
|
auto button = std::make_shared<Button>(text, glm::vec4(0.0f), nullptr);
|
||||||
@@ -156,7 +163,7 @@ static std::shared_ptr<UINode> readTextBox(UiXmlReader& reader, xml::xmlelement
|
|||||||
auto consumer = scripting::create_wstring_consumer(
|
auto consumer = scripting::create_wstring_consumer(
|
||||||
reader.getEnvironment().getId(),
|
reader.getEnvironment().getId(),
|
||||||
element->attr("consumer").getText(),
|
element->attr("consumer").getText(),
|
||||||
reader.getFilename()+"lua"
|
reader.getFilename()+".lua"
|
||||||
);
|
);
|
||||||
textbox->textConsumer(consumer);
|
textbox->textConsumer(consumer);
|
||||||
}
|
}
|
||||||
@@ -171,13 +178,34 @@ static std::shared_ptr<UINode> readImage(UiXmlReader& reader, xml::xmlelement el
|
|||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::shared_ptr<UINode> readTrackBar(UiXmlReader& reader, xml::xmlelement element) {
|
||||||
|
float min = element->attr("min", "0.0").asFloat();
|
||||||
|
float max = element->attr("max", "1.0").asFloat();
|
||||||
|
float def = element->attr("value", "0.0").asFloat();
|
||||||
|
float step = element->attr("step", "1.0").asFloat();
|
||||||
|
int trackWidth = element->attr("track-width", "1.0").asInt();
|
||||||
|
auto bar = std::make_shared<TrackBar>(min, max, def, step, trackWidth);
|
||||||
|
_readUINode(element, *bar);
|
||||||
|
if (element->has("consumer")) {
|
||||||
|
auto consumer = scripting::create_number_consumer(
|
||||||
|
reader.getEnvironment().getId(),
|
||||||
|
element->attr("consumer").getText(),
|
||||||
|
reader.getFilename()+".lua"
|
||||||
|
);
|
||||||
|
bar->consumer(consumer);
|
||||||
|
}
|
||||||
|
return bar;
|
||||||
|
}
|
||||||
|
|
||||||
UiXmlReader::UiXmlReader(const scripting::Environment& env, AssetsLoader& assetsLoader)
|
UiXmlReader::UiXmlReader(const scripting::Environment& env, AssetsLoader& assetsLoader)
|
||||||
: env(env), assetsLoader(assetsLoader)
|
: env(env), assetsLoader(assetsLoader)
|
||||||
{
|
{
|
||||||
add("image", readImage);
|
add("image", readImage);
|
||||||
add("label", readLabel);
|
add("label", readLabel);
|
||||||
|
add("panel", readPanel);
|
||||||
add("button", readButton);
|
add("button", readButton);
|
||||||
add("textbox", readTextBox);
|
add("textbox", readTextBox);
|
||||||
|
add("trackbar", readTrackBar);
|
||||||
add("container", readContainer);
|
add("container", readContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -108,8 +108,14 @@ static int l_time_uptime(lua_State* L) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int l_time_delta(lua_State* L) {
|
||||||
|
lua_pushnumber(L, scripting::engine->getDelta());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static const luaL_Reg timelib [] = {
|
static const luaL_Reg timelib [] = {
|
||||||
{"uptime", l_time_uptime},
|
{"uptime", l_time_uptime},
|
||||||
|
{"delta", l_time_delta},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -70,21 +70,42 @@ runnable scripting::create_runnable(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool processCallback(
|
||||||
|
int env,
|
||||||
|
const std::string& src,
|
||||||
|
const std::string& file
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
return state->eval(env, src, file) != 0;
|
||||||
|
} catch (lua::luaerror err) {
|
||||||
|
std::cerr << err.what() << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wstringconsumer scripting::create_wstring_consumer(
|
wstringconsumer scripting::create_wstring_consumer(
|
||||||
int env,
|
int env,
|
||||||
const std::string& src,
|
const std::string& src,
|
||||||
const std::string& file
|
const std::string& file
|
||||||
) {
|
) {
|
||||||
return [=](const std::wstring& x){
|
return [=](const std::wstring& x){
|
||||||
try {
|
if (processCallback(env, src, file)) {
|
||||||
if (state->eval(env, src, file) == 0)
|
state->pushstring(util::wstr2str_utf8(x));
|
||||||
return;
|
state->callNoThrow(1);
|
||||||
} catch (lua::luaerror err) {
|
}
|
||||||
std::cerr << err.what() << std::endl;
|
};
|
||||||
return;
|
}
|
||||||
|
|
||||||
|
doubleconsumer scripting::create_number_consumer(
|
||||||
|
int env,
|
||||||
|
const std::string& src,
|
||||||
|
const std::string& file
|
||||||
|
) {
|
||||||
|
return [=](double x){
|
||||||
|
if (processCallback(env, src, file)) {
|
||||||
|
state->pushnumber(x);
|
||||||
|
state->callNoThrow(1);
|
||||||
}
|
}
|
||||||
state->pushstring(util::wstr2str_utf8(x));
|
|
||||||
state->callNoThrow(1);
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,17 +115,12 @@ int_array_consumer scripting::create_int_array_consumer(
|
|||||||
const std::string& file
|
const std::string& file
|
||||||
) {
|
) {
|
||||||
return [=](const int arr[], size_t len){
|
return [=](const int arr[], size_t len){
|
||||||
try {
|
if (processCallback(env, src, file)) {
|
||||||
if (state->eval(env, src, file) == 0)
|
for (uint i = 0; i < len; i++) {
|
||||||
return;
|
state->pushinteger(arr[i]);
|
||||||
} catch (lua::luaerror err) {
|
}
|
||||||
std::cerr << err.what() << std::endl;
|
state->callNoThrow(len);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
for (uint i = 0; i < len; i++) {
|
|
||||||
state->pushinteger(arr[i]);
|
|
||||||
}
|
|
||||||
state->callNoThrow(len);
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,12 @@ namespace scripting {
|
|||||||
const std::string& file="<string>"
|
const std::string& file="<string>"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
doubleconsumer create_number_consumer(
|
||||||
|
int env,
|
||||||
|
const std::string& src,
|
||||||
|
const std::string& file="<string>"
|
||||||
|
);
|
||||||
|
|
||||||
int_array_consumer create_int_array_consumer(
|
int_array_consumer create_int_array_consumer(
|
||||||
int env,
|
int env,
|
||||||
const std::string& src,
|
const std::string& src,
|
||||||
|
|||||||
Reference in New Issue
Block a user