Merge pull request #26064 from JFonS/add_frustum_camera_mode
Add FRUSTUM camera mode, allowing tilted frustums
This commit is contained in:
commit
5d33f241f0
11 changed files with 133 additions and 27 deletions
|
|
@ -430,6 +430,7 @@ public:
|
|||
BIND0R(RID, camera_create)
|
||||
BIND4(camera_set_perspective, RID, float, float, float)
|
||||
BIND4(camera_set_orthogonal, RID, float, float, float)
|
||||
BIND5(camera_set_frustum, RID, float, Vector2, float, float)
|
||||
BIND2(camera_set_transform, RID, const Transform &)
|
||||
BIND2(camera_set_cull_mask, RID, uint32_t)
|
||||
BIND2(camera_set_environment, RID, RID)
|
||||
|
|
|
|||
|
|
@ -61,6 +61,16 @@ void VisualServerScene::camera_set_orthogonal(RID p_camera, float p_size, float
|
|||
camera->zfar = p_z_far;
|
||||
}
|
||||
|
||||
void VisualServerScene::camera_set_frustum(RID p_camera, float p_size, Vector2 p_offset, float p_z_near, float p_z_far) {
|
||||
Camera *camera = camera_owner.get(p_camera);
|
||||
ERR_FAIL_COND(!camera);
|
||||
camera->type = Camera::FRUSTUM;
|
||||
camera->size = p_size;
|
||||
camera->offset = p_offset;
|
||||
camera->znear = p_z_near;
|
||||
camera->zfar = p_z_far;
|
||||
}
|
||||
|
||||
void VisualServerScene::camera_set_transform(RID p_camera, const Transform &p_transform) {
|
||||
|
||||
Camera *camera = camera_owner.get(p_camera);
|
||||
|
|
@ -1730,6 +1740,17 @@ void VisualServerScene::render_camera(RID p_camera, RID p_scenario, Size2 p_view
|
|||
ortho = false;
|
||||
|
||||
} break;
|
||||
case Camera::FRUSTUM: {
|
||||
|
||||
camera_matrix.set_frustum(
|
||||
camera->size,
|
||||
p_viewport_size.width / (float)p_viewport_size.height,
|
||||
camera->offset,
|
||||
camera->znear,
|
||||
camera->zfar,
|
||||
camera->vaspect);
|
||||
ortho = false;
|
||||
} break;
|
||||
}
|
||||
|
||||
_prepare_scene(camera->transform, camera_matrix, ortho, camera->env, camera->visible_layers, p_scenario, p_shadow_atlas, RID());
|
||||
|
|
|
|||
|
|
@ -77,12 +77,14 @@ public:
|
|||
|
||||
enum Type {
|
||||
PERSPECTIVE,
|
||||
ORTHOGONAL
|
||||
ORTHOGONAL,
|
||||
FRUSTUM
|
||||
};
|
||||
Type type;
|
||||
float fov;
|
||||
float znear, zfar;
|
||||
float size;
|
||||
Vector2 offset;
|
||||
uint32_t visible_layers;
|
||||
bool vaspect;
|
||||
RID env;
|
||||
|
|
@ -97,6 +99,7 @@ public:
|
|||
znear = 0.05;
|
||||
zfar = 100;
|
||||
size = 1.0;
|
||||
offset = Vector2();
|
||||
vaspect = false;
|
||||
}
|
||||
};
|
||||
|
|
@ -106,6 +109,7 @@ public:
|
|||
virtual RID camera_create();
|
||||
virtual void camera_set_perspective(RID p_camera, float p_fovy_degrees, float p_z_near, float p_z_far);
|
||||
virtual void camera_set_orthogonal(RID p_camera, float p_size, float p_z_near, float p_z_far);
|
||||
virtual void camera_set_frustum(RID p_camera, float p_size, Vector2 p_offset, float p_z_near, float p_z_far);
|
||||
virtual void camera_set_transform(RID p_camera, const Transform &p_transform);
|
||||
virtual void camera_set_cull_mask(RID p_camera, uint32_t p_layers);
|
||||
virtual void camera_set_environment(RID p_camera, RID p_env);
|
||||
|
|
|
|||
|
|
@ -360,6 +360,7 @@ public:
|
|||
FUNCRID(camera)
|
||||
FUNC4(camera_set_perspective, RID, float, float, float)
|
||||
FUNC4(camera_set_orthogonal, RID, float, float, float)
|
||||
FUNC5(camera_set_frustum, RID, float, Vector2, float, float)
|
||||
FUNC2(camera_set_transform, RID, const Transform &)
|
||||
FUNC2(camera_set_cull_mask, RID, uint32_t)
|
||||
FUNC2(camera_set_environment, RID, RID)
|
||||
|
|
|
|||
|
|
@ -1863,6 +1863,7 @@ void VisualServer::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("camera_create"), &VisualServer::camera_create);
|
||||
ClassDB::bind_method(D_METHOD("camera_set_perspective", "camera", "fovy_degrees", "z_near", "z_far"), &VisualServer::camera_set_perspective);
|
||||
ClassDB::bind_method(D_METHOD("camera_set_orthogonal", "camera", "size", "z_near", "z_far"), &VisualServer::camera_set_orthogonal);
|
||||
ClassDB::bind_method(D_METHOD("camera_set_frustum", "camera", "size", "offset", "z_near", "z_far"), &VisualServer::camera_set_frustum);
|
||||
ClassDB::bind_method(D_METHOD("camera_set_transform", "camera", "transform"), &VisualServer::camera_set_transform);
|
||||
ClassDB::bind_method(D_METHOD("camera_set_cull_mask", "camera", "layers"), &VisualServer::camera_set_cull_mask);
|
||||
ClassDB::bind_method(D_METHOD("camera_set_environment", "camera", "env"), &VisualServer::camera_set_environment);
|
||||
|
|
|
|||
|
|
@ -584,6 +584,7 @@ public:
|
|||
virtual RID camera_create() = 0;
|
||||
virtual void camera_set_perspective(RID p_camera, float p_fovy_degrees, float p_z_near, float p_z_far) = 0;
|
||||
virtual void camera_set_orthogonal(RID p_camera, float p_size, float p_z_near, float p_z_far) = 0;
|
||||
virtual void camera_set_frustum(RID p_camera, float p_size, Vector2 p_offset, float p_z_near, float p_z_far) = 0;
|
||||
virtual void camera_set_transform(RID p_camera, const Transform &p_transform) = 0;
|
||||
virtual void camera_set_cull_mask(RID p_camera, uint32_t p_layers) = 0;
|
||||
virtual void camera_set_environment(RID p_camera, RID p_env) = 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue