mirror of
https://github.com/arabine/open-story-teller.git
synced 2025-12-06 17:09:06 +01:00
editor: Fix node model initialization, add binary load
This commit is contained in:
parent
016282064e
commit
bb0c18e433
13 changed files with 133 additions and 62 deletions
|
|
@ -46,6 +46,8 @@ void StoryProject::CopyToDevice(const std::string &outputDir)
|
|||
std::string code;
|
||||
GenerateScript(code);
|
||||
|
||||
std::cout << code << std::endl;
|
||||
|
||||
Chip32::Assembler::Error err;
|
||||
if (GenerateBinary(code, err))
|
||||
{
|
||||
|
|
@ -192,6 +194,7 @@ bool StoryProject::ModelFromJson(const nlohmann::json &model)
|
|||
if (n)
|
||||
{
|
||||
n->FromJson(element);
|
||||
n->Initialize();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -533,7 +536,6 @@ void StoryProject::Clear()
|
|||
}
|
||||
|
||||
|
||||
|
||||
void StoryProject::SetTitleImage(const std::string &titleImage)
|
||||
{
|
||||
m_titleImage = titleImage;
|
||||
|
|
@ -544,8 +546,6 @@ void StoryProject::SetTitleSound(const std::string &titleSound)
|
|||
m_titleSound = titleSound;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void StoryProject::SetImageFormat(Resource::ImageFormat format)
|
||||
{
|
||||
m_imageFormat = format;
|
||||
|
|
@ -572,7 +572,7 @@ std::string StoryProject::GetWorkingDir() const
|
|||
return m_working_dir.string();
|
||||
}
|
||||
|
||||
std::string StoryProject::BuildFullAssetsPath(const std::string &fileName) const
|
||||
std::string StoryProject::BuildFullAssetsPath(const std::string_view fileName) const
|
||||
{
|
||||
return (AssetsPath() / fileName).generic_string();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ public:
|
|||
std::string GetDescription() const { return m_description; }
|
||||
uint32_t GetVersion() const { return m_version; }
|
||||
|
||||
std::string BuildFullAssetsPath(const std::string &fileName) const;
|
||||
std::string BuildFullAssetsPath(const std::string_view fileName) const;
|
||||
|
||||
static std::string FileToConstant(const std::string &FileName, const std::string &extension);
|
||||
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ include_directories(${sdl3_SOURCE_DIR}/include)
|
|||
FetchContent_Declare(
|
||||
sdl3_mixer
|
||||
GIT_REPOSITORY https://github.com/libsdl-org/SDL_mixer.git
|
||||
GIT_TAG ace2d37796d2541123cdcbc06dce0b716a0416ad
|
||||
GIT_TAG origin/main
|
||||
GIT_SHALLOW TRUE
|
||||
GIT_PROGRESS TRUE
|
||||
GIT_SUBMODULES ""
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#include "emulator_window.h"
|
||||
#include "gui.h"
|
||||
#include "ImGuiFileDialog.h"
|
||||
#include "IconsMaterialDesignIcons.h"
|
||||
|
||||
EmulatorWindow::EmulatorWindow(IStoryManager &proj)
|
||||
|
|
@ -101,6 +102,37 @@ void EmulatorWindow::Draw()
|
|||
|
||||
ImGui::Text("VM state: %s", m_story.VmState().c_str());
|
||||
|
||||
|
||||
if (ImGui::Button("Load binary story (.c32)"))
|
||||
{
|
||||
IGFD::FileDialogConfig config;
|
||||
config.path = ".";
|
||||
config.countSelectionMax = 1;
|
||||
config.flags = ImGuiFileDialogFlags_Modal;
|
||||
ImGuiFileDialog::Instance()->OpenDialog("LoadBinarySoryDlgKey",
|
||||
"Choose a binary story",
|
||||
".c32",
|
||||
config
|
||||
);
|
||||
}
|
||||
|
||||
// ---------------- Load Binary story
|
||||
if (ImGuiFileDialog::Instance()->Display("LoadBinarySoryDlgKey"))
|
||||
{
|
||||
if (ImGuiFileDialog::Instance()->IsOk())
|
||||
{
|
||||
std::string filePathName = ImGuiFileDialog::Instance()->GetFilePathName();
|
||||
std::string filePath = ImGuiFileDialog::Instance()->GetCurrentPath();
|
||||
std::string filter = ImGuiFileDialog::Instance()->GetCurrentFilter();
|
||||
|
||||
m_story.LoadBinaryStory(filePathName);
|
||||
}
|
||||
// close
|
||||
ImGuiFileDialog::Instance()->Close();
|
||||
}
|
||||
|
||||
|
||||
|
||||
WindowBase::EndDraw();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ public:
|
|||
virtual void ImportProject(const std::string &fileName, int format) = 0;
|
||||
virtual void Log(const std::string &txt, bool critical = false) = 0;
|
||||
virtual void PlaySoundFile(const std::string &fileName) = 0;
|
||||
virtual std::string BuildFullAssetsPath(const std::string &fileName) const = 0;
|
||||
virtual std::string BuildFullAssetsPath(const std::string_view fileName) const = 0;
|
||||
|
||||
// Resources management
|
||||
virtual std::pair<FilterIterator, FilterIterator> Images() = 0;
|
||||
|
|
@ -51,6 +51,7 @@ public:
|
|||
virtual void DeleteNode(const std::string &id) = 0;
|
||||
virtual void DeleteLink(std::shared_ptr<Connection> c) = 0;
|
||||
virtual std::list<std::shared_ptr<Connection>> GetNodeConnections(const std::string &nodeId) = 0;
|
||||
virtual void LoadBinaryStory(const std::string &filename) = 0;
|
||||
|
||||
virtual void Play() = 0;
|
||||
virtual void Ok() = 0;
|
||||
|
|
|
|||
|
|
@ -235,7 +235,7 @@ uint8_t MainWindow::Syscall(chip32_ctx_t *ctx, uint8_t code)
|
|||
{
|
||||
// sound file name address is in R1
|
||||
std::string soundFile = m_story->BuildFullAssetsPath(GetFileNameFromMemory(m_chip32_ctx.registers[R1]));
|
||||
Log(", Sound: " + soundFile);
|
||||
Log("Sound: " + soundFile);
|
||||
m_player.Play(soundFile);
|
||||
}
|
||||
retCode = SYSCALL_RET_WAIT_EV; // set the VM in pause
|
||||
|
|
@ -909,7 +909,7 @@ void MainWindow::PlaySoundFile(const std::string &fileName)
|
|||
m_player.Play(fileName);
|
||||
}
|
||||
|
||||
std::string MainWindow::BuildFullAssetsPath(const std::string &fileName) const
|
||||
std::string MainWindow::BuildFullAssetsPath(const std::string_view fileName) const
|
||||
{
|
||||
return m_story->BuildFullAssetsPath(fileName);
|
||||
}
|
||||
|
|
@ -949,6 +949,27 @@ std::shared_ptr<BaseNode> MainWindow::CreateNode(const std::string &type)
|
|||
return m_story->CreateNode(type);
|
||||
}
|
||||
|
||||
void MainWindow::LoadBinaryStory(const std::string &filename)
|
||||
{
|
||||
FILE *fp = fopen(filename.c_str(), "rb");
|
||||
if (fp != NULL)
|
||||
{
|
||||
fseek(fp, 0L, SEEK_END);
|
||||
long int sz = ftell(fp);
|
||||
fseek(fp, 0L, SEEK_SET);
|
||||
|
||||
if (sz <= m_chip32_ctx.rom.size)
|
||||
{
|
||||
fread(m_chip32_ctx.rom.mem, sz, 1, fp);
|
||||
m_dbg.run_result = VM_READY;
|
||||
chip32_initialize(&m_chip32_ctx);
|
||||
Log("Loaded binary file: " + filename);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::Build(bool compileonly)
|
||||
{
|
||||
if (m_story->GenerateScript(m_currentCode))
|
||||
|
|
@ -968,8 +989,6 @@ void MainWindow::Build(bool compileonly)
|
|||
{
|
||||
m_result.Print();
|
||||
|
||||
Log("Binary successfully generated.");
|
||||
|
||||
if (m_story->CopyProgramTo(m_rom_data, sizeof (m_rom_data)))
|
||||
{
|
||||
// m_ramView->SetMemory(m_ram_data, sizeof(m_ram_data));
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ private:
|
|||
virtual void OpenProject(const std::string &uuid) override;
|
||||
virtual void ImportProject(const std::string &fileName, int format);
|
||||
virtual void PlaySoundFile(const std::string &fileName) override;;
|
||||
virtual std::string BuildFullAssetsPath(const std::string &fileName) const override;
|
||||
virtual std::string BuildFullAssetsPath(const std::string_view fileName) const override;
|
||||
virtual std::pair<FilterIterator, FilterIterator> Images() override;
|
||||
virtual std::pair<FilterIterator, FilterIterator> Sounds() override;
|
||||
|
||||
|
|
@ -137,6 +137,7 @@ private:
|
|||
virtual void DeleteNode(const std::string &id) override;
|
||||
virtual void DeleteLink(std::shared_ptr<Connection> c) override;
|
||||
virtual std::list<std::shared_ptr<Connection>> GetNodeConnections(const std::string &nodeId) override;
|
||||
virtual void LoadBinaryStory(const std::string &filename) override;
|
||||
|
||||
virtual void Play() override;
|
||||
virtual void Ok() override;
|
||||
|
|
|
|||
|
|
@ -101,19 +101,8 @@ void MediaNodeWidget::Draw()
|
|||
void MediaNodeWidget::Initialize()
|
||||
{
|
||||
BaseNodeWidget::Initialize();
|
||||
nlohmann::json j = m_mediaNode->GetInternalData();
|
||||
SetImage(j["image"].get<std::string>());
|
||||
SetSound(j["sound"].get<std::string>());
|
||||
}
|
||||
|
||||
|
||||
void MediaNodeWidget::StoreInternalData()
|
||||
{
|
||||
nlohmann::json j;
|
||||
j["image"] = m_mediaNode->image;
|
||||
j["sound"] = m_mediaNode->sound;
|
||||
|
||||
m_mediaNode->SetInternalData(j);
|
||||
m_image.Load(m_manager.BuildFullAssetsPath(m_mediaNode->GetImage()));
|
||||
m_soundPath = m_manager.BuildFullAssetsPath(m_mediaNode->GetSound());
|
||||
}
|
||||
|
||||
void MediaNodeWidget::DrawProperties()
|
||||
|
|
@ -122,7 +111,7 @@ void MediaNodeWidget::DrawProperties()
|
|||
ImGui::Text("Image");
|
||||
ImGui::SameLine();
|
||||
|
||||
ImGui::Text("%s", m_mediaNode->image.c_str());
|
||||
ImGui::Text("%s", m_mediaNode->GetImage().data());
|
||||
|
||||
ImGui::SameLine();
|
||||
|
||||
|
|
@ -133,14 +122,15 @@ void MediaNodeWidget::DrawProperties()
|
|||
}
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button(ICON_MDI_CLOSE_BOX_OUTLINE "##delimage")) {
|
||||
SetImage("");
|
||||
m_mediaNode->SetImage("");
|
||||
Initialize();
|
||||
}
|
||||
|
||||
ImGui::AlignTextToFramePadding();
|
||||
ImGui::Text("Sound");
|
||||
ImGui::SameLine();
|
||||
|
||||
ImGui::Text("%s", m_mediaNode->sound.c_str());
|
||||
ImGui::Text("%s", m_mediaNode->GetSound().data());
|
||||
|
||||
ImGui::SameLine();
|
||||
|
||||
|
|
@ -158,7 +148,8 @@ void MediaNodeWidget::DrawProperties()
|
|||
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button(ICON_MDI_CLOSE_BOX_OUTLINE "##delsound")) {
|
||||
SetSound("");
|
||||
m_mediaNode->SetSound("");
|
||||
Initialize();
|
||||
}
|
||||
|
||||
// This is the actual popup Gui drawing section.
|
||||
|
|
@ -173,12 +164,13 @@ void MediaNodeWidget::DrawProperties()
|
|||
{
|
||||
if (isImage)
|
||||
{
|
||||
SetImage((*it)->file);
|
||||
m_mediaNode->SetImage((*it)->file);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetSound((*it)->file);
|
||||
m_mediaNode->SetSound((*it)->file);
|
||||
}
|
||||
Initialize();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -187,18 +179,4 @@ void MediaNodeWidget::DrawProperties()
|
|||
|
||||
}
|
||||
|
||||
void MediaNodeWidget::SetImage(const std::string &f)
|
||||
{
|
||||
m_mediaNode->image = f;
|
||||
m_image.Load(m_manager.BuildFullAssetsPath(f));
|
||||
StoreInternalData();
|
||||
}
|
||||
|
||||
void MediaNodeWidget::SetSound(const std::string &f)
|
||||
{
|
||||
m_mediaNode->sound = f;
|
||||
m_soundPath = m_manager.BuildFullAssetsPath(m_mediaNode->sound);
|
||||
StoreInternalData();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -30,10 +30,4 @@ private:
|
|||
std::string m_soundPath;
|
||||
std::string m_buttonUniqueName;
|
||||
|
||||
|
||||
void SetImage(const std::string &f);
|
||||
void SetSound(const std::string &f);
|
||||
|
||||
void StoreInternalData();
|
||||
|
||||
};
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ public:
|
|||
|
||||
static std::string GetEntryLabel(const std::string &id);
|
||||
|
||||
virtual void Initialize() = 0;
|
||||
virtual std::string Build(IStoryProject &story, int nb_out_conns) = 0;
|
||||
virtual std::string GenerateConstants(IStoryProject &story, int nb_out_conns) = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -17,18 +17,33 @@ MediaNode::MediaNode(const std::string &type)
|
|||
SetInternalData(j);
|
||||
}
|
||||
|
||||
void MediaNode::StoreInternalData()
|
||||
{
|
||||
nlohmann::json j;
|
||||
j["image"] = m_image;
|
||||
j["sound"] = m_sound;
|
||||
|
||||
SetInternalData(j);
|
||||
}
|
||||
|
||||
void MediaNode::Initialize()
|
||||
{
|
||||
nlohmann::json j = GetInternalData();
|
||||
m_image = j["image"].get<std::string>();
|
||||
m_sound = j["sound"].get<std::string>();
|
||||
}
|
||||
|
||||
std::string MediaNode::GenerateConstants(IStoryProject &story, int nb_out_conns)
|
||||
{
|
||||
std::string s;
|
||||
|
||||
if (image.size() > 0)
|
||||
if (m_image.size() > 0)
|
||||
{
|
||||
s = StoryProject::FileToConstant(image, story.ImageExtension(image));
|
||||
s = StoryProject::FileToConstant(m_image, story.ImageExtension(m_image));
|
||||
}
|
||||
if (sound.size() > 0)
|
||||
if (m_sound.size() > 0)
|
||||
{
|
||||
s += StoryProject::FileToConstant(sound, story.SoundExtension(sound)); // FIXME: Generate the extension setup in user option of output format
|
||||
s += StoryProject::FileToConstant(m_sound, story.SoundExtension(m_sound)); // FIXME: Generate the extension setup in user option of output format
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -65,6 +80,27 @@ std::string MediaNode::GenerateConstants(IStoryProject &story, int nb_out_conns)
|
|||
return s;
|
||||
}
|
||||
|
||||
void MediaNode::SetImage(const std::string &image)
|
||||
{
|
||||
m_image = image;
|
||||
StoreInternalData();
|
||||
}
|
||||
|
||||
std::string_view MediaNode::GetImage() const
|
||||
{
|
||||
return m_image;
|
||||
}
|
||||
|
||||
void MediaNode::SetSound(const std::string &sound)
|
||||
{
|
||||
m_sound = sound;
|
||||
StoreInternalData();
|
||||
}
|
||||
|
||||
std::string_view MediaNode::GetSound() const
|
||||
{
|
||||
return m_sound;
|
||||
}
|
||||
|
||||
std::string MediaNode::Build(IStoryProject &story, int nb_out_conns)
|
||||
{
|
||||
|
|
@ -76,8 +112,8 @@ std::string MediaNode::Build(IStoryProject &story, int nb_out_conns)
|
|||
<< (nb_out_conns == 0 ? "End" : nb_out_conns == 1 ? "Transition" : "Choice")
|
||||
<< "\n";
|
||||
|
||||
std::string img = SysLib::RemoveFileExtension(image);
|
||||
std::string snd = SysLib::RemoveFileExtension(sound);
|
||||
std::string img = SysLib::RemoveFileExtension(m_image);
|
||||
std::string snd = SysLib::RemoveFileExtension(m_sound);
|
||||
|
||||
// Le label de ce noeud est généré de la façon suivante :
|
||||
// "media" + Node ID + id du noeud parent. Si pas de noeud parent, alors rien
|
||||
|
|
|
|||
|
|
@ -6,15 +6,23 @@
|
|||
#include "i_script_node.h"
|
||||
#include "i_story_project.h"
|
||||
|
||||
struct MediaNode : public BaseNode
|
||||
class MediaNode : public BaseNode
|
||||
{
|
||||
|
||||
public:
|
||||
MediaNode(const std::string &type);
|
||||
|
||||
virtual void Initialize() override;
|
||||
virtual std::string Build(IStoryProject &story, int nb_out_conns) override;
|
||||
virtual std::string GenerateConstants(IStoryProject &story, int nb_out_conns) override;
|
||||
|
||||
std::string image;
|
||||
std::string sound;
|
||||
void SetImage(const std::string &image);
|
||||
std::string_view GetImage() const;
|
||||
void SetSound(const std::string &sound);
|
||||
std::string_view GetSound() const;
|
||||
void StoreInternalData();
|
||||
|
||||
private:
|
||||
std::string m_image;
|
||||
std::string m_sound;
|
||||
};
|
||||
|
||||
|
|
|
|||
1
story-player/.gitignore
vendored
1
story-player/.gitignore
vendored
|
|
@ -42,3 +42,4 @@ app.*.map.json
|
|||
/android/app/debug
|
||||
/android/app/profile
|
||||
/android/app/release
|
||||
/android/app/.cxx
|
||||
Loading…
Reference in a new issue