Rigs of Rods 2026.01
Soft-body Physics Simulation
Loading...
Searching...
No Matches
OgreAngelscriptCommon.cpp
Go to the documentation of this file.
1/*
2 This source file is part of Rigs of Rods
3 Copyright 2005-2012 Pierre-Michel Ricordel
4 Copyright 2007-2012 Thomas Fischer
5 Copyright 2013-2024 Petr Ohlidal
6
7 For more information, see http://www.rigsofrods.org/
8
9 Rigs of Rods is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License version 3, as
11 published by the Free Software Foundation.
12
13 Rigs of Rods is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with Rigs of Rods. If not, see <http://www.gnu.org/licenses/>.
20*/
21
23
24#include "AngelScriptBindings.h"
25#include "Application.h"
26
27#include <angelscript.h>
28
29#include <OgreRenderOperation.h>
30
31#include <Overlay/OgreOverlaySystem.h>
32#include <Overlay/OgreOverlayManager.h>
33#include <Overlay/OgreOverlay.h>
34#include <Overlay/OgreOverlayContainer.h>
35
36using namespace Ogre;
37using namespace AngelScript;
38
39void RoR::RegisterOgreObjectsCommon(asIScriptEngine* engine)
40{
41 int r;
42
43 // We start by registering some data types, so angelscript knows that they exist
44
45 // Ogre::Degree
46 r = engine->RegisterObjectType("degree", sizeof(Degree), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CA | asOBJ_APP_CLASS_ALLFLOATS);
47 ROR_ASSERT( r >= 0 );
48
49 // Ogre::Radian
50 r = engine->RegisterObjectType("radian", sizeof(Radian), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CA | asOBJ_APP_CLASS_ALLFLOATS);
51 ROR_ASSERT( r >= 0 );
52
53 // Ogre::Vector2
54 r = engine->RegisterObjectType("vector2", sizeof(Vector2), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CA | asOBJ_APP_CLASS_ALLFLOATS);
55 ROR_ASSERT( r >= 0 );
56
57 // Ogre::Vector3
58 r = engine->RegisterObjectType("vector3", sizeof(Vector3), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CA | asOBJ_APP_CLASS_ALLFLOATS);
59 ROR_ASSERT( r >= 0 );
60
61 // Ogre::Quaternion
62 r = engine->RegisterObjectType("quaternion", sizeof(Quaternion), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CA | asOBJ_APP_CLASS_ALLFLOATS);
63 ROR_ASSERT( r >= 0 );
64
65 // Ogre::ColourValue
66 r = engine->RegisterObjectType("color", sizeof(ColourValue), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CA | asOBJ_APP_CLASS_ALLFLOATS);
67 ROR_ASSERT( r >= 0 );
68
69 // Ogre::Box
70 r = engine->RegisterObjectType("box", sizeof(Box), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CA | asOBJ_APP_CLASS_ALLINTS);
71 ROR_ASSERT( r >= 0 );
72
73 // Object properties
74
75 r = engine->RegisterObjectProperty("vector3", "float x", offsetof(Ogre::Vector3, x)); ROR_ASSERT( r >= 0 );
76 r = engine->RegisterObjectProperty("vector3", "float y", offsetof(Ogre::Vector3, y)); ROR_ASSERT( r >= 0 );
77 r = engine->RegisterObjectProperty("vector3", "float z", offsetof(Ogre::Vector3, z)); ROR_ASSERT( r >= 0 );
78
79 r = engine->RegisterObjectProperty("vector2", "float x", offsetof(Ogre::Vector2, x)); ROR_ASSERT( r >= 0 );
80 r = engine->RegisterObjectProperty("vector2", "float y", offsetof(Ogre::Vector2, y)); ROR_ASSERT( r >= 0 );
81
82 r = engine->RegisterObjectProperty("quaternion", "float w", offsetof(Quaternion, w)); ROR_ASSERT( r >= 0 );
83 r = engine->RegisterObjectProperty("quaternion", "float x", offsetof(Quaternion, x)); ROR_ASSERT( r >= 0 );
84 r = engine->RegisterObjectProperty("quaternion", "float y", offsetof(Quaternion, y)); ROR_ASSERT( r >= 0 );
85 r = engine->RegisterObjectProperty("quaternion", "float z", offsetof(Quaternion, z)); ROR_ASSERT( r >= 0 );
86
87 r = engine->RegisterObjectProperty("color", "float r", offsetof(ColourValue, r)); ROR_ASSERT( r >= 0 );
88 r = engine->RegisterObjectProperty("color", "float g", offsetof(ColourValue, g)); ROR_ASSERT( r >= 0 );
89 r = engine->RegisterObjectProperty("color", "float b", offsetof(ColourValue, b)); ROR_ASSERT( r >= 0 );
90 r = engine->RegisterObjectProperty("color", "float a", offsetof(ColourValue, a)); ROR_ASSERT( r >= 0 );
91
92 r = engine->RegisterObjectProperty("box", "uint left", offsetof(Box, left)); ROR_ASSERT( r >= 0 );
93 r = engine->RegisterObjectProperty("box", "uint top", offsetof(Box, top)); ROR_ASSERT( r >= 0 );
94 r = engine->RegisterObjectProperty("box", "uint right", offsetof(Box, right)); ROR_ASSERT( r >= 0 );
95 r = engine->RegisterObjectProperty("box", "uint bottom", offsetof(Box, bottom)); ROR_ASSERT( r >= 0 );
96 r = engine->RegisterObjectProperty("box", "uint front", offsetof(Box, front)); ROR_ASSERT( r >= 0 );
97 r = engine->RegisterObjectProperty("box", "uint back", offsetof(Box, back)); ROR_ASSERT( r >= 0 );
98
99 // More data types - the low-level scene API, under namespace `Ogre`
100
101 r = engine->SetDefaultNamespace("Ogre"); ROR_ASSERT(r >= 0);
102
103 r = engine->RegisterObjectType("MovableObject", sizeof(MovableObject), asOBJ_REF | asOBJ_NOCOUNT);
104 ROR_ASSERT(r >= 0);
105
106 r = engine->RegisterObjectType("Entity", sizeof(Entity), asOBJ_REF | asOBJ_NOCOUNT);
107 ROR_ASSERT(r >= 0);
108
109 r = engine->RegisterObjectType("SubEntity", sizeof(SubEntity), asOBJ_REF | asOBJ_NOCOUNT);
110 ROR_ASSERT(r >= 0);
111
112 r = engine->RegisterObjectType("Node", sizeof(Node), asOBJ_REF | asOBJ_NOCOUNT);
113 ROR_ASSERT(r >= 0);
114
115 r = engine->RegisterObjectType("SceneNode", sizeof(SceneNode), asOBJ_REF | asOBJ_NOCOUNT);
116 ROR_ASSERT(r >= 0);
117
118 r = engine->RegisterObjectType("SceneManager", sizeof(SceneManager), asOBJ_REF | asOBJ_NOCOUNT);
119 ROR_ASSERT(r >= 0);
120
121 r = engine->RegisterObjectType("Root", sizeof(Root), asOBJ_REF | asOBJ_NOCOUNT);
122 ROR_ASSERT(r >= 0);
123
124 r = engine->RegisterObjectType("AnimationState", sizeof(AnimationState), asOBJ_REF | asOBJ_NOCOUNT);
125 ROR_ASSERT(r >= 0);
126
127 r = engine->RegisterObjectType("AnimationStateSet", sizeof(AnimationStateSet), asOBJ_REF | asOBJ_NOCOUNT);
128 ROR_ASSERT(r >= 0);
129
130 r = engine->RegisterObjectType("TexturePtr", sizeof(TexturePtr), asOBJ_VALUE | asGetTypeTraits<TexturePtr>());
131 ROR_ASSERT(r >= 0);
132
133 r = engine->RegisterObjectType("TextureManager", sizeof(TextureManager), asOBJ_REF | asOBJ_NOCOUNT);
134 ROR_ASSERT(r >= 0);
135
136 r = engine->RegisterObjectType("ManualObject", sizeof(ManualObject), asOBJ_REF | asOBJ_NOCOUNT);
137 ROR_ASSERT(r >= 0);
138
139 r = engine->RegisterObjectType("Image", sizeof(Image), asOBJ_VALUE | asGetTypeTraits<Image>());
140 ROR_ASSERT(r >= 0);
141
142 // NOTE: The `*SharedPtr` is a deprecated alias of `*Ptr` in OGRE 14, but in the version we're using it doesn't exist yet.
143 r = engine->RegisterObjectType("HardwarePixelBufferPtr", sizeof(HardwarePixelBufferSharedPtr), asOBJ_VALUE | asGetTypeTraits<HardwarePixelBufferSharedPtr>());
144 ROR_ASSERT(r >= 0);
145
146 r = engine->RegisterObjectType("PixelBox", sizeof(PixelBox), asOBJ_VALUE | asGetTypeTraits<PixelBox>());
147 ROR_ASSERT(r >= 0);
148
149 r = engine->RegisterObjectType("MeshPtr", sizeof(MeshPtr), asOBJ_VALUE | asGetTypeTraits<MeshPtr>());
150 ROR_ASSERT(r >= 0);
151
152 r = engine->RegisterObjectType("SubMesh", sizeof(SubMesh), asOBJ_REF | asOBJ_NOCOUNT);
153 ROR_ASSERT(r >= 0);
154
155 r = engine->RegisterObjectType("MeshManager", sizeof(TextureManager), asOBJ_REF | asOBJ_NOCOUNT);
156 ROR_ASSERT(r >= 0);
157
158 r = engine->RegisterObjectType("MaterialManager", sizeof(MaterialManager), asOBJ_REF | asOBJ_NOCOUNT);
159 ROR_ASSERT(r >= 0);
160
161 r = engine->RegisterObjectType("MaterialPtr", sizeof(MaterialPtr), asOBJ_VALUE | asGetTypeTraits<MaterialPtr>());
162 ROR_ASSERT(r >= 0);
163
164 r = engine->RegisterObjectType("Technique", sizeof(Technique), asOBJ_REF | asOBJ_NOCOUNT);
165 ROR_ASSERT(r >= 0);
166
167 r = engine->RegisterObjectType("Pass", sizeof(Pass), asOBJ_REF | asOBJ_NOCOUNT);
168 ROR_ASSERT(r >= 0);
169
170 r = engine->RegisterObjectType("TextureUnitState", sizeof(TextureUnitState), asOBJ_REF | asOBJ_NOCOUNT);
171 ROR_ASSERT(r >= 0);
172
173 r = engine->RegisterObjectType("Timer", sizeof(Timer), asOBJ_VALUE | asGetTypeTraits<Timer>());
174 ROR_ASSERT(r >= 0);
175
176 r = engine->RegisterObjectType("GpuProgramParametersPtr", sizeof(GpuProgramParametersPtr), asOBJ_VALUE | asGetTypeTraits<GpuProgramParametersPtr>());
177 ROR_ASSERT(r >= 0);
178
179 r = engine->RegisterObjectType("Light", sizeof(Light), asOBJ_REF | asOBJ_NOCOUNT);
180 ROR_ASSERT(r >= 0);
181
182 // Overlays
183 // ATTENTION! only instances of `OverlayContainer` (is-a `OverlayElement`) can actually be bound to overlays and retrieved from overlays
184 // - see `Ogre::Overlay::add2D()`, `Ogre::Overlay::get2DElements()` and APIDOC on `OverlayContainer`.
185 // This forces us to toss `dynamic_cast<>`s around :(
186
187 r = engine->RegisterObjectType("OverlayElement", 0, asOBJ_REF | asOBJ_NOCOUNT);
188 ROR_ASSERT(r >= 0);
189
190 r = engine->RegisterObjectType("Overlay", 0, asOBJ_REF | asOBJ_NOCOUNT);
191 ROR_ASSERT(r >= 0);
192
193 r = engine->RegisterObjectType("OverlayManager", 0, asOBJ_REF | asOBJ_NOCOUNT);
194 ROR_ASSERT(r >= 0);
195
196 // enums, also under namespace `Ogre`
197
198 r = engine->RegisterEnum("IndexType"); ROR_ASSERT(r >= 0);
199 r = engine->RegisterEnumValue("IndexType", "IT_16BIT", Ogre::HardwareIndexBuffer::IT_16BIT); ROR_ASSERT(r >= 0);
200 r = engine->RegisterEnumValue("IndexType", "IT_32BIT", Ogre::HardwareIndexBuffer::IT_32BIT); ROR_ASSERT(r >= 0);
201
202 r = engine->RegisterEnum("TransformSpace"); ROR_ASSERT(r >= 0);
203 r = engine->RegisterEnumValue("TransformSpace", "TS_LOCAL", Node::TS_LOCAL); ROR_ASSERT(r >= 0); // Transform is relative to the local space
204 r = engine->RegisterEnumValue("TransformSpace", "TS_PARENT", Node::TS_PARENT); ROR_ASSERT(r >= 0); // Transform is relative to the space of the parent node
205 r = engine->RegisterEnumValue("TransformSpace", "TS_WORLD", Node::TS_WORLD); ROR_ASSERT(r >= 0); // Transform is relative to world space
206
207 r = engine->RegisterEnum("RenderOperation"); ROR_ASSERT(r >= 0); // NOTE: `Ogre::RenderOperation` is a wrapper class - the enum is `OperationType`
208 r = engine->RegisterEnumValue("RenderOperation", "OT_POINT_LIST", Ogre::RenderOperation::OT_POINT_LIST); ROR_ASSERT(r >= 0); // A list of points, 1 vertex per point
209 r = engine->RegisterEnumValue("RenderOperation", "OT_LINE_LIST", Ogre::RenderOperation::OT_LINE_LIST); ROR_ASSERT(r >= 0); // A list of lines, 2 vertices per line
210 r = engine->RegisterEnumValue("RenderOperation", "OT_LINE_STRIP", Ogre::RenderOperation::OT_LINE_STRIP); ROR_ASSERT(r >= 0); // A strip of connected lines, 1 vertex per line plus 1 start vertex
211 r = engine->RegisterEnumValue("RenderOperation", "OT_TRIANGLE_LIST", Ogre::RenderOperation::OT_TRIANGLE_LIST); ROR_ASSERT(r >= 0); // A list of triangles, 3 vertices per triangle
212 r = engine->RegisterEnumValue("RenderOperation", "OT_TRIANGLE_STRIP", Ogre::RenderOperation::OT_TRIANGLE_STRIP); ROR_ASSERT(r >= 0);// A strip of triangles, 3 vertices for the first triangle, and 1 per triangle after that
213 r = engine->RegisterEnumValue("RenderOperation", "OT_TRIANGLE_FAN", Ogre::RenderOperation::OT_TRIANGLE_FAN); ROR_ASSERT(r >= 0); // A fan of triangles, 3 vertices for the first triangle, and 1 per triangle after that
214
215 r = engine->RegisterEnum("ImageFilter"); ROR_ASSERT(r >= 0); // Only registering those which are in OGRE14 docs, even though our older version has more
216 r = engine->RegisterEnumValue("ImageFilter", "FILTER_NEAREST", Image::Filter::FILTER_NEAREST); ROR_ASSERT(r >= 0);
217 r = engine->RegisterEnumValue("ImageFilter", "FILTER_LINEAR", Image::Filter::FILTER_LINEAR); ROR_ASSERT(r >= 0);
218 r = engine->RegisterEnumValue("ImageFilter", "FILTER_BILINEAR", Image::Filter::FILTER_BILINEAR); ROR_ASSERT(r >= 0);
219
220 r = engine->RegisterEnum("HardwareBufferLockOptions"); ROR_ASSERT(r >= 0);
221 r = engine->RegisterEnumValue("HardwareBufferLockOptions", "HBL_NORMAL", HardwareBuffer::LockOptions::HBL_NORMAL); ROR_ASSERT(r >= 0);
222 r = engine->RegisterEnumValue("HardwareBufferLockOptions", "HBL_DISCARD", HardwareBuffer::LockOptions::HBL_DISCARD); ROR_ASSERT(r >= 0);
223 r = engine->RegisterEnumValue("HardwareBufferLockOptions", "HBL_READ_ONLY", HardwareBuffer::LockOptions::HBL_READ_ONLY); ROR_ASSERT(r >= 0);
224 r = engine->RegisterEnumValue("HardwareBufferLockOptions", "HBL_NO_OVERWRITE", HardwareBuffer::LockOptions::HBL_NO_OVERWRITE); ROR_ASSERT(r >= 0);
225 r = engine->RegisterEnumValue("HardwareBufferLockOptions", "HBL_WRITE_ONLY", HardwareBuffer::LockOptions::HBL_WRITE_ONLY); ROR_ASSERT(r >= 0);
226
227 r = engine->RegisterEnum("LightTypes"); ROR_ASSERT(r >= 0);
228 r = engine->RegisterEnumValue("LightTypes", "LT_POINT", Light::LT_POINT); ROR_ASSERT(r >= 0);
229 r = engine->RegisterEnumValue("LightTypes", "LT_DIRECTIONAL", Light::LT_DIRECTIONAL); ROR_ASSERT(r >= 0);
230 r = engine->RegisterEnumValue("LightTypes", "LT_SPOTLIGHT", Light::LT_SPOTLIGHT); ROR_ASSERT(r >= 0);
231
232 r = engine->RegisterEnum("GuiMetricsMode"); ROR_ASSERT(r >= 0);
233 r = engine->RegisterEnumValue("GuiMetricsMode", "GMM_PIXELS", Ogre::GMM_PIXELS); ROR_ASSERT(r >= 0);
234 r = engine->RegisterEnumValue("GuiMetricsMode", "GMM_RELATIVE", Ogre::GMM_RELATIVE); ROR_ASSERT(r >= 0);
235 r = engine->RegisterEnumValue("GuiMetricsMode", "GMM_RELATIVE_ASPECT_ADJUSTED", Ogre::GMM_RELATIVE_ASPECT_ADJUSTED); ROR_ASSERT(r >= 0);
236
237 r = engine->RegisterEnum("GuiHorizontalAlignment"); ROR_ASSERT(r >= 0);
238 r = engine->RegisterEnumValue("GuiHorizontalAlignment", "GHA_LEFT", Ogre::GHA_LEFT); ROR_ASSERT(r >= 0);
239 r = engine->RegisterEnumValue("GuiHorizontalAlignment", "GHA_CENTER", Ogre::GHA_CENTER); ROR_ASSERT(r >= 0);
240 r = engine->RegisterEnumValue("GuiHorizontalAlignment", "GHA_RIGHT", Ogre::GHA_RIGHT); ROR_ASSERT(r >= 0);
241
242 r = engine->SetDefaultNamespace(""); ROR_ASSERT(r >= 0);
243
244}
Central state/object manager and communications hub.
#define ROR_ASSERT(_EXPR)
Definition Application.h:40
void RegisterOgreObjectsCommon(AngelScript::asIScriptEngine *engine)
defined in OgreAngelscript.cpp