Compare commits
3 commits
cd906be4c9
...
4b441adff3
Author | SHA1 | Date | |
---|---|---|---|
4b441adff3 | |||
3df83a13b4 | |||
ddd89a2b6d |
9 changed files with 177 additions and 5 deletions
20
src/core/value.h
Normal file
20
src/core/value.h
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
enum ValueType {
|
||||||
|
OB_NIL = 0,
|
||||||
|
OB_BOOLEAN,
|
||||||
|
OB_INTEGER,
|
||||||
|
OB_FLOAT,
|
||||||
|
OB_STRING,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Value {
|
||||||
|
ValueType type;
|
||||||
|
union {
|
||||||
|
bool b;
|
||||||
|
int i;
|
||||||
|
float f;
|
||||||
|
std::string str;
|
||||||
|
};
|
||||||
|
};
|
53
src/datamodel/instance.cpp
Normal file
53
src/datamodel/instance.cpp
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
#include "instance.h"
|
||||||
|
#include "instancetype.h"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <memory>
|
||||||
|
#include <optional>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
InstanceType TYPE_INSTANCE {
|
||||||
|
.superClass = nullptr,
|
||||||
|
.className = "Instance",
|
||||||
|
.flags = OB_INST_NOT_CREATABLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
std::optional<std::shared_ptr<Instance>> Instance::GetParent() {
|
||||||
|
if (!this->Parent.has_value() || this->Parent.value().expired())
|
||||||
|
return std::nullopt;
|
||||||
|
return this->Parent.value().lock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::SetParent(std::optional<std::shared_ptr<Instance>> newParent) {
|
||||||
|
// Remove this instance from the existing parent
|
||||||
|
if (this->Parent.has_value() && !this->Parent.value().expired()) {
|
||||||
|
std::shared_ptr<Instance> parent = this->Parent.value().lock();
|
||||||
|
parent->children.erase(std::remove_if(parent->children.begin(), parent->children.end(), [this](std::shared_ptr<Instance> ptr) {
|
||||||
|
return ptr.get() == this;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add self to
|
||||||
|
if (newParent.has_value()) {
|
||||||
|
newParent.value()->children.push_back(this->shared_from_this());
|
||||||
|
}
|
||||||
|
|
||||||
|
this->Parent = newParent;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::shared_ptr<Instance>> Instance::GetChildren() {
|
||||||
|
return this->children;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<Instance> Instance::CloneInternal() {
|
||||||
|
// TODO: Implement refs
|
||||||
|
|
||||||
|
std::unique_ptr<Instance> clone = this->__copy();
|
||||||
|
clone->children = std::vector<std::shared_ptr<Instance>>();
|
||||||
|
clone->children.reserve(this->children.size());
|
||||||
|
|
||||||
|
for (std::shared_ptr<Instance> child : this->children) {
|
||||||
|
clone->children.push_back(child->CloneInternal());
|
||||||
|
}
|
||||||
|
|
||||||
|
return clone;
|
||||||
|
}
|
39
src/datamodel/instance.h
Normal file
39
src/datamodel/instance.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
#pragma once
|
||||||
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
#include <optional>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include "instancetype.h"
|
||||||
|
|
||||||
|
#define INSTANCE_COPY_IMPL(CLASS_NAME) std::unique_ptr<Instance> CLASS_NAME::__copy() { return std::make_unique<CLASS_NAME>(CLASS_NAME(*this)); }
|
||||||
|
#define INSTANCE_PRELUDE(CLASS_NAME) protected: virtual std::unique_ptr<Instance> __copy() override; virtual InstanceType& GetType() const override;
|
||||||
|
// #define INSTANCE_TYPE(CLASS_NAME, TYPE_DEFINITION) InstanceType& CLASS_NAME::GetType() const { \
|
||||||
|
// static InstanceType type = TYPE_DEFINITION; \
|
||||||
|
// return type; \
|
||||||
|
// };
|
||||||
|
#define INSTANCE_TYPE(CLASS_NAME, TYPE_CONSTANT) InstanceType& CLASS_NAME::GetType() const { return TYPE_CONSTANT; };
|
||||||
|
|
||||||
|
extern InstanceType TYPE_INSTANCE;
|
||||||
|
|
||||||
|
// The base class for all objects in the data model
|
||||||
|
class Instance : std::enable_shared_from_this<Instance> {
|
||||||
|
private:
|
||||||
|
std::optional<std::weak_ptr<Instance>> Parent;
|
||||||
|
std::vector<std::shared_ptr<Instance>> children;
|
||||||
|
protected:
|
||||||
|
virtual std::unique_ptr<Instance> __copy();
|
||||||
|
public:
|
||||||
|
std::string Name;
|
||||||
|
std::optional<std::shared_ptr<Instance>> GetParent();
|
||||||
|
void SetParent(std::optional<std::shared_ptr<Instance>> newParent);
|
||||||
|
std::vector<std::shared_ptr<Instance>> GetChildren();
|
||||||
|
|
||||||
|
virtual void Init();
|
||||||
|
std::unique_ptr<Instance> CloneInternal();
|
||||||
|
virtual InstanceType& GetType() const = 0;
|
||||||
|
|
||||||
|
virtual Value GetProperty(std::string key);
|
||||||
|
virtual void SetProperty(std::string key, Value newValue);
|
||||||
|
virtual Value CallMethod(std::string key, std::vector<Value> arguments);
|
||||||
|
};
|
39
src/datamodel/instancetype.h
Normal file
39
src/datamodel/instancetype.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
#pragma once
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include "../core/value.h"
|
||||||
|
|
||||||
|
enum PropertyFlags {
|
||||||
|
OB_PROP_READ_ONLY = 1, // The property cannot be set
|
||||||
|
// OB_PROP_CALLBACK = 2, // The proeprty is get/set through a function instead of directly to a field
|
||||||
|
};
|
||||||
|
|
||||||
|
enum MethodFlags {
|
||||||
|
// OB_METHOD_OVERLOADED = 1, // The method has multiple definitions with different parameters suffixed by __ followed by a number
|
||||||
|
};
|
||||||
|
|
||||||
|
enum InstanceFlags {
|
||||||
|
OB_INST_NOT_CREATABLE = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PropertyInfo {
|
||||||
|
PropertyFlags flags;
|
||||||
|
void* fieldPointer;
|
||||||
|
ValueType valueType;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MethodInfo {
|
||||||
|
MethodFlags flags;
|
||||||
|
void* functionPointer;
|
||||||
|
ValueType returnType;
|
||||||
|
std::vector<ValueType> parameterTypes;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InstanceType {
|
||||||
|
InstanceType* superClass = nullptr;
|
||||||
|
std::string className;
|
||||||
|
InstanceFlags flags;
|
||||||
|
std::map<std::string, PropertyInfo> properties;
|
||||||
|
std::map<std::string, MethodInfo> methods;
|
||||||
|
};
|
15
src/datamodel/part.cpp
Normal file
15
src/datamodel/part.cpp
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#include "part.h"
|
||||||
|
#include "instance.h"
|
||||||
|
#include "instancetype.h"
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
INSTANCE_COPY_IMPL(Part)
|
||||||
|
|
||||||
|
InstanceType TYPE_PART {
|
||||||
|
.superClass = &TYPE_INSTANCE,
|
||||||
|
.className = "Part",
|
||||||
|
.properties = std::map<std::string, PropertyInfo>(),
|
||||||
|
.methods = std::map<std::string, MethodInfo>(),
|
||||||
|
};
|
||||||
|
|
||||||
|
INSTANCE_TYPE(Part, TYPE_PART)
|
|
@ -3,11 +3,17 @@
|
||||||
#include <glm/fwd.hpp>
|
#include <glm/fwd.hpp>
|
||||||
#include <glm/gtc/quaternion.hpp>
|
#include <glm/gtc/quaternion.hpp>
|
||||||
#include <reactphysics3d/body/RigidBody.h>
|
#include <reactphysics3d/body/RigidBody.h>
|
||||||
#include "rendering/material.h"
|
#include "../rendering/material.h"
|
||||||
|
#include "instance.h"
|
||||||
|
#include "instancetype.h"
|
||||||
|
|
||||||
namespace rp = reactphysics3d;
|
namespace rp = reactphysics3d;
|
||||||
|
|
||||||
struct Part {
|
extern InstanceType TYPE_PART;
|
||||||
|
|
||||||
|
class Part : public Instance {
|
||||||
|
INSTANCE_PRELUDE(Part)
|
||||||
|
public:
|
||||||
glm::vec3 position;
|
glm::vec3 position;
|
||||||
glm::quat rotation = glm::identity<glm::quat>();
|
glm::quat rotation = glm::identity<glm::quat>();
|
||||||
glm::vec3 scale;
|
glm::vec3 scale;
|
|
@ -8,7 +8,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "part.h"
|
#include "datamodel/part.h"
|
||||||
#include "rendering/renderer.h"
|
#include "rendering/renderer.h"
|
||||||
#include "physics/simulation.h"
|
#include "physics/simulation.h"
|
||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../part.h"
|
#include "../datamodel/part.h"
|
||||||
|
|
||||||
void simulationInit();
|
void simulationInit();
|
||||||
void syncPartPhysics(Part& part);
|
void syncPartPhysics(Part& part);
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
#include "mesh.h"
|
#include "mesh.h"
|
||||||
#include "defaultmeshes.h"
|
#include "defaultmeshes.h"
|
||||||
#include "../camera.h"
|
#include "../camera.h"
|
||||||
#include "../part.h"
|
#include "../datamodel/part.h"
|
||||||
|
|
||||||
#include "renderer.h"
|
#include "renderer.h"
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue