3#include "../Systems/Core/CameraSystem.h"
5#include "Foundation/Logging/Logger.h"
12Cogs::Core::SubContext::SubContext(ExpressionContext* parent)
14 if (parent) expressionContext.inherit(parent);
17void Cogs::Core::SubContext::useVariables(Context* context,
const std::vector<ParsedValue>& vars)
19 for (
const auto& p : vars) {
22 case Cogs::Core::ParsedDataType::Unknown:
23 case Cogs::Core::ParsedDataType::String:
25 auto tokens = Cogs::Core::tokenize(p.value);
26 if (tokens.size() == 2) {
27 auto value = std::stod(tokens[1].to_string());
28 value = context->variables->get(tokens[0], value);
30 auto& expVal = expressionContext.add(p.key, value);
31 toPull.push_back({ tokens[0].to_string(), &expVal.value });
34 LOG_ERROR(logger,
"Malformed useVariables entry: %s", p.value.c_str());
38 case Cogs::Core::ParsedDataType::Float:
39 expressionContext.add(p.key, p.floatValue);
48void Cogs::Core::SubContext::setVariables(Context* ,
const std::vector<ParsedValue>& vars)
50 for (
const auto& p : vars) {
53 case Cogs::Core::ParsedDataType::Unknown:
54 case Cogs::Core::ParsedDataType::String:
56 expressionContext.add(p.key, 0.0);
57 auto expr = expressionContext.compile(p.value, p.key);
59 expressionContext.update(expr, 0.0);
60 toUpdate.push_back(expr);
64 case Cogs::Core::ParsedDataType::Float:
65 expressionContext.add(p.key, p.floatValue);
74void Cogs::Core::SubContext::useComponentFields(RenderTaskContext* renderContext,
const std::vector<ParsedValue>& vars)
76 for (
const auto& p : vars) {
77 auto tokens = Cogs::Core::tokenize(p.value);
79 if (tokens.size() != 2) {
80 LOG_ERROR(logger,
"Malformed useComponentFields entry: %s", p.value.c_str());
84 auto& expVal = expressionContext.add(p.key, std::stod(tokens[1].to_string()));
86 TokenStream hierarchy;
88 split(tokens[0],
".", hierarchy);
90 if (2 <= hierarchy.size() && renderContext->cameraData && renderContext->cameraData->camera) {
91 const auto compHandle = renderContext->cameraData->camera.resolveComponent<
Cogs::Core::CameraComponent>()->getComponentHandle(hierarchy[0]);
92 if (
auto* component = compHandle.resolve(); component) {
94 auto field = componentType.getField(hierarchy[1]);
98 if (3 <= hierarchy.size()) {
99 switch (hierarchy[2][0])
101 case 'x':
case 'r': index = 0;
break;
102 case 'y':
case 'g': index = 1;
break;
103 case 'z':
case 'b': index = 2;
break;
104 case 'w':
case 'a': index = 3;
break;
114 ParsedDataType baseType = ParsedDataType::Unknown;
119 offset = field->getOffset();
120 baseType = ParsedDataType::Bool;
123 offset = field->getOffset();
124 baseType = ParsedDataType::UInt;
127 offset = field->getOffset() + sizeof(uint32_t) *
std::min(index, 1u);
128 baseType = ParsedDataType::UInt;
131 offset = field->getOffset() + sizeof(uint32_t) *
std::min(index, 2u);
132 baseType = ParsedDataType::UInt;
135 offset = field->getOffset() + sizeof(uint32_t) *
std::min(index, 3u);
136 baseType = ParsedDataType::UInt;
139 offset = field->getOffset();
140 baseType = ParsedDataType::Int;
143 offset = field->getOffset() + sizeof(int32_t) *
std::min(index, 1u);
144 baseType = ParsedDataType::Int;
147 offset = field->getOffset() + sizeof(int32_t) *
std::min(index, 2u);
148 baseType = ParsedDataType::Int;
151 offset = field->getOffset() + sizeof(int32_t) *
std::min(index, 3u);
152 baseType = ParsedDataType::Int;
155 offset = field->getOffset();
156 baseType = ParsedDataType::Float;
159 offset = field->getOffset() + sizeof(float) *
std::min(index, 1u);
160 baseType = ParsedDataType::Float;
163 offset = field->getOffset() + sizeof(float) *
std::min(index, 2u);
164 baseType = ParsedDataType::Float;
167 offset = field->getOffset() + sizeof(float) *
std::min(index, 3u);
168 baseType = ParsedDataType::Float;
173 if (baseType != ParsedDataType::Unknown) {
174 compFieldsToPull.push_back({ compHandle, offset, baseType, &expVal.value });
177 LOG_ERROR(logger,
"useComponentFields: Unsupported type %s", fieldType.getName().c_str());
181 LOG_ERROR(logger,
"useComponentFields: Component %s doesn't have field %s", hierarchy[0].to_string().c_str(), hierarchy[1].to_string().c_str());
185 LOG_ERROR(logger,
"useComponentFields: couldn't find component %s in entity", hierarchy[0].to_string().c_str());
193void Cogs::Core::SubContext::pullVariables(Context* context)
195 for (
const auto& p : toPull) {
196 *p.second = context->variables->get(p.first, *p.second);
198 for (
const auto& p : compFieldsToPull) {
199 if (!std::get<0>(p))
continue;
200 const auto* component = std::get<0>(p).resolve();
201 const auto* src = (
char*)component + std::get<1>(p);
202 auto* dst = std::get<3>(p);
203 switch (std::get<2>(p))
205 case ParsedDataType::Bool: *dst = *(
const bool*)src ? 1 : 0;
break;
206 case ParsedDataType::Int: *dst = *(
const int32_t*)src;
break;
207 case ParsedDataType::UInt: *dst = *(
const uint32_t*)src;
break;
208 case ParsedDataType::Float: *dst = *(
const float*)src;
break;
214 for (
auto& e : toUpdate) {
215 expressionContext.update(e, 0.0);
Log implementation class.
static const Type & getType()
Get the Type of the given template argument.
Provides a weakly referenced view over the contents of a string.
constexpr size_t hash() const noexcept
Get the hash code of the string.
constexpr Log getLogger(const char(&name)[LEN]) noexcept
constexpr size_t hash() noexcept
Simple getter function that returns the initial value for fnv1a hashing.