Implement Vector4, Vector4i, Projection
Implement built-in classes Vector4, Vector4i and Projection. * Two versions of Vector4 (float and integer). * A Projection class, which is a 4x4 matrix specialized in projection types. These types have been requested for a long time, but given they were very corner case they were not added before. Because in Godot 4, reimplementing parts of the rendering engine is now possible, access to these types (heavily used by the rendering code) becomes a necessity. **Q**: Why Projection and not Matrix4? **A**: Godot does not use Matrix2, Matrix3, Matrix4x3, etc. naming convention because, within the engine, these types always have a *purpose*. As such, Godot names them: Transform2D, Transform3D or Basis. In this case, this 4x4 matrix is _always_ used as a _Projection_, hence the naming.
This commit is contained in:
parent
fe929d4787
commit
455c06ecd4
123 changed files with 4139 additions and 594 deletions
|
|
@ -3329,8 +3329,11 @@ void GDScriptAnalyzer::reduce_subscript(GDScriptParser::SubscriptNode *p_subscri
|
|||
case Variant::VECTOR2I:
|
||||
case Variant::VECTOR3:
|
||||
case Variant::VECTOR3I:
|
||||
case Variant::VECTOR4:
|
||||
case Variant::VECTOR4I:
|
||||
case Variant::TRANSFORM2D:
|
||||
case Variant::TRANSFORM3D:
|
||||
case Variant::PROJECTION:
|
||||
error = index_type.builtin_type != Variant::INT && index_type.builtin_type != Variant::FLOAT &&
|
||||
index_type.builtin_type != Variant::STRING;
|
||||
break;
|
||||
|
|
@ -3393,6 +3396,7 @@ void GDScriptAnalyzer::reduce_subscript(GDScriptParser::SubscriptNode *p_subscri
|
|||
case Variant::PACKED_INT64_ARRAY:
|
||||
case Variant::VECTOR2I:
|
||||
case Variant::VECTOR3I:
|
||||
case Variant::VECTOR4I:
|
||||
result_type.builtin_type = Variant::INT;
|
||||
break;
|
||||
// Return float.
|
||||
|
|
@ -3400,6 +3404,7 @@ void GDScriptAnalyzer::reduce_subscript(GDScriptParser::SubscriptNode *p_subscri
|
|||
case Variant::PACKED_FLOAT64_ARRAY:
|
||||
case Variant::VECTOR2:
|
||||
case Variant::VECTOR3:
|
||||
case Variant::VECTOR4:
|
||||
case Variant::QUATERNION:
|
||||
result_type.builtin_type = Variant::FLOAT;
|
||||
break;
|
||||
|
|
@ -3430,6 +3435,7 @@ void GDScriptAnalyzer::reduce_subscript(GDScriptParser::SubscriptNode *p_subscri
|
|||
break;
|
||||
// Depends on the index.
|
||||
case Variant::TRANSFORM3D:
|
||||
case Variant::PROJECTION:
|
||||
case Variant::PLANE:
|
||||
case Variant::COLOR:
|
||||
case Variant::DICTIONARY:
|
||||
|
|
|
|||
|
|
@ -84,11 +84,14 @@ uint32_t GDScriptByteCodeGenerator::add_temporary(const GDScriptDataType &p_type
|
|||
case Variant::VECTOR3:
|
||||
case Variant::VECTOR3I:
|
||||
case Variant::TRANSFORM2D:
|
||||
case Variant::VECTOR4:
|
||||
case Variant::VECTOR4I:
|
||||
case Variant::PLANE:
|
||||
case Variant::QUATERNION:
|
||||
case Variant::AABB:
|
||||
case Variant::BASIS:
|
||||
case Variant::TRANSFORM3D:
|
||||
case Variant::PROJECTION:
|
||||
case Variant::COLOR:
|
||||
case Variant::STRING_NAME:
|
||||
case Variant::NODE_PATH:
|
||||
|
|
@ -453,6 +456,12 @@ void GDScriptByteCodeGenerator::write_type_adjust(const Address &p_target, Varia
|
|||
case Variant::TRANSFORM2D:
|
||||
append(GDScriptFunction::OPCODE_TYPE_ADJUST_TRANSFORM2D, 1);
|
||||
break;
|
||||
case Variant::VECTOR4:
|
||||
append(GDScriptFunction::OPCODE_TYPE_ADJUST_VECTOR3, 1);
|
||||
break;
|
||||
case Variant::VECTOR4I:
|
||||
append(GDScriptFunction::OPCODE_TYPE_ADJUST_VECTOR3I, 1);
|
||||
break;
|
||||
case Variant::PLANE:
|
||||
append(GDScriptFunction::OPCODE_TYPE_ADJUST_PLANE, 1);
|
||||
break;
|
||||
|
|
@ -468,6 +477,9 @@ void GDScriptByteCodeGenerator::write_type_adjust(const Address &p_target, Varia
|
|||
case Variant::TRANSFORM3D:
|
||||
append(GDScriptFunction::OPCODE_TYPE_ADJUST_TRANSFORM3D, 1);
|
||||
break;
|
||||
case Variant::PROJECTION:
|
||||
append(GDScriptFunction::OPCODE_TYPE_ADJUST_PROJECTION, 1);
|
||||
break;
|
||||
case Variant::COLOR:
|
||||
append(GDScriptFunction::OPCODE_TYPE_ADJUST_COLOR, 1);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -639,10 +639,13 @@ void GDScriptFunction::disassemble(const Vector<String> &p_code_lines) const {
|
|||
DISASSEMBLE_PTRCALL(VECTOR3);
|
||||
DISASSEMBLE_PTRCALL(VECTOR3I);
|
||||
DISASSEMBLE_PTRCALL(TRANSFORM2D);
|
||||
DISASSEMBLE_PTRCALL(VECTOR4);
|
||||
DISASSEMBLE_PTRCALL(VECTOR4I);
|
||||
DISASSEMBLE_PTRCALL(PLANE);
|
||||
DISASSEMBLE_PTRCALL(AABB);
|
||||
DISASSEMBLE_PTRCALL(BASIS);
|
||||
DISASSEMBLE_PTRCALL(TRANSFORM3D);
|
||||
DISASSEMBLE_PTRCALL(PROJECTION);
|
||||
DISASSEMBLE_PTRCALL(COLOR);
|
||||
DISASSEMBLE_PTRCALL(STRING_NAME);
|
||||
DISASSEMBLE_PTRCALL(NODE_PATH);
|
||||
|
|
@ -1013,11 +1016,14 @@ void GDScriptFunction::disassemble(const Vector<String> &p_code_lines) const {
|
|||
DISASSEMBLE_TYPE_ADJUST(VECTOR3);
|
||||
DISASSEMBLE_TYPE_ADJUST(VECTOR3I);
|
||||
DISASSEMBLE_TYPE_ADJUST(TRANSFORM2D);
|
||||
DISASSEMBLE_TYPE_ADJUST(VECTOR4);
|
||||
DISASSEMBLE_TYPE_ADJUST(VECTOR4I);
|
||||
DISASSEMBLE_TYPE_ADJUST(PLANE);
|
||||
DISASSEMBLE_TYPE_ADJUST(QUATERNION);
|
||||
DISASSEMBLE_TYPE_ADJUST(AABB);
|
||||
DISASSEMBLE_TYPE_ADJUST(BASIS);
|
||||
DISASSEMBLE_TYPE_ADJUST(TRANSFORM3D);
|
||||
DISASSEMBLE_TYPE_ADJUST(PROJECTION);
|
||||
DISASSEMBLE_TYPE_ADJUST(COLOR);
|
||||
DISASSEMBLE_TYPE_ADJUST(STRING_NAME);
|
||||
DISASSEMBLE_TYPE_ADJUST(NODE_PATH);
|
||||
|
|
|
|||
|
|
@ -273,11 +273,14 @@ public:
|
|||
OPCODE_CALL_PTRCALL_VECTOR3,
|
||||
OPCODE_CALL_PTRCALL_VECTOR3I,
|
||||
OPCODE_CALL_PTRCALL_TRANSFORM2D,
|
||||
OPCODE_CALL_PTRCALL_VECTOR4,
|
||||
OPCODE_CALL_PTRCALL_VECTOR4I,
|
||||
OPCODE_CALL_PTRCALL_PLANE,
|
||||
OPCODE_CALL_PTRCALL_QUATERNION,
|
||||
OPCODE_CALL_PTRCALL_AABB,
|
||||
OPCODE_CALL_PTRCALL_BASIS,
|
||||
OPCODE_CALL_PTRCALL_TRANSFORM3D,
|
||||
OPCODE_CALL_PTRCALL_PROJECTION,
|
||||
OPCODE_CALL_PTRCALL_COLOR,
|
||||
OPCODE_CALL_PTRCALL_STRING_NAME,
|
||||
OPCODE_CALL_PTRCALL_NODE_PATH,
|
||||
|
|
@ -363,11 +366,14 @@ public:
|
|||
OPCODE_TYPE_ADJUST_VECTOR3,
|
||||
OPCODE_TYPE_ADJUST_VECTOR3I,
|
||||
OPCODE_TYPE_ADJUST_TRANSFORM2D,
|
||||
OPCODE_TYPE_ADJUST_VECTOR4,
|
||||
OPCODE_TYPE_ADJUST_VECTOR4I,
|
||||
OPCODE_TYPE_ADJUST_PLANE,
|
||||
OPCODE_TYPE_ADJUST_QUATERNION,
|
||||
OPCODE_TYPE_ADJUST_AABB,
|
||||
OPCODE_TYPE_ADJUST_BASIS,
|
||||
OPCODE_TYPE_ADJUST_TRANSFORM3D,
|
||||
OPCODE_TYPE_ADJUST_PROJECTION,
|
||||
OPCODE_TYPE_ADJUST_COLOR,
|
||||
OPCODE_TYPE_ADJUST_STRING_NAME,
|
||||
OPCODE_TYPE_ADJUST_NODE_PATH,
|
||||
|
|
|
|||
|
|
@ -60,11 +60,14 @@ Variant::Type GDScriptParser::get_builtin_type(const StringName &p_type) {
|
|||
builtin_types["Transform2D"] = Variant::TRANSFORM2D;
|
||||
builtin_types["Vector3"] = Variant::VECTOR3;
|
||||
builtin_types["Vector3i"] = Variant::VECTOR3I;
|
||||
builtin_types["Vector4"] = Variant::VECTOR3;
|
||||
builtin_types["Vector4i"] = Variant::VECTOR3I;
|
||||
builtin_types["AABB"] = Variant::AABB;
|
||||
builtin_types["Plane"] = Variant::PLANE;
|
||||
builtin_types["Quaternion"] = Variant::QUATERNION;
|
||||
builtin_types["Basis"] = Variant::BASIS;
|
||||
builtin_types["Transform3D"] = Variant::TRANSFORM3D;
|
||||
builtin_types["Projection"] = Variant::PROJECTION;
|
||||
builtin_types["Color"] = Variant::COLOR;
|
||||
builtin_types["RID"] = Variant::RID;
|
||||
builtin_types["Object"] = Variant::OBJECT;
|
||||
|
|
|
|||
|
|
@ -199,11 +199,14 @@ void (*type_init_function_table[])(Variant *) = {
|
|||
&VariantInitializer<Vector3>::init, // VECTOR3.
|
||||
&VariantInitializer<Vector3i>::init, // VECTOR3I.
|
||||
&VariantInitializer<Transform2D>::init, // TRANSFORM2D.
|
||||
&VariantInitializer<Vector4>::init, // VECTOR4.
|
||||
&VariantInitializer<Vector4i>::init, // VECTOR4I.
|
||||
&VariantInitializer<Plane>::init, // PLANE.
|
||||
&VariantInitializer<Quaternion>::init, // QUATERNION.
|
||||
&VariantInitializer<AABB>::init, // AABB.
|
||||
&VariantInitializer<Basis>::init, // BASIS.
|
||||
&VariantInitializer<Transform3D>::init, // TRANSFORM3D.
|
||||
&VariantInitializer<Projection>::init, // PROJECTION.
|
||||
&VariantInitializer<Color>::init, // COLOR.
|
||||
&VariantInitializer<StringName>::init, // STRING_NAME.
|
||||
&VariantInitializer<NodePath>::init, // NODE_PATH.
|
||||
|
|
@ -282,11 +285,14 @@ void (*type_init_function_table[])(Variant *) = {
|
|||
&&OPCODE_CALL_PTRCALL_VECTOR3, \
|
||||
&&OPCODE_CALL_PTRCALL_VECTOR3I, \
|
||||
&&OPCODE_CALL_PTRCALL_TRANSFORM2D, \
|
||||
&&OPCODE_CALL_PTRCALL_VECTOR4, \
|
||||
&&OPCODE_CALL_PTRCALL_VECTOR4I, \
|
||||
&&OPCODE_CALL_PTRCALL_PLANE, \
|
||||
&&OPCODE_CALL_PTRCALL_QUATERNION, \
|
||||
&&OPCODE_CALL_PTRCALL_AABB, \
|
||||
&&OPCODE_CALL_PTRCALL_BASIS, \
|
||||
&&OPCODE_CALL_PTRCALL_TRANSFORM3D, \
|
||||
&&OPCODE_CALL_PTRCALL_PROJECTION, \
|
||||
&&OPCODE_CALL_PTRCALL_COLOR, \
|
||||
&&OPCODE_CALL_PTRCALL_STRING_NAME, \
|
||||
&&OPCODE_CALL_PTRCALL_NODE_PATH, \
|
||||
|
|
@ -372,11 +378,14 @@ void (*type_init_function_table[])(Variant *) = {
|
|||
&&OPCODE_TYPE_ADJUST_VECTOR3, \
|
||||
&&OPCODE_TYPE_ADJUST_VECTOR3I, \
|
||||
&&OPCODE_TYPE_ADJUST_TRANSFORM2D, \
|
||||
&&OPCODE_TYPE_ADJUST_VECTOR4, \
|
||||
&&OPCODE_TYPE_ADJUST_VECTOR4I, \
|
||||
&&OPCODE_TYPE_ADJUST_PLANE, \
|
||||
&&OPCODE_TYPE_ADJUST_QUATERNION, \
|
||||
&&OPCODE_TYPE_ADJUST_AABB, \
|
||||
&&OPCODE_TYPE_ADJUST_BASIS, \
|
||||
&&OPCODE_TYPE_ADJUST_TRANSFORM3D, \
|
||||
&&OPCODE_TYPE_ADJUST_PROJECTION, \
|
||||
&&OPCODE_TYPE_ADJUST_COLOR, \
|
||||
&&OPCODE_TYPE_ADJUST_STRING_NAME, \
|
||||
&&OPCODE_TYPE_ADJUST_NODE_PATH, \
|
||||
|
|
@ -435,6 +444,8 @@ void (*type_init_function_table[])(Variant *) = {
|
|||
#define OP_GET_VECTOR3 get_vector3
|
||||
#define OP_GET_VECTOR3I get_vector3i
|
||||
#define OP_GET_RECT2 get_rect2
|
||||
#define OP_GET_VECTOR4 get_vector4
|
||||
#define OP_GET_VECTOR4I get_vector4i
|
||||
#define OP_GET_RECT2I get_rect2i
|
||||
#define OP_GET_QUATERNION get_quaternion
|
||||
#define OP_GET_COLOR get_color
|
||||
|
|
@ -456,6 +467,7 @@ void (*type_init_function_table[])(Variant *) = {
|
|||
#define OP_GET_PACKED_COLOR_ARRAY get_color_array
|
||||
#define OP_GET_TRANSFORM3D get_transform
|
||||
#define OP_GET_TRANSFORM2D get_transform2d
|
||||
#define OP_GET_PROJECTION get_projection
|
||||
#define OP_GET_PLANE get_plane
|
||||
#define OP_GET_AABB get_aabb
|
||||
#define OP_GET_BASIS get_basis
|
||||
|
|
@ -1827,11 +1839,14 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
OPCODE_CALL_PTR(VECTOR3);
|
||||
OPCODE_CALL_PTR(VECTOR3I);
|
||||
OPCODE_CALL_PTR(TRANSFORM2D);
|
||||
OPCODE_CALL_PTR(VECTOR4);
|
||||
OPCODE_CALL_PTR(VECTOR4I);
|
||||
OPCODE_CALL_PTR(PLANE);
|
||||
OPCODE_CALL_PTR(QUATERNION);
|
||||
OPCODE_CALL_PTR(AABB);
|
||||
OPCODE_CALL_PTR(BASIS);
|
||||
OPCODE_CALL_PTR(TRANSFORM3D);
|
||||
OPCODE_CALL_PTR(PROJECTION);
|
||||
OPCODE_CALL_PTR(COLOR);
|
||||
OPCODE_CALL_PTR(STRING_NAME);
|
||||
OPCODE_CALL_PTR(NODE_PATH);
|
||||
|
|
@ -3308,11 +3323,14 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
OPCODE_TYPE_ADJUST(VECTOR3, Vector3);
|
||||
OPCODE_TYPE_ADJUST(VECTOR3I, Vector3i);
|
||||
OPCODE_TYPE_ADJUST(TRANSFORM2D, Transform2D);
|
||||
OPCODE_TYPE_ADJUST(VECTOR4, Vector4);
|
||||
OPCODE_TYPE_ADJUST(VECTOR4I, Vector4i);
|
||||
OPCODE_TYPE_ADJUST(PLANE, Plane);
|
||||
OPCODE_TYPE_ADJUST(QUATERNION, Quaternion);
|
||||
OPCODE_TYPE_ADJUST(AABB, AABB);
|
||||
OPCODE_TYPE_ADJUST(BASIS, Basis);
|
||||
OPCODE_TYPE_ADJUST(TRANSFORM3D, Transform3D);
|
||||
OPCODE_TYPE_ADJUST(PROJECTION, Projection);
|
||||
OPCODE_TYPE_ADJUST(COLOR, Color);
|
||||
OPCODE_TYPE_ADJUST(STRING_NAME, StringName);
|
||||
OPCODE_TYPE_ADJUST(NODE_PATH, NodePath);
|
||||
|
|
|
|||
|
|
@ -5214,7 +5214,7 @@ GLTFCameraIndex GLTFDocument::_convert_camera(Ref<GLTFState> state, Camera3D *p_
|
|||
Ref<GLTFCamera> c;
|
||||
c.instantiate();
|
||||
|
||||
if (p_camera->get_projection() == Camera3D::Projection::PROJECTION_PERSPECTIVE) {
|
||||
if (p_camera->get_projection() == Camera3D::ProjectionType::PROJECTION_PERSPECTIVE) {
|
||||
c->set_perspective(true);
|
||||
}
|
||||
c->set_fov_size(p_camera->get_fov());
|
||||
|
|
|
|||
|
|
@ -452,10 +452,10 @@ Transform3D MobileVRInterface::get_transform_for_view(uint32_t p_view, const Tra
|
|||
return transform_for_eye;
|
||||
};
|
||||
|
||||
CameraMatrix MobileVRInterface::get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) {
|
||||
Projection MobileVRInterface::get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
|
||||
CameraMatrix eye;
|
||||
Projection eye;
|
||||
|
||||
aspect = p_aspect;
|
||||
eye.set_for_hmd(p_view + 1, p_aspect, intraocular_dist, display_width, display_to_lens, oversample, p_z_near, p_z_far);
|
||||
|
|
|
|||
|
|
@ -150,7 +150,7 @@ public:
|
|||
virtual uint32_t get_view_count() override;
|
||||
virtual Transform3D get_camera_transform() override;
|
||||
virtual Transform3D get_transform_for_view(uint32_t p_view, const Transform3D &p_cam_transform) override;
|
||||
virtual CameraMatrix get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) override;
|
||||
virtual Projection get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) override;
|
||||
virtual Vector<BlitToScreen> post_draw_viewport(RID p_render_target, const Rect2 &p_screen_rect) override;
|
||||
|
||||
virtual void process() override;
|
||||
|
|
|
|||
|
|
@ -481,11 +481,14 @@ static String variant_type_to_managed_name(const String &p_var_type_name) {
|
|||
Variant::VECTOR3,
|
||||
Variant::VECTOR3I,
|
||||
Variant::TRANSFORM2D,
|
||||
Variant::VECTOR4,
|
||||
Variant::VECTOR4I,
|
||||
Variant::PLANE,
|
||||
Variant::QUATERNION,
|
||||
Variant::AABB,
|
||||
Variant::BASIS,
|
||||
Variant::TRANSFORM3D,
|
||||
Variant::PROJECTION,
|
||||
Variant::COLOR,
|
||||
Variant::STRING_NAME,
|
||||
Variant::NODE_PATH,
|
||||
|
|
|
|||
|
|
@ -917,6 +917,8 @@ void BindingsGenerator::_generate_array_extensions(StringBuilder &p_output) {
|
|||
ARRAY_ALL(Vector2i);
|
||||
ARRAY_ALL(Vector3);
|
||||
ARRAY_ALL(Vector3i);
|
||||
ARRAY_ALL(Vector4);
|
||||
ARRAY_ALL(Vector4i);
|
||||
|
||||
#undef ARRAY_ALL
|
||||
#undef ARRAY_IS_EMPTY
|
||||
|
|
@ -3222,6 +3224,11 @@ bool BindingsGenerator::_arg_default_value_from_variant(const Variant &p_val, Ar
|
|||
r_iarg.default_argument = "new %s" + r_iarg.default_argument;
|
||||
r_iarg.def_param_mode = ArgumentInterface::NULLABLE_VAL;
|
||||
break;
|
||||
case Variant::VECTOR4:
|
||||
case Variant::VECTOR4I:
|
||||
r_iarg.default_argument = "new %s" + r_iarg.default_argument;
|
||||
r_iarg.def_param_mode = ArgumentInterface::NULLABLE_VAL;
|
||||
break;
|
||||
case Variant::OBJECT:
|
||||
ERR_FAIL_COND_V_MSG(!p_val.is_zero(), false,
|
||||
"Parameter of type '" + String(r_iarg.type.cname) + "' can only have null/zero as the default value.");
|
||||
|
|
@ -3276,6 +3283,15 @@ bool BindingsGenerator::_arg_default_value_from_variant(const Variant &p_val, Ar
|
|||
}
|
||||
r_iarg.def_param_mode = ArgumentInterface::NULLABLE_VAL;
|
||||
} break;
|
||||
case Variant::PROJECTION: {
|
||||
Projection transform = p_val.operator Projection();
|
||||
if (transform == Projection()) {
|
||||
r_iarg.default_argument = "Projection.Identity";
|
||||
} else {
|
||||
r_iarg.default_argument = "new Projection(new Vector4" + transform.matrix[0].operator String() + ", new Vector4" + transform.matrix[1].operator String() + ", new Vector4" + transform.matrix[2].operator String() + ", new Vector4" + transform.matrix[3].operator String() + ")";
|
||||
}
|
||||
r_iarg.def_param_mode = ArgumentInterface::NULLABLE_VAL;
|
||||
} break;
|
||||
case Variant::BASIS: {
|
||||
Basis basis = p_val.operator Basis();
|
||||
if (basis == Basis()) {
|
||||
|
|
|
|||
|
|
@ -590,6 +590,9 @@ class BindingsGenerator {
|
|||
StringName type_Vector2 = StaticCString::create("Vector2");
|
||||
StringName type_Rect2 = StaticCString::create("Rect2");
|
||||
StringName type_Vector3 = StaticCString::create("Vector3");
|
||||
StringName type_Vector3i = StaticCString::create("Vector3i");
|
||||
StringName type_Vector4 = StaticCString::create("Vector4");
|
||||
StringName type_Vector4i = StaticCString::create("Vector4i");
|
||||
|
||||
// Object not included as it must be checked for all derived classes
|
||||
static constexpr int nullable_types_count = 17;
|
||||
|
|
|
|||
|
|
@ -108,9 +108,12 @@ void CachedData::clear_godot_api_cache() {
|
|||
class_Transform2D = nullptr;
|
||||
class_Vector3 = nullptr;
|
||||
class_Vector3i = nullptr;
|
||||
class_Vector4 = nullptr;
|
||||
class_Vector4i = nullptr;
|
||||
class_Basis = nullptr;
|
||||
class_Quaternion = nullptr;
|
||||
class_Transform3D = nullptr;
|
||||
class_Projection = nullptr;
|
||||
class_AABB = nullptr;
|
||||
class_Color = nullptr;
|
||||
class_Plane = nullptr;
|
||||
|
|
@ -239,9 +242,12 @@ void update_godot_api_cache() {
|
|||
CACHE_CLASS_AND_CHECK(Transform2D, GODOT_API_CLASS(Transform2D));
|
||||
CACHE_CLASS_AND_CHECK(Vector3, GODOT_API_CLASS(Vector3));
|
||||
CACHE_CLASS_AND_CHECK(Vector3i, GODOT_API_CLASS(Vector3i));
|
||||
CACHE_CLASS_AND_CHECK(Vector4, GODOT_API_CLASS(Vector4));
|
||||
CACHE_CLASS_AND_CHECK(Vector4i, GODOT_API_CLASS(Vector4i));
|
||||
CACHE_CLASS_AND_CHECK(Basis, GODOT_API_CLASS(Basis));
|
||||
CACHE_CLASS_AND_CHECK(Quaternion, GODOT_API_CLASS(Quaternion));
|
||||
CACHE_CLASS_AND_CHECK(Transform3D, GODOT_API_CLASS(Transform3D));
|
||||
CACHE_CLASS_AND_CHECK(Projection, GODOT_API_CLASS(Projection));
|
||||
CACHE_CLASS_AND_CHECK(AABB, GODOT_API_CLASS(AABB));
|
||||
CACHE_CLASS_AND_CHECK(Color, GODOT_API_CLASS(Color));
|
||||
CACHE_CLASS_AND_CHECK(Plane, GODOT_API_CLASS(Plane));
|
||||
|
|
|
|||
|
|
@ -79,9 +79,12 @@ struct CachedData {
|
|||
GDMonoClass *class_Transform2D = nullptr;
|
||||
GDMonoClass *class_Vector3 = nullptr;
|
||||
GDMonoClass *class_Vector3i = nullptr;
|
||||
GDMonoClass *class_Vector4 = nullptr;
|
||||
GDMonoClass *class_Vector4i = nullptr;
|
||||
GDMonoClass *class_Basis = nullptr;
|
||||
GDMonoClass *class_Quaternion = nullptr;
|
||||
GDMonoClass *class_Transform3D = nullptr;
|
||||
GDMonoClass *class_Projection = nullptr;
|
||||
GDMonoClass *class_AABB = nullptr;
|
||||
GDMonoClass *class_Color = nullptr;
|
||||
GDMonoClass *class_Plane = nullptr;
|
||||
|
|
|
|||
|
|
@ -140,6 +140,18 @@ void GDMonoField::set_value_from_variant(MonoObject *p_object, const Variant &p_
|
|||
break;
|
||||
}
|
||||
|
||||
if (tclass == CACHED_CLASS(Vector4)) {
|
||||
GDMonoMarshal::M_Vector4 from = MARSHALLED_OUT(Vector4, p_value.operator ::Vector4());
|
||||
mono_field_set_value(p_object, mono_field, &from);
|
||||
break;
|
||||
}
|
||||
|
||||
if (tclass == CACHED_CLASS(Vector4i)) {
|
||||
GDMonoMarshal::M_Vector4i from = MARSHALLED_OUT(Vector4i, p_value.operator ::Vector4i());
|
||||
mono_field_set_value(p_object, mono_field, &from);
|
||||
break;
|
||||
}
|
||||
|
||||
if (tclass == CACHED_CLASS(Basis)) {
|
||||
GDMonoMarshal::M_Basis from = MARSHALLED_OUT(Basis, p_value.operator ::Basis());
|
||||
mono_field_set_value(p_object, mono_field, &from);
|
||||
|
|
@ -158,6 +170,12 @@ void GDMonoField::set_value_from_variant(MonoObject *p_object, const Variant &p_
|
|||
break;
|
||||
}
|
||||
|
||||
if (tclass == CACHED_CLASS(Projection)) {
|
||||
GDMonoMarshal::M_Projection from = MARSHALLED_OUT(Projection, p_value.operator ::Projection());
|
||||
mono_field_set_value(p_object, mono_field, &from);
|
||||
break;
|
||||
}
|
||||
|
||||
if (tclass == CACHED_CLASS(AABB)) {
|
||||
GDMonoMarshal::M_AABB from = MARSHALLED_OUT(AABB, p_value.operator ::AABB());
|
||||
mono_field_set_value(p_object, mono_field, &from);
|
||||
|
|
@ -328,6 +346,14 @@ void GDMonoField::set_value_from_variant(MonoObject *p_object, const Variant &p_
|
|||
GDMonoMarshal::M_Vector3i from = MARSHALLED_OUT(Vector3i, p_value.operator ::Vector3i());
|
||||
mono_field_set_value(p_object, mono_field, &from);
|
||||
} break;
|
||||
case Variant::VECTOR4: {
|
||||
GDMonoMarshal::M_Vector4 from = MARSHALLED_OUT(Vector4, p_value.operator ::Vector4());
|
||||
mono_field_set_value(p_object, mono_field, &from);
|
||||
} break;
|
||||
case Variant::VECTOR4I: {
|
||||
GDMonoMarshal::M_Vector4i from = MARSHALLED_OUT(Vector4i, p_value.operator ::Vector4i());
|
||||
mono_field_set_value(p_object, mono_field, &from);
|
||||
} break;
|
||||
case Variant::TRANSFORM2D: {
|
||||
GDMonoMarshal::M_Transform2D from = MARSHALLED_OUT(Transform2D, p_value.operator ::Transform2D());
|
||||
mono_field_set_value(p_object, mono_field, &from);
|
||||
|
|
@ -352,6 +378,10 @@ void GDMonoField::set_value_from_variant(MonoObject *p_object, const Variant &p_
|
|||
GDMonoMarshal::M_Transform3D from = MARSHALLED_OUT(Transform3D, p_value.operator ::Transform3D());
|
||||
mono_field_set_value(p_object, mono_field, &from);
|
||||
} break;
|
||||
case Variant::PROJECTION: {
|
||||
GDMonoMarshal::M_Projection from = MARSHALLED_OUT(Projection, p_value.operator ::Projection());
|
||||
mono_field_set_value(p_object, mono_field, &from);
|
||||
} break;
|
||||
case Variant::COLOR: {
|
||||
GDMonoMarshal::M_Color from = MARSHALLED_OUT(Color, p_value.operator ::Color());
|
||||
mono_field_set_value(p_object, mono_field, &from);
|
||||
|
|
|
|||
|
|
@ -99,6 +99,13 @@ Variant::Type managed_to_variant_type(const ManagedType &p_type, bool *r_nil_is_
|
|||
if (vtclass == CACHED_CLASS(Vector3i)) {
|
||||
return Variant::VECTOR3I;
|
||||
}
|
||||
if (vtclass == CACHED_CLASS(Vector4)) {
|
||||
return Variant::VECTOR4;
|
||||
}
|
||||
|
||||
if (vtclass == CACHED_CLASS(Vector4i)) {
|
||||
return Variant::VECTOR4I;
|
||||
}
|
||||
|
||||
if (vtclass == CACHED_CLASS(Basis)) {
|
||||
return Variant::BASIS;
|
||||
|
|
@ -111,7 +118,9 @@ Variant::Type managed_to_variant_type(const ManagedType &p_type, bool *r_nil_is_
|
|||
if (vtclass == CACHED_CLASS(Transform3D)) {
|
||||
return Variant::TRANSFORM3D;
|
||||
}
|
||||
|
||||
if (vtclass == CACHED_CLASS(Projection)) {
|
||||
return Variant::PROJECTION;
|
||||
}
|
||||
if (vtclass == CACHED_CLASS(AABB)) {
|
||||
return Variant::AABB;
|
||||
}
|
||||
|
|
@ -539,6 +548,14 @@ MonoObject *variant_to_mono_object(const Variant &p_var) {
|
|||
GDMonoMarshal::M_Transform2D from = MARSHALLED_OUT(Transform2D, p_var.operator ::Transform2D());
|
||||
return mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(Transform2D), &from);
|
||||
}
|
||||
case Variant::VECTOR4: {
|
||||
GDMonoMarshal::M_Vector4 from = MARSHALLED_OUT(Vector4, p_var.operator ::Vector4());
|
||||
return mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(Vector4), &from);
|
||||
}
|
||||
case Variant::VECTOR4I: {
|
||||
GDMonoMarshal::M_Vector4i from = MARSHALLED_OUT(Vector4i, p_var.operator ::Vector4i());
|
||||
return mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(Vector4i), &from);
|
||||
}
|
||||
case Variant::PLANE: {
|
||||
GDMonoMarshal::M_Plane from = MARSHALLED_OUT(Plane, p_var.operator ::Plane());
|
||||
return mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(Plane), &from);
|
||||
|
|
@ -559,6 +576,10 @@ MonoObject *variant_to_mono_object(const Variant &p_var) {
|
|||
GDMonoMarshal::M_Transform3D from = MARSHALLED_OUT(Transform3D, p_var.operator ::Transform3D());
|
||||
return mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(Transform3D), &from);
|
||||
}
|
||||
case Variant::PROJECTION: {
|
||||
GDMonoMarshal::M_Projection from = MARSHALLED_OUT(Projection, p_var.operator ::Projection());
|
||||
return mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(Projection), &from);
|
||||
}
|
||||
case Variant::COLOR: {
|
||||
GDMonoMarshal::M_Color from = MARSHALLED_OUT(Color, p_var.operator ::Color());
|
||||
return mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(Color), &from);
|
||||
|
|
|
|||
|
|
@ -256,6 +256,18 @@ enum {
|
|||
offsetof(Vector3, y) == (sizeof(real_t) * 1) &&
|
||||
offsetof(Vector3, z) == (sizeof(real_t) * 2)),
|
||||
|
||||
MATCHES_Vector4 = (MATCHES_real_t && (sizeof(Vector4) == (sizeof(real_t) * 4)) &&
|
||||
offsetof(Vector4, x) == (sizeof(real_t) * 0) &&
|
||||
offsetof(Vector4, y) == (sizeof(real_t) * 1) &&
|
||||
offsetof(Vector4, z) == (sizeof(real_t) * 2) &&
|
||||
offsetof(Vector4, w) == (sizeof(real_t) * 3)),
|
||||
|
||||
MATCHES_Vector4i = (MATCHES_int && (sizeof(Vector4i) == (sizeof(int32_t) * 4i)) &&
|
||||
offsetof(Vector4i, x) == (sizeof(int32_t) * 0) &&
|
||||
offsetof(Vector4i, y) == (sizeof(int32_t) * 1) &&
|
||||
offsetof(Vector4i, z) == (sizeof(int32_t) * 2) &&
|
||||
offsetof(Vector4i, w) == (sizeof(int32_t) * 3)),
|
||||
|
||||
MATCHES_Vector3i = (MATCHES_int && (sizeof(Vector3i) == (sizeof(int32_t) * 3)) &&
|
||||
offsetof(Vector3i, x) == (sizeof(int32_t) * 0) &&
|
||||
offsetof(Vector3i, y) == (sizeof(int32_t) * 1) &&
|
||||
|
|
@ -273,6 +285,8 @@ enum {
|
|||
offsetof(Transform3D, basis) == 0 &&
|
||||
offsetof(Transform3D, origin) == sizeof(Basis)),
|
||||
|
||||
MATCHES_Projection = (MATCHES_Vector4 && (sizeof(Projection) == (sizeof(Vector4) * 4))),
|
||||
|
||||
MATCHES_AABB = (MATCHES_Vector3 && (sizeof(AABB) == (sizeof(Vector3) * 2)) &&
|
||||
offsetof(AABB, position) == (sizeof(Vector3) * 0) &&
|
||||
offsetof(AABB, size) == (sizeof(Vector3) * 1)),
|
||||
|
|
@ -291,9 +305,9 @@ enum {
|
|||
// In the future we may force this if we want to ref return these structs
|
||||
#ifdef GD_MONO_FORCE_INTEROP_STRUCT_COPY
|
||||
/* clang-format off */
|
||||
static_assert(MATCHES_Vector2 && MATCHES_Rect2 && MATCHES_Transform2D && MATCHES_Vector3 &&
|
||||
MATCHES_Basis && MATCHES_Quaternion && MATCHES_Transform3D && MATCHES_AABB && MATCHES_Color &&
|
||||
MATCHES_Plane && MATCHES_Vector2i && MATCHES_Rect2i && MATCHES_Vector3i);
|
||||
static_assert(MATCHES_Vector2 && MATCHES_Rect2 && MATCHES_Transform2D && MATCHES_Vector3 && MATCHES_Vector4 &&
|
||||
MATCHES_Basis && MATCHES_Quaternion && MATCHES_Transform3D && MATCHES_Projection && MATCHES_AABB && MATCHES_Color &&
|
||||
MATCHES_Plane && MATCHES_Vector2i && MATCHES_Rect2i && MATCHES_Vector3i && MATCHES_Vector4i);
|
||||
/* clang-format on */
|
||||
#endif
|
||||
} // namespace InteropLayout
|
||||
|
|
@ -401,6 +415,32 @@ struct M_Vector3i {
|
|||
}
|
||||
};
|
||||
|
||||
struct M_Vector4 {
|
||||
real_t x, y, z, w;
|
||||
|
||||
static _FORCE_INLINE_ Vector4 convert_to(const M_Vector4 &p_from) {
|
||||
return Vector4(p_from.x, p_from.y, p_from.z, p_from.w);
|
||||
}
|
||||
|
||||
static _FORCE_INLINE_ M_Vector4 convert_from(const Vector4 &p_from) {
|
||||
M_Vector4 ret = { p_from.x, p_from.y, p_from.z, p_from.w };
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
struct M_Vector4i {
|
||||
int32_t x, y, z, w;
|
||||
|
||||
static _FORCE_INLINE_ Vector4i convert_to(const M_Vector4i &p_from) {
|
||||
return Vector4i(p_from.x, p_from.y, p_from.z, p_from.w);
|
||||
}
|
||||
|
||||
static _FORCE_INLINE_ M_Vector4i convert_from(const Vector4i &p_from) {
|
||||
M_Vector4i ret = { p_from.x, p_from.y, p_from.z, p_from.w };
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
struct M_Basis {
|
||||
M_Vector3 elements[3];
|
||||
|
||||
|
|
@ -447,6 +487,22 @@ struct M_Transform3D {
|
|||
}
|
||||
};
|
||||
|
||||
struct M_Projection {
|
||||
M_Vector4 vec1;
|
||||
M_Vector4 vec2;
|
||||
M_Vector4 vec3;
|
||||
M_Vector4 vec4;
|
||||
|
||||
static _FORCE_INLINE_ Projection convert_to(const M_Projection &p_from) {
|
||||
return Projection(M_Vector4::convert_to(p_from.vec1), M_Vector4::convert_to(p_from.vec2), M_Vector4::convert_to(p_from.vec3), M_Vector4::convert_to(p_from.vec4));
|
||||
}
|
||||
|
||||
static _FORCE_INLINE_ M_Projection convert_from(const Projection &p_from) {
|
||||
M_Projection ret = { M_Vector4::convert_from(p_from.matrix[0]), M_Vector4::convert_from(p_from.matrix[1]), M_Vector4::convert_from(p_from.matrix[2]), M_Vector4::convert_from(p_from.matrix[3]) };
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
struct M_AABB {
|
||||
M_Vector3 position;
|
||||
M_Vector3 size;
|
||||
|
|
@ -533,8 +589,11 @@ DECL_TYPE_MARSHAL_TEMPLATES(Transform2D)
|
|||
DECL_TYPE_MARSHAL_TEMPLATES(Vector3)
|
||||
DECL_TYPE_MARSHAL_TEMPLATES(Vector3i)
|
||||
DECL_TYPE_MARSHAL_TEMPLATES(Basis)
|
||||
DECL_TYPE_MARSHAL_TEMPLATES(Vector4)
|
||||
DECL_TYPE_MARSHAL_TEMPLATES(Vector4i)
|
||||
DECL_TYPE_MARSHAL_TEMPLATES(Quaternion)
|
||||
DECL_TYPE_MARSHAL_TEMPLATES(Transform3D)
|
||||
DECL_TYPE_MARSHAL_TEMPLATES(Projection)
|
||||
DECL_TYPE_MARSHAL_TEMPLATES(AABB)
|
||||
DECL_TYPE_MARSHAL_TEMPLATES(Color)
|
||||
DECL_TYPE_MARSHAL_TEMPLATES(Plane)
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
#define OPENXR_EXTENSION_WRAPPER_H
|
||||
|
||||
#include "core/error/error_macros.h"
|
||||
#include "core/math/camera_matrix.h"
|
||||
#include "core/math/projection.h"
|
||||
#include "core/templates/hash_map.h"
|
||||
#include "core/templates/rid.h"
|
||||
|
||||
|
|
@ -97,7 +97,7 @@ public:
|
|||
virtual String get_swapchain_format_name(int64_t p_swapchain_format) const = 0;
|
||||
virtual bool get_swapchain_image_data(XrSwapchain p_swapchain, int64_t p_swapchain_format, uint32_t p_width, uint32_t p_height, uint32_t p_sample_count, uint32_t p_array_size, void **r_swapchain_graphics_data) = 0;
|
||||
virtual void cleanup_swapchain_graphics_data(void **p_swapchain_graphics_data) = 0;
|
||||
virtual bool create_projection_fov(const XrFovf p_fov, double p_z_near, double p_z_far, CameraMatrix &r_camera_matrix) = 0;
|
||||
virtual bool create_projection_fov(const XrFovf p_fov, double p_z_near, double p_z_far, Projection &r_camera_matrix) = 0;
|
||||
virtual bool copy_render_target_to_image(RID p_from_render_target, void *p_swapchain_graphics_data, int p_image_index) = 0;
|
||||
|
||||
OpenXRGraphicsExtensionWrapper(OpenXRAPI *p_openxr_api) :
|
||||
|
|
|
|||
|
|
@ -420,7 +420,7 @@ bool OpenXRVulkanExtension::get_swapchain_image_data(XrSwapchain p_swapchain, in
|
|||
return true;
|
||||
}
|
||||
|
||||
bool OpenXRVulkanExtension::create_projection_fov(const XrFovf p_fov, double p_z_near, double p_z_far, CameraMatrix &r_camera_matrix) {
|
||||
bool OpenXRVulkanExtension::create_projection_fov(const XrFovf p_fov, double p_z_near, double p_z_far, Projection &r_camera_matrix) {
|
||||
// Even though this is a Vulkan renderer we're using OpenGL coordinate systems
|
||||
XrMatrix4x4f matrix;
|
||||
XrMatrix4x4f_CreateProjectionFov(&matrix, GRAPHICS_OPENGL, p_fov, (float)p_z_near, (float)p_z_far);
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ public:
|
|||
virtual String get_swapchain_format_name(int64_t p_swapchain_format) const override;
|
||||
virtual bool get_swapchain_image_data(XrSwapchain p_swapchain, int64_t p_swapchain_format, uint32_t p_width, uint32_t p_height, uint32_t p_sample_count, uint32_t p_array_size, void **r_swapchain_graphics_data) override;
|
||||
virtual void cleanup_swapchain_graphics_data(void **p_swapchain_graphics_data) override;
|
||||
virtual bool create_projection_fov(const XrFovf p_fov, double p_z_near, double p_z_far, CameraMatrix &r_camera_matrix) override;
|
||||
virtual bool create_projection_fov(const XrFovf p_fov, double p_z_near, double p_z_far, Projection &r_camera_matrix) override;
|
||||
virtual bool copy_render_target_to_image(RID p_from_render_target, void *p_swapchain_graphics_data, int p_image_index) override;
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -1180,7 +1180,7 @@ bool OpenXRAPI::get_view_transform(uint32_t p_view, Transform3D &r_transform) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool OpenXRAPI::get_view_projection(uint32_t p_view, double p_z_near, double p_z_far, CameraMatrix &p_camera_matrix) {
|
||||
bool OpenXRAPI::get_view_projection(uint32_t p_view, double p_z_near, double p_z_far, Projection &p_camera_matrix) {
|
||||
ERR_FAIL_COND_V(!running, false);
|
||||
ERR_FAIL_NULL_V(graphics_extension, false);
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
#define OPENXR_DRIVER_H
|
||||
|
||||
#include "core/error/error_macros.h"
|
||||
#include "core/math/camera_matrix.h"
|
||||
#include "core/math/projection.h"
|
||||
#include "core/math/transform_3d.h"
|
||||
#include "core/math/vector2.h"
|
||||
#include "core/os/memory.h"
|
||||
|
|
@ -249,7 +249,7 @@ public:
|
|||
Size2 get_recommended_target_size();
|
||||
XRPose::TrackingConfidence get_head_center(Transform3D &r_transform, Vector3 &r_linear_velocity, Vector3 &r_angular_velocity);
|
||||
bool get_view_transform(uint32_t p_view, Transform3D &r_transform);
|
||||
bool get_view_projection(uint32_t p_view, double p_z_near, double p_z_far, CameraMatrix &p_camera_matrix);
|
||||
bool get_view_projection(uint32_t p_view, double p_z_near, double p_z_far, Projection &p_camera_matrix);
|
||||
bool process();
|
||||
|
||||
void pre_render();
|
||||
|
|
|
|||
|
|
@ -631,8 +631,8 @@ Transform3D OpenXRInterface::get_transform_for_view(uint32_t p_view, const Trans
|
|||
return p_cam_transform * xr_server->get_reference_frame() * t;
|
||||
}
|
||||
|
||||
CameraMatrix OpenXRInterface::get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) {
|
||||
CameraMatrix cm;
|
||||
Projection OpenXRInterface::get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) {
|
||||
Projection cm;
|
||||
|
||||
if (openxr_api) {
|
||||
if (openxr_api->get_view_projection(p_view, p_z_near, p_z_far, cm)) {
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ public:
|
|||
virtual uint32_t get_view_count() override;
|
||||
virtual Transform3D get_camera_transform() override;
|
||||
virtual Transform3D get_transform_for_view(uint32_t p_view, const Transform3D &p_cam_transform) override;
|
||||
virtual CameraMatrix get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) override;
|
||||
virtual Projection get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) override;
|
||||
|
||||
virtual void process() override;
|
||||
virtual void pre_render() override;
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ void RaycastOcclusionCull::RaycastHZBuffer::resize(const Size2i &p_size) {
|
|||
memset(camera_ray_masks.ptr(), ~0, camera_rays_tile_count * TILE_RAYS * sizeof(uint32_t));
|
||||
}
|
||||
|
||||
void RaycastOcclusionCull::RaycastHZBuffer::update_camera_rays(const Transform3D &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, ThreadWorkPool &p_thread_work_pool) {
|
||||
void RaycastOcclusionCull::RaycastHZBuffer::update_camera_rays(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, ThreadWorkPool &p_thread_work_pool) {
|
||||
CameraRayThreadData td;
|
||||
td.thread_count = p_thread_work_pool.get_thread_count();
|
||||
|
||||
|
|
@ -88,7 +88,7 @@ void RaycastOcclusionCull::RaycastHZBuffer::update_camera_rays(const Transform3D
|
|||
td.camera_dir = -p_cam_transform.basis.get_column(2);
|
||||
td.camera_orthogonal = p_cam_orthogonal;
|
||||
|
||||
CameraMatrix inv_camera_matrix = p_cam_projection.inverse();
|
||||
Projection inv_camera_matrix = p_cam_projection.inverse();
|
||||
Vector3 camera_corner_proj = Vector3(-1.0f, -1.0f, -1.0f);
|
||||
Vector3 camera_corner_view = inv_camera_matrix.xform(camera_corner_proj);
|
||||
td.pixel_corner = p_cam_transform.xform(camera_corner_view);
|
||||
|
|
@ -524,7 +524,7 @@ void RaycastOcclusionCull::buffer_set_size(RID p_buffer, const Vector2i &p_size)
|
|||
buffers[p_buffer].resize(p_size);
|
||||
}
|
||||
|
||||
void RaycastOcclusionCull::buffer_update(RID p_buffer, const Transform3D &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, ThreadWorkPool &p_thread_pool) {
|
||||
void RaycastOcclusionCull::buffer_update(RID p_buffer, const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, ThreadWorkPool &p_thread_pool) {
|
||||
if (!buffers.has(p_buffer)) {
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
#define OCCLUSION_CULL_RAYCASTER_H
|
||||
|
||||
#include "core/io/image.h"
|
||||
#include "core/math/camera_matrix.h"
|
||||
#include "core/math/projection.h"
|
||||
#include "core/object/object.h"
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/templates/local_vector.h"
|
||||
|
|
@ -76,7 +76,7 @@ public:
|
|||
virtual void clear() override;
|
||||
virtual void resize(const Size2i &p_size) override;
|
||||
void sort_rays(const Vector3 &p_camera_dir, bool p_orthogonal);
|
||||
void update_camera_rays(const Transform3D &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, ThreadWorkPool &p_thread_work_pool);
|
||||
void update_camera_rays(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, ThreadWorkPool &p_thread_work_pool);
|
||||
|
||||
~RaycastHZBuffer();
|
||||
};
|
||||
|
|
@ -183,7 +183,7 @@ public:
|
|||
virtual HZBuffer *buffer_get_ptr(RID p_buffer) override;
|
||||
virtual void buffer_set_scenario(RID p_buffer, RID p_scenario) override;
|
||||
virtual void buffer_set_size(RID p_buffer, const Vector2i &p_size) override;
|
||||
virtual void buffer_update(RID p_buffer, const Transform3D &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, ThreadWorkPool &p_thread_pool) override;
|
||||
virtual void buffer_update(RID p_buffer, const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, ThreadWorkPool &p_thread_pool) override;
|
||||
virtual RID buffer_get_debug_texture(RID p_buffer) override;
|
||||
|
||||
virtual void set_build_quality(RS::ViewportOcclusionCullingBuildQuality p_quality) override;
|
||||
|
|
|
|||
|
|
@ -376,6 +376,12 @@ static Color _color_from_type(Variant::Type p_type, bool dark_theme = true) {
|
|||
case Variant::VECTOR3I:
|
||||
color = Color(0.84, 0.49, 0.93);
|
||||
break;
|
||||
case Variant::VECTOR4:
|
||||
color = Color(0.84, 0.49, 0.94);
|
||||
break;
|
||||
case Variant::VECTOR4I:
|
||||
color = Color(0.84, 0.49, 0.94);
|
||||
break;
|
||||
case Variant::TRANSFORM2D:
|
||||
color = Color(0.77, 0.93, 0.41);
|
||||
break;
|
||||
|
|
@ -4821,12 +4827,15 @@ VisualScriptEditor::VisualScriptEditor() {
|
|||
base_type_map.insert("Rect2i", Variant::RECT2I);
|
||||
base_type_map.insert("Vector3", Variant::VECTOR3);
|
||||
base_type_map.insert("Vector3i", Variant::VECTOR3I);
|
||||
base_type_map.insert("Vector4", Variant::VECTOR4);
|
||||
base_type_map.insert("Vector4i", Variant::VECTOR4I);
|
||||
base_type_map.insert("Transform2D", Variant::TRANSFORM2D);
|
||||
base_type_map.insert("Plane", Variant::PLANE);
|
||||
base_type_map.insert("Quaternion", Variant::QUATERNION);
|
||||
base_type_map.insert("AABB", Variant::AABB);
|
||||
base_type_map.insert("Basis", Variant::BASIS);
|
||||
base_type_map.insert("Transform3D", Variant::TRANSFORM3D);
|
||||
base_type_map.insert("Projection", Variant::PROJECTION);
|
||||
base_type_map.insert("Color", Variant::COLOR);
|
||||
base_type_map.insert("NodePath", Variant::NODE_PATH);
|
||||
base_type_map.insert("RID", Variant::RID);
|
||||
|
|
|
|||
|
|
@ -4025,6 +4025,8 @@ void register_visual_script_nodes() {
|
|||
VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::VECTOR2I), create_node_deconst_typed<Variant::Type::VECTOR2I>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::VECTOR3), create_node_deconst_typed<Variant::Type::VECTOR3>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::VECTOR3I), create_node_deconst_typed<Variant::Type::VECTOR3I>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::VECTOR4), create_node_deconst_typed<Variant::Type::VECTOR4>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::VECTOR4I), create_node_deconst_typed<Variant::Type::VECTOR4I>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::COLOR), create_node_deconst_typed<Variant::Type::COLOR>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::RECT2), create_node_deconst_typed<Variant::Type::RECT2>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::RECT2I), create_node_deconst_typed<Variant::Type::RECT2I>);
|
||||
|
|
@ -4034,6 +4036,7 @@ void register_visual_script_nodes() {
|
|||
VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::AABB), create_node_deconst_typed<Variant::Type::AABB>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::BASIS), create_node_deconst_typed<Variant::Type::BASIS>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::TRANSFORM3D), create_node_deconst_typed<Variant::Type::TRANSFORM3D>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::PROJECTION), create_node_deconst_typed<Variant::Type::PROJECTION>);
|
||||
VisualScriptLanguage::singleton->add_register_func("functions/compose_array", create_node_generic<VisualScriptComposeArray>);
|
||||
|
||||
for (int i = 1; i < Variant::VARIANT_MAX; i++) {
|
||||
|
|
|
|||
|
|
@ -363,8 +363,8 @@ Transform3D WebXRInterfaceJS::get_transform_for_view(uint32_t p_view, const Tran
|
|||
return p_cam_transform * xr_server->get_reference_frame() * transform_for_eye;
|
||||
};
|
||||
|
||||
CameraMatrix WebXRInterfaceJS::get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) {
|
||||
CameraMatrix eye;
|
||||
Projection WebXRInterfaceJS::get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) {
|
||||
Projection eye;
|
||||
|
||||
float *js_matrix = godot_webxr_get_projection_for_eye(p_view + 1);
|
||||
if (!initialized || js_matrix == nullptr) {
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ public:
|
|||
virtual uint32_t get_view_count() override;
|
||||
virtual Transform3D get_camera_transform() override;
|
||||
virtual Transform3D get_transform_for_view(uint32_t p_view, const Transform3D &p_cam_transform) override;
|
||||
virtual CameraMatrix get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) override;
|
||||
virtual Projection get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) override;
|
||||
virtual Vector<BlitToScreen> post_draw_viewport(RID p_render_target, const Rect2 &p_screen_rect) override;
|
||||
|
||||
virtual void process() override;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue