Add initial implementation of BBVariable and BlackboardSource classes
This commit is contained in:
parent
33b455f8d9
commit
6ef0dd942e
|
@ -0,0 +1,146 @@
|
||||||
|
/**
|
||||||
|
* bb_variable.cpp
|
||||||
|
* =============================================================================
|
||||||
|
* Copyright 2021-2024 Serhii Snitsaruk
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by an MIT-style
|
||||||
|
* license that can be found in the LICENSE file or at
|
||||||
|
* https://opensource.org/licenses/MIT.
|
||||||
|
* =============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "bb_variable.h"
|
||||||
|
|
||||||
|
void BBVariable::unref() {
|
||||||
|
if (data && data->refcount.unref()) {
|
||||||
|
memdelete(data);
|
||||||
|
}
|
||||||
|
data = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// void BBVariable::init_ref() {
|
||||||
|
// if (data) {
|
||||||
|
// unref();
|
||||||
|
// }
|
||||||
|
// data = memnew(Data);
|
||||||
|
// data->refcount.init();
|
||||||
|
// }
|
||||||
|
|
||||||
|
void BBVariable::set_value(const Variant &p_value) {
|
||||||
|
data->value = p_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
Variant BBVariable::get_value() const {
|
||||||
|
return data->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BBVariable::set_type(Variant::Type p_type) {
|
||||||
|
data->type = p_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
Variant::Type BBVariable::get_type() const {
|
||||||
|
return data->type;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BBVariable::set_hint(PropertyHint p_hint) {
|
||||||
|
data->hint = p_hint;
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyHint BBVariable::get_hint() const {
|
||||||
|
return data->hint;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BBVariable::set_hint_string(const String &p_hint_string) {
|
||||||
|
data->hint_string = p_hint_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
String BBVariable::get_hint_string() const {
|
||||||
|
return data->hint_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
BBVariable BBVariable::duplicate() const {
|
||||||
|
BBVariable var;
|
||||||
|
var.data->hint = data->hint;
|
||||||
|
var.data->hint_string = data->hint_string;
|
||||||
|
var.data->type = data->type;
|
||||||
|
var.data->value = data->value;
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BBVariable::is_same_prop_info(const BBVariable &p_other) const {
|
||||||
|
if (data->type != p_other.data->type) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (data->hint != p_other.data->hint) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (data->hint_string != p_other.data->hint_string) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BBVariable::copy_prop_info(const BBVariable &p_other) {
|
||||||
|
data->type = p_other.data->type;
|
||||||
|
data->hint = p_other.data->hint;
|
||||||
|
data->hint_string = p_other.data->hint_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BBVariable::operator==(const BBVariable &p_var) const {
|
||||||
|
if (data == p_var.data) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data || !p_var.data) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->type != p_var.data->type) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->hint != p_var.data->hint) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->value != p_var.data->value) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->hint_string != p_var.data->hint_string) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BBVariable::operator!=(const BBVariable &p_var) const {
|
||||||
|
return !(*this == p_var);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BBVariable::operator=(const BBVariable &p_var) {
|
||||||
|
if (this == &p_var) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
unref();
|
||||||
|
|
||||||
|
if (p_var.data && p_var.data->refcount.ref()) {
|
||||||
|
data = p_var.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BBVariable::BBVariable(const BBVariable &p_var) {
|
||||||
|
if (p_var.data && p_var.data->refcount.ref()) {
|
||||||
|
data = p_var.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BBVariable::BBVariable() {
|
||||||
|
data = memnew(Data);
|
||||||
|
data->refcount.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
BBVariable::~BBVariable() {
|
||||||
|
unref();
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
/**
|
||||||
|
* bb_variable.h
|
||||||
|
* =============================================================================
|
||||||
|
* Copyright 2021-2024 Serhii Snitsaruk
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by an MIT-style
|
||||||
|
* license that can be found in the LICENSE file or at
|
||||||
|
* https://opensource.org/licenses/MIT.
|
||||||
|
* =============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BB_VARIABLE_H
|
||||||
|
#define BB_VARIABLE_H
|
||||||
|
|
||||||
|
#include "core/object/object.h"
|
||||||
|
#include "core/templates/safe_refcount.h"
|
||||||
|
|
||||||
|
class BBVariable {
|
||||||
|
private:
|
||||||
|
struct Data {
|
||||||
|
SafeRefCount refcount;
|
||||||
|
Variant value;
|
||||||
|
Variant::Type type = Variant::NIL;
|
||||||
|
PropertyHint hint = PropertyHint::PROPERTY_HINT_NONE;
|
||||||
|
String hint_string;
|
||||||
|
// bool bound = false;
|
||||||
|
// uint64_t bound_object = 0;
|
||||||
|
// StringName bound_property;
|
||||||
|
};
|
||||||
|
|
||||||
|
Data *data = nullptr;
|
||||||
|
void unref();
|
||||||
|
// void init_ref();
|
||||||
|
|
||||||
|
public:
|
||||||
|
void set_value(const Variant &p_value);
|
||||||
|
Variant get_value() const;
|
||||||
|
|
||||||
|
void set_type(Variant::Type p_type);
|
||||||
|
Variant::Type get_type() const;
|
||||||
|
|
||||||
|
void set_hint(PropertyHint p_hint);
|
||||||
|
PropertyHint get_hint() const;
|
||||||
|
|
||||||
|
void set_hint_string(const String &p_hint_string);
|
||||||
|
String get_hint_string() const;
|
||||||
|
|
||||||
|
BBVariable duplicate() const;
|
||||||
|
|
||||||
|
bool is_same_prop_info(const BBVariable &p_other) const;
|
||||||
|
void copy_prop_info(const BBVariable &p_other);
|
||||||
|
|
||||||
|
// bool is_bound() { return bound; }
|
||||||
|
|
||||||
|
// void bind(Node *p_root, NodePath p_path);
|
||||||
|
// void unbind();
|
||||||
|
|
||||||
|
bool operator==(const BBVariable &p_var) const;
|
||||||
|
bool operator!=(const BBVariable &p_var) const;
|
||||||
|
void operator=(const BBVariable &p_var);
|
||||||
|
|
||||||
|
BBVariable(const BBVariable &p_var);
|
||||||
|
BBVariable();
|
||||||
|
~BBVariable();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // BB_VARIABLE_H
|
|
@ -0,0 +1,70 @@
|
||||||
|
/**
|
||||||
|
* blackboard_source.cpp
|
||||||
|
* =============================================================================
|
||||||
|
* Copyright 2021-2024 Serhii Snitsaruk
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by an MIT-style
|
||||||
|
* license that can be found in the LICENSE file or at
|
||||||
|
* https://opensource.org/licenses/MIT.
|
||||||
|
* =============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "blackboard_source.h"
|
||||||
|
|
||||||
|
void BlackboardSource::set_value(const String &p_name, const Variant &p_value) {
|
||||||
|
ERR_FAIL_COND(!vars.has(p_name));
|
||||||
|
vars.get(p_name).set_value(p_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
Variant BlackboardSource::get_value(const String &p_name) const {
|
||||||
|
ERR_FAIL_COND_V(!vars.has(p_name), Variant());
|
||||||
|
return vars.get(p_name).get_value();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BlackboardSource::add_var(const String &p_name, const BBVariable &p_var) {
|
||||||
|
ERR_FAIL_COND(vars.has(p_name));
|
||||||
|
ERR_FAIL_COND(base.is_valid());
|
||||||
|
vars.insert(p_name, p_var);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BlackboardSource::remove_var(const String &p_name) {
|
||||||
|
ERR_FAIL_COND(!vars.has(p_name));
|
||||||
|
ERR_FAIL_COND(base.is_valid());
|
||||||
|
vars.erase(p_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
BBVariable BlackboardSource::get_var(const String &p_name) {
|
||||||
|
ERR_FAIL_COND_V(!vars.has(p_name), BBVariable());
|
||||||
|
return vars.get(p_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
PackedStringArray BlackboardSource::list_vars() const {
|
||||||
|
PackedStringArray ret;
|
||||||
|
for (const KeyValue<String, BBVariable> &kv : vars) {
|
||||||
|
ret.append(kv.key);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BlackboardSource::sync_base() {
|
||||||
|
for (const KeyValue<String, BBVariable> &kv : base->vars) {
|
||||||
|
if (!vars.has(kv.key)) {
|
||||||
|
vars.insert(kv.key, kv.value.duplicate());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
BBVariable var = vars.get(kv.key);
|
||||||
|
if (!var.is_same_prop_info(kv.value)) {
|
||||||
|
var.copy_prop_info(kv.value);
|
||||||
|
}
|
||||||
|
if (var.get_value().get_type() != kv.value.get_type()) {
|
||||||
|
var.set_value(kv.value.get_value());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ref<Blackboard> BlackboardSource::instantiate() {
|
||||||
|
Ref<Blackboard> bb = memnew(Blackboard);
|
||||||
|
// TODO: fill bb
|
||||||
|
return bb;
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
/**
|
||||||
|
* blackboard_source.h
|
||||||
|
* =============================================================================
|
||||||
|
* Copyright 2021-2024 Serhii Snitsaruk
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by an MIT-style
|
||||||
|
* license that can be found in the LICENSE file or at
|
||||||
|
* https://opensource.org/licenses/MIT.
|
||||||
|
* =============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BLACKBOARD_SOURCE_H
|
||||||
|
#define BLACKBOARD_SOURCE_H
|
||||||
|
|
||||||
|
#include "core/io/resource.h"
|
||||||
|
|
||||||
|
#include "bb_variable.h"
|
||||||
|
#include "blackboard.h"
|
||||||
|
|
||||||
|
class BlackboardSource : public Resource {
|
||||||
|
GDCLASS(BlackboardSource, Resource);
|
||||||
|
|
||||||
|
private:
|
||||||
|
HashMap<String, BBVariable> vars;
|
||||||
|
Ref<BlackboardSource> base;
|
||||||
|
// HashMap<String, BBVariable> overrides;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void set_value(const String &p_name, const Variant &p_value);
|
||||||
|
Variant get_value(const String &p_name) const;
|
||||||
|
void add_var(const String &p_name, const BBVariable &p_var);
|
||||||
|
void remove_var(const String &p_name);
|
||||||
|
BBVariable get_var(const String &p_name);
|
||||||
|
PackedStringArray list_vars() const;
|
||||||
|
|
||||||
|
void sync_base();
|
||||||
|
Ref<Blackboard> instantiate();
|
||||||
|
|
||||||
|
BlackboardSource() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // BLACKBOARD_SOURCE_H
|
Loading…
Reference in New Issue