| name | orkcore-varmap |
| description | Answer questions about orkid's VarMap dynamic key-value container, svar128_t variant type, Python attribute access, nesting patterns, and how VarMap is used across the codebase (PropertySheet data, FSM vars, widget uservars, annotations). Use when the user asks about VarMap, dynamic properties, or the variant type system. |
| user-invocable | false |
Orkid VarMap Reference
When answering questions about VarMap in orkid, consult these files.
Key Files
| Component | Location |
|---|
| VarMap Template | ork.core/inc/ork/kernel/varmap.inl |
| VarMap Impl | ork.core/src/kernel/varmap.cpp |
| svar128_t (variant) | ork.core/inc/ork/kernel/svariant.h |
| Python Bindings | ork.core/inc/ork/python/common_bindings/pyext_varmap.inl |
Core Concept
VarMap is a std::map<std::string, svar128_t> — a dynamic key-value store where values are 128-byte stack-allocated variants. Used throughout orkid as a universal data container.
Python API
from orkengine.core import VarMap
vm = VarMap()
vm.name = "hello"
val = vm.name
"name" in vm
len(vm)
setattr(vm, "editor.filebase", "<assetcache>")
vm["key"]
vm.keys()
vm.clone()
vm.dumpToString()
Supported Value Types
Anything that fits in svar128_t (128 bytes):
- Primitives:
bool, int, float, double, str
- Math:
fvec2, fvec3, fvec4, fmtx3, fmtx4, fquat
- Pointers:
std::shared_ptr<T> for any type
- Nested:
VarMap (for hierarchical data)
- Other:
CrcString, datablock_ptr_t, etc.
C++ API
auto vm = std::make_shared<varmap::VarMap>();
vm->setValueForKey("name", val);
vm->valueForKey("name");
vm->typedValueForKey<float>("speed");
vm->hasKey("name");
vm->set<float>("speed", 1.5f);
vm->makeValueForKey<std::string>("label", "hello");
vm->makeSharedForKey<MyClass>("obj", args...);
vm->tryKeyAsNumber("value");
vm->tryKeyAsInteger("count");
vm->clone();
vm->mergeVars(other_vm);
vm->hash();
vm->dumpkeys();
Where VarMap Is Used
| Context | Accessor | Purpose |
|---|
| PropertySheet data | propsheet.data = vm | Form editor backing store |
| PropertySheet annotations | model.setAnnotations(key, vm) | Editor hints (type, filebase) |
| FSM instance vars | inst.vars.counter = 0 | Per-FSM-instance state |
| Widget uservars | widget.uservars.my_data = obj | Arbitrary data on widgets |
| Subsystem vars | subsystem._vars | Subsystem configuration |
| DataTable | datatable["key"] = val | ECS component data exchange |
| Asset loading | LoadRequest(vars) | Asset-specific parameters |
| Dataflow graph | graph._vars | Graph runtime state |
| Scene params | Scene(params_varmap) | Scene initialization |
Nesting Pattern (Hierarchical PropertySheet)
vm = VarMap()
vm.namespace = "game"
vm.source_dir = "/path/to/files"
transform = VarMap()
transform.position_x = 0.0
transform.position_y = 0.0
transform.position_z = 0.0
vm.Transform = transform
Annotation Pattern
model = propsheet.model
annot = VarMap()
annot.type = tokens.Color
model.setAnnotations("diffuse", annot)
annot2 = VarMap()
setattr(annot2, "editor.browsetype", "folder")
setattr(annot2, "editor.filebase", "<assetcache>")
model.setAnnotations("source_dir", annot2)
svar128_t Variant Type
128-byte stack buffer with runtime type tracking:
svar128_t val;
val.set<float>(1.5f);
float f = val.get<float>();
auto opt = val.tryAs<float>();
bool is_f = val.isA<float>();
val.make<std::string>("hello");
val.clear();
Size variants: svar64_t (64B), svar128_t (128B), svar160_t (160B), svar256_t (256B)
How to Answer
- For VarMap API: read
varmap.inl for all methods
- For Python access: check
pyext_varmap.inl for binding details
- For variant internals: read
svariant.h for static_variant<N>
- Remember: Python
vm.key = val maps to setValueForKey via type codec
- Dotted keys require
setattr(vm, "dotted.key", val) in Python