Skip to content

Commit

Permalink
fix imgui, add dice tool and p2prng (non functional yet)
Browse files Browse the repository at this point in the history
  • Loading branch information
Green-Sky committed Aug 7, 2024
1 parent 3d9cdf5 commit b51414f
Show file tree
Hide file tree
Showing 10 changed files with 305 additions and 3 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,6 @@
[submodule "external/solanaceae_message_fragment_store"]
path = external/solanaceae_message_fragment_store
url = https://github.com/Green-Sky/solanaceae_message_fragment_store.git
[submodule "external/solanaceae_tox_p2prng"]
path = external/solanaceae_tox_p2prng
url = https://github.com/Green-Sky/solanaceae_tox_p2prng.git
3 changes: 3 additions & 0 deletions external/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ add_subdirectory(./solanaceae_tox)
set(SOLANACEAE_TOX_UPNP_BUILD_PLUGINS ON CACHE BOOL "")
add_subdirectory(./solanaceae_tox_upnp)

set(SOLANACEAE_TOX_P2PRNG_BUILD_PLUGINS ON CACHE BOOL "")
add_subdirectory(./solanaceae_tox_p2prng)

set(SOLANACEAE_NGCFT1_SHA1_BUILD_TESTING ${SOLANACEAE_ECOSYSTEM_BUILD_TESTING} CACHE BOOL "")
add_subdirectory(./solanaceae_ngc_ft1)

Expand Down
2 changes: 1 addition & 1 deletion external/solanaceae_crdtnotes
2 changes: 1 addition & 1 deletion external/solanaceae_ngc_ft1
1 change: 1 addition & 0 deletions external/solanaceae_tox_p2prng
Submodule solanaceae_tox_p2prng added at 516df1
2 changes: 1 addition & 1 deletion external/solanaceae_toxic_games
18 changes: 18 additions & 0 deletions plugins/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,21 @@ target_link_libraries(plugin_transfer_auto_accept PUBLIC
solanaceae_message3
solanaceae_tox_messages # sad, for filekind
)

########################################

add_library(plugin_dice_tool MODULE
./plugin_dice_tool.cpp
./dice_tool.hpp
./dice_tool.cpp
)
set_target_properties(plugin_dice_tool PROPERTIES
C_VISIBILITY_PRESET hidden
)
target_compile_definitions(plugin_dice_tool PUBLIC ENTT_API_IMPORT)

target_link_libraries(plugin_dice_tool PUBLIC
solanaceae_plugin
solanaceae_tox_p2prng
imgui
)
162 changes: 162 additions & 0 deletions plugins/dice_tool.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
#include "./dice_tool.hpp"

#include <solanaceae/contact/components.hpp>

#include <imgui.h>

#include <entt/container/dense_set.hpp>

#include <cstdint>
#include <iostream>

DiceTool::DiceTool(P2PRNGI& p2prng, Contact3Registry& cr) : _p2prng(p2prng), _cr(cr) {
p2prng.subscribe(this, P2PRNG_Event::init);
p2prng.subscribe(this, P2PRNG_Event::hmac);
p2prng.subscribe(this, P2PRNG_Event::secret);
p2prng.subscribe(this, P2PRNG_Event::done);
p2prng.subscribe(this, P2PRNG_Event::val_error);
}

DiceTool::~DiceTool(void) {
}

float DiceTool::render(float) {
if (ImGui::Begin("DiceTool")) {
// header with values for new roll

ImGui::TextUnformatted("sides:");
ImGui::SameLine();
static uint16_t g_sides {6};
ImGui::InputScalar("##sides", ImGuiDataType_U16, &g_sides);

static entt::dense_set<Contact3> peers;

if (ImGui::CollapsingHeader("peers")) {
ImGui::Indent();
// list with peers participating

for (auto it = peers.begin(); it != peers.end();) {
ImGui::PushID(entt::to_integral(*it));
if (ImGui::SmallButton("-")) {
it = peers.erase(it);
ImGui::PopID();
continue;
}

Contact3Handle c {_cr, *it};

const char* str_ptr = "<unk>";
if (const auto* name_ptr = c.try_get<Contact::Components::Name>(); name_ptr != nullptr && !name_ptr->name.empty()) {
str_ptr = name_ptr->name.c_str();
}

ImGui::SameLine();
ImGui::TextUnformatted(str_ptr);

ImGui::PopID();
it++;
}

if (ImGui::Button("add")) {
ImGui::OpenPopup("peer selector");
}
if (ImGui::BeginPopup("peer selector")) {
for (const auto& [cv] : _cr.view<Contact::Components::TagBig>().each()) {
Contact3Handle c {_cr, cv};

if (peers.contains(c)) {
continue;
}

const char* str_ptr = "<unk>";
if (const auto* name_ptr = c.try_get<Contact::Components::Name>(); name_ptr != nullptr && !name_ptr->name.empty()) {
str_ptr = name_ptr->name.c_str();
}

if (c.all_of<Contact::Components::TagGroup, Contact::Components::ParentOf>()) {
if (ImGui::BeginMenu(str_ptr)) {
for (const Contact3 child_cv : c.get<Contact::Components::ParentOf>().subs) {
Contact3Handle child_c {_cr, child_cv};

if (peers.contains(child_c)) {
continue;
}

const char* child_str_ptr = "<unk>";
if (const auto* name_ptr = child_c.try_get<Contact::Components::Name>(); name_ptr != nullptr && !name_ptr->name.empty()) {
child_str_ptr = name_ptr->name.c_str();
}

if (ImGui::MenuItem(child_str_ptr)) {
peers.emplace(child_c);
}
}
ImGui::EndMenu();
}
} else {
if (ImGui::MenuItem(str_ptr)) {
peers.emplace(c);
}
}
}


ImGui::EndPopup();
}

ImGui::SameLine();
if (ImGui::Button("clear")) {
peers.clear();
}

ImGui::Unindent();
}

if (ImGui::Button("roll")) {
//std::vector<Contact3Handle> c_vec{peers.cbegin(), peers.cend()};
std::vector<Contact3Handle> c_vec;
for (const auto cv : peers) {
c_vec.emplace_back(_cr, cv);
}

auto new_id = _p2prng.newGernationPeers(c_vec, ByteSpan{reinterpret_cast<uint8_t*>(&g_sides), sizeof(g_sides)});
if (!new_id.empty()) {
auto& new_roll = _rolls.emplace_back();
new_roll.id = new_id;
}
}

ImGui::SeparatorText("Rolls");

// list of past rolls and their state
//ImGui::CollapsingHeader("d");
ImGui::Text("d6 [?] hmac 4/6");
ImGui::Text("d6 [?] secret 1/3");
ImGui::Text("d6 [1]");
}
ImGui::End();

return 10.f;
}

bool DiceTool::onEvent(const P2PRNG::Events::Init&) {
return false;
}

bool DiceTool::onEvent(const P2PRNG::Events::HMAC&) {
return false;
}

bool DiceTool::onEvent(const P2PRNG::Events::Secret&) {
return false;
}

bool DiceTool::onEvent(const P2PRNG::Events::Done&) {
std::cout << "got a done!!!!!!!!!!!!!!!!!!\n";
return false;
}

bool DiceTool::onEvent(const P2PRNG::Events::ValError&) {
return false;
}

36 changes: 36 additions & 0 deletions plugins/dice_tool.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#pragma once

#include <solanaceae/tox_p2prng/p2prng.hpp>
#include <solanaceae/contact/contact_model3.hpp>

#include <vector>

class DiceTool : public P2PRNGEventI {
P2PRNGI& _p2prng;
Contact3Registry& _cr;

struct Rolls {
std::vector<uint8_t> id;

P2PRNG::State state {P2PRNG::State::UNKNOWN};
uint16_t state_number_1{};
uint16_t state_number_2{};

uint16_t final_result{};
};
std::vector<Rolls> _rolls;

public:
DiceTool(P2PRNGI& p2prng, Contact3Registry& cr);
~DiceTool(void);

float render(float time_delta);

protected: // p2prng
bool onEvent(const P2PRNG::Events::Init&) override;
bool onEvent(const P2PRNG::Events::HMAC&) override;
bool onEvent(const P2PRNG::Events::Secret&) override;
bool onEvent(const P2PRNG::Events::Done&) override;
bool onEvent(const P2PRNG::Events::ValError&) override;
};

79 changes: 79 additions & 0 deletions plugins/plugin_dice_tool.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
#include <solanaceae/plugin/solana_plugin_v1.h>

#include "./dice_tool.hpp"
#include <imgui.h>

#include <entt/entt.hpp>
#include <entt/fwd.hpp>

#include <memory>
#include <limits>
#include <iostream>

static std::unique_ptr<DiceTool> g_dt = nullptr;

constexpr const char* plugin_name = "DiceTool";

extern "C" {

SOLANA_PLUGIN_EXPORT const char* solana_plugin_get_name(void) {
return plugin_name;
}

SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_get_version(void) {
return SOLANA_PLUGIN_VERSION;
}

SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_start(struct SolanaAPI* solana_api) {
std::cout << "PLUGIN " << plugin_name << " START()\n";

if (solana_api == nullptr) {
return 1;
}

try {
auto* p2prng_i = PLUG_RESOLVE_INSTANCE(P2PRNGI);
auto* cr = PLUG_RESOLVE_INSTANCE_VERSIONED(Contact3Registry, "1");

// static store, could be anywhere tho
// construct with fetched dependencies
g_dt = std::make_unique<DiceTool>(*p2prng_i, *cr);

auto* imguic = PLUG_RESOLVE_INSTANCE_VERSIONED(ImGuiContext, ImGui::GetVersion());
auto* imguimemaf = PLUG_RESOLVE_INSTANCE_VERSIONED(ImGuiMemAllocFunc, ImGui::GetVersion());
auto* imguimemff = PLUG_RESOLVE_INSTANCE_VERSIONED(ImGuiMemFreeFunc, ImGui::GetVersion());
// meh
auto* imguimemud = plug_resolveInstanceOptional<void*>(solana_api, "ImGuiMemUserData", ImGui::GetVersion());

ImGui::SetCurrentContext(imguic);
ImGui::SetAllocatorFunctions(imguimemaf, imguimemff, imguimemud);

// register types
PLUG_PROVIDE_INSTANCE(DiceTool, plugin_name, g_dt.get());
} catch (const ResolveException& e) {
std::cerr << "PLUGIN " << plugin_name << " " << e.what << "\n";
return 2;
}

return 0;
}

SOLANA_PLUGIN_EXPORT void solana_plugin_stop(void) {
std::cout << "PLUGIN " << plugin_name << " STOP()\n";

g_dt.reset();
}

SOLANA_PLUGIN_EXPORT float solana_plugin_tick(float delta) {
(void)delta;
//g_dt->iterate();

return std::numeric_limits<float>::max();
}

SOLANA_PLUGIN_EXPORT float solana_plugin_render(float delta) {
return g_dt->render(delta);
}

} // extern C

0 comments on commit b51414f

Please sign in to comment.