| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  camera_matrix.cpp                                                    */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2021-01-01 20:13:46 +01:00
										 |  |  | /* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | #include "camera_matrix.h"
 | 
					
						
							| 
									
										
										
										
											2018-09-11 18:13:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "core/math/math_funcs.h"
 | 
					
						
							| 
									
										
										
										
											2020-11-07 19:33:38 -03:00
										 |  |  | #include "core/string/print_string.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-01 09:34:23 -03:00
										 |  |  | float CameraMatrix::determinant() const { | 
					
						
							|  |  |  | 	return matrix[0][3] * matrix[1][2] * matrix[2][1] * matrix[3][0] - matrix[0][2] * matrix[1][3] * matrix[2][1] * matrix[3][0] - | 
					
						
							|  |  |  | 		   matrix[0][3] * matrix[1][1] * matrix[2][2] * matrix[3][0] + matrix[0][1] * matrix[1][3] * matrix[2][2] * matrix[3][0] + | 
					
						
							|  |  |  | 		   matrix[0][2] * matrix[1][1] * matrix[2][3] * matrix[3][0] - matrix[0][1] * matrix[1][2] * matrix[2][3] * matrix[3][0] - | 
					
						
							|  |  |  | 		   matrix[0][3] * matrix[1][2] * matrix[2][0] * matrix[3][1] + matrix[0][2] * matrix[1][3] * matrix[2][0] * matrix[3][1] + | 
					
						
							|  |  |  | 		   matrix[0][3] * matrix[1][0] * matrix[2][2] * matrix[3][1] - matrix[0][0] * matrix[1][3] * matrix[2][2] * matrix[3][1] - | 
					
						
							|  |  |  | 		   matrix[0][2] * matrix[1][0] * matrix[2][3] * matrix[3][1] + matrix[0][0] * matrix[1][2] * matrix[2][3] * matrix[3][1] + | 
					
						
							|  |  |  | 		   matrix[0][3] * matrix[1][1] * matrix[2][0] * matrix[3][2] - matrix[0][1] * matrix[1][3] * matrix[2][0] * matrix[3][2] - | 
					
						
							|  |  |  | 		   matrix[0][3] * matrix[1][0] * matrix[2][1] * matrix[3][2] + matrix[0][0] * matrix[1][3] * matrix[2][1] * matrix[3][2] + | 
					
						
							|  |  |  | 		   matrix[0][1] * matrix[1][0] * matrix[2][3] * matrix[3][2] - matrix[0][0] * matrix[1][1] * matrix[2][3] * matrix[3][2] - | 
					
						
							|  |  |  | 		   matrix[0][2] * matrix[1][1] * matrix[2][0] * matrix[3][3] + matrix[0][1] * matrix[1][2] * matrix[2][0] * matrix[3][3] + | 
					
						
							|  |  |  | 		   matrix[0][2] * matrix[1][0] * matrix[2][1] * matrix[3][3] - matrix[0][0] * matrix[1][2] * matrix[2][1] * matrix[3][3] - | 
					
						
							|  |  |  | 		   matrix[0][1] * matrix[1][0] * matrix[2][2] * matrix[3][3] + matrix[0][0] * matrix[1][1] * matrix[2][2] * matrix[3][3]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | void CameraMatrix::set_identity() { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (int i = 0; i < 4; i++) { | 
					
						
							|  |  |  | 		for (int j = 0; j < 4; j++) { | 
					
						
							|  |  |  | 			matrix[i][j] = (i == j) ? 1 : 0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CameraMatrix::set_zero() { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (int i = 0; i < 4; i++) { | 
					
						
							|  |  |  | 		for (int j = 0; j < 4; j++) { | 
					
						
							|  |  |  | 			matrix[i][j] = 0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | Plane CameraMatrix::xform4(const Plane &p_vec4) const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	Plane ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-10 16:47:11 +02:00
										 |  |  | 	ret.normal.x = matrix[0][0] * p_vec4.normal.x + matrix[1][0] * p_vec4.normal.y + matrix[2][0] * p_vec4.normal.z + matrix[3][0] * p_vec4.d; | 
					
						
							|  |  |  | 	ret.normal.y = matrix[0][1] * p_vec4.normal.x + matrix[1][1] * p_vec4.normal.y + matrix[2][1] * p_vec4.normal.z + matrix[3][1] * p_vec4.d; | 
					
						
							|  |  |  | 	ret.normal.z = matrix[0][2] * p_vec4.normal.x + matrix[1][2] * p_vec4.normal.y + matrix[2][2] * p_vec4.normal.z + matrix[3][2] * p_vec4.d; | 
					
						
							|  |  |  | 	ret.d = matrix[0][3] * p_vec4.normal.x + matrix[1][3] * p_vec4.normal.y + matrix[2][3] * p_vec4.normal.z + matrix[3][3] * p_vec4.d; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-17 13:25:38 -03:00
										 |  |  | void CameraMatrix::adjust_perspective_znear(real_t p_new_znear) { | 
					
						
							|  |  |  | 	real_t zfar = get_z_far(); | 
					
						
							|  |  |  | 	real_t znear = p_new_znear; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	real_t deltaZ = zfar - znear; | 
					
						
							|  |  |  | 	matrix[2][2] = -(zfar + znear) / deltaZ; | 
					
						
							|  |  |  | 	matrix[3][2] = -2 * znear * zfar / deltaZ; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void CameraMatrix::set_perspective(real_t p_fovy_degrees, real_t p_aspect, real_t p_z_near, real_t p_z_far, bool p_flip_fov) { | 
					
						
							| 
									
										
										
										
											2014-09-15 20:06:37 -03:00
										 |  |  | 	if (p_flip_fov) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		p_fovy_degrees = get_fovy(p_fovy_degrees, 1.0 / p_aspect); | 
					
						
							| 
									
										
										
										
											2014-09-15 20:06:37 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-14 14:35:39 -06:00
										 |  |  | 	real_t sine, cotangent, deltaZ; | 
					
						
							| 
									
										
										
										
											2020-04-03 05:50:40 -04:00
										 |  |  | 	real_t radians = Math::deg2rad(p_fovy_degrees / 2.0); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	deltaZ = p_z_far - p_z_near; | 
					
						
							|  |  |  | 	sine = Math::sin(radians); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if ((deltaZ == 0) || (sine == 0) || (p_aspect == 0)) { | 
					
						
							|  |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	cotangent = Math::cos(radians) / sine; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	set_identity(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	matrix[0][0] = cotangent / p_aspect; | 
					
						
							|  |  |  | 	matrix[1][1] = cotangent; | 
					
						
							|  |  |  | 	matrix[2][2] = -(p_z_far + p_z_near) / deltaZ; | 
					
						
							|  |  |  | 	matrix[2][3] = -1; | 
					
						
							|  |  |  | 	matrix[3][2] = -2 * p_z_near * p_z_far / deltaZ; | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 	matrix[3][3] = 0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-23 22:10:41 +10:00
										 |  |  | void CameraMatrix::set_perspective(real_t p_fovy_degrees, real_t p_aspect, real_t p_z_near, real_t p_z_far, bool p_flip_fov, int p_eye, real_t p_intraocular_dist, real_t p_convergence_dist) { | 
					
						
							|  |  |  | 	if (p_flip_fov) { | 
					
						
							|  |  |  | 		p_fovy_degrees = get_fovy(p_fovy_degrees, 1.0 / p_aspect); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	real_t left, right, modeltranslation, ymax, xmax, frustumshift; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-03 05:50:40 -04:00
										 |  |  | 	ymax = p_z_near * tan(Math::deg2rad(p_fovy_degrees / 2.0)); | 
					
						
							| 
									
										
										
										
											2017-04-23 22:10:41 +10:00
										 |  |  | 	xmax = ymax * p_aspect; | 
					
						
							|  |  |  | 	frustumshift = (p_intraocular_dist / 2.0) * p_z_near / p_convergence_dist; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch (p_eye) { | 
					
						
							|  |  |  | 		case 1: { // left eye
 | 
					
						
							|  |  |  | 			left = -xmax + frustumshift; | 
					
						
							|  |  |  | 			right = xmax + frustumshift; | 
					
						
							|  |  |  | 			modeltranslation = p_intraocular_dist / 2.0; | 
					
						
							| 
									
										
										
										
											2020-05-19 15:46:49 +02:00
										 |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2017-04-23 22:10:41 +10:00
										 |  |  | 		case 2: { // right eye
 | 
					
						
							|  |  |  | 			left = -xmax - frustumshift; | 
					
						
							|  |  |  | 			right = xmax - frustumshift; | 
					
						
							|  |  |  | 			modeltranslation = -p_intraocular_dist / 2.0; | 
					
						
							| 
									
										
										
										
											2020-05-19 15:46:49 +02:00
										 |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2017-04-23 22:10:41 +10:00
										 |  |  | 		default: { // mono, should give the same result as set_perspective(p_fovy_degrees,p_aspect,p_z_near,p_z_far,p_flip_fov)
 | 
					
						
							|  |  |  | 			left = -xmax; | 
					
						
							|  |  |  | 			right = xmax; | 
					
						
							|  |  |  | 			modeltranslation = 0.0; | 
					
						
							| 
									
										
										
										
											2020-05-19 15:46:49 +02:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-04-23 22:10:41 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	set_frustum(left, right, -ymax, ymax, p_z_near, p_z_far); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// translate matrix by (modeltranslation, 0.0, 0.0)
 | 
					
						
							|  |  |  | 	CameraMatrix cm; | 
					
						
							|  |  |  | 	cm.set_identity(); | 
					
						
							|  |  |  | 	cm.matrix[3][0] = modeltranslation; | 
					
						
							|  |  |  | 	*this = *this * cm; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CameraMatrix::set_for_hmd(int p_eye, real_t p_aspect, real_t p_intraocular_dist, real_t p_display_width, real_t p_display_to_lens, real_t p_oversample, real_t p_z_near, real_t p_z_far) { | 
					
						
							|  |  |  | 	// we first calculate our base frustum on our values without taking our lens magnification into account.
 | 
					
						
							|  |  |  | 	real_t f1 = (p_intraocular_dist * 0.5) / p_display_to_lens; | 
					
						
							|  |  |  | 	real_t f2 = ((p_display_width - p_intraocular_dist) * 0.5) / p_display_to_lens; | 
					
						
							|  |  |  | 	real_t f3 = (p_display_width / 4.0) / p_display_to_lens; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// now we apply our oversample factor to increase our FOV. how much we oversample is always a balance we strike between performance and how much
 | 
					
						
							|  |  |  | 	// we're willing to sacrifice in FOV.
 | 
					
						
							|  |  |  | 	real_t add = ((f1 + f2) * (p_oversample - 1.0)) / 2.0; | 
					
						
							|  |  |  | 	f1 += add; | 
					
						
							|  |  |  | 	f2 += add; | 
					
						
							| 
									
										
										
										
											2017-12-03 22:32:42 +11:00
										 |  |  | 	f3 *= p_oversample; | 
					
						
							| 
									
										
										
										
											2017-04-23 22:10:41 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// always apply KEEP_WIDTH aspect ratio
 | 
					
						
							| 
									
										
										
										
											2020-04-05 16:56:43 +10:00
										 |  |  | 	f3 /= p_aspect; | 
					
						
							| 
									
										
										
										
											2017-04-23 22:10:41 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	switch (p_eye) { | 
					
						
							|  |  |  | 		case 1: { // left eye
 | 
					
						
							|  |  |  | 			set_frustum(-f2 * p_z_near, f1 * p_z_near, -f3 * p_z_near, f3 * p_z_near, p_z_near, p_z_far); | 
					
						
							| 
									
										
										
										
											2020-05-19 15:46:49 +02:00
										 |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2017-04-23 22:10:41 +10:00
										 |  |  | 		case 2: { // right eye
 | 
					
						
							|  |  |  | 			set_frustum(-f1 * p_z_near, f2 * p_z_near, -f3 * p_z_near, f3 * p_z_near, p_z_near, p_z_far); | 
					
						
							| 
									
										
										
										
											2020-05-19 15:46:49 +02:00
										 |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2017-04-23 22:10:41 +10:00
										 |  |  | 		default: { // mono, does not apply here!
 | 
					
						
							| 
									
										
										
										
											2020-05-19 15:46:49 +02:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-04-23 22:10:41 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void CameraMatrix::set_orthogonal(real_t p_left, real_t p_right, real_t p_bottom, real_t p_top, real_t p_znear, real_t p_zfar) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	set_identity(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	matrix[0][0] = 2.0 / (p_right - p_left); | 
					
						
							|  |  |  | 	matrix[3][0] = -((p_right + p_left) / (p_right - p_left)); | 
					
						
							|  |  |  | 	matrix[1][1] = 2.0 / (p_top - p_bottom); | 
					
						
							|  |  |  | 	matrix[3][1] = -((p_top + p_bottom) / (p_top - p_bottom)); | 
					
						
							|  |  |  | 	matrix[2][2] = -2.0 / (p_zfar - p_znear); | 
					
						
							|  |  |  | 	matrix[3][2] = -((p_zfar + p_znear) / (p_zfar - p_znear)); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	matrix[3][3] = 1.0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void CameraMatrix::set_orthogonal(real_t p_size, real_t p_aspect, real_t p_znear, real_t p_zfar, bool p_flip_fov) { | 
					
						
							| 
									
										
										
										
											2014-09-15 20:06:37 -03:00
										 |  |  | 	if (!p_flip_fov) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		p_size *= p_aspect; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	set_orthogonal(-p_size / 2, +p_size / 2, -p_size / p_aspect / 2, +p_size / p_aspect / 2, p_znear, p_zfar); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-14 14:35:39 -06:00
										 |  |  | void CameraMatrix::set_frustum(real_t p_left, real_t p_right, real_t p_bottom, real_t p_top, real_t p_near, real_t p_far) { | 
					
						
							| 
									
										
										
										
											2019-11-20 16:22:16 +01:00
										 |  |  | 	ERR_FAIL_COND(p_right <= p_left); | 
					
						
							|  |  |  | 	ERR_FAIL_COND(p_top <= p_bottom); | 
					
						
							|  |  |  | 	ERR_FAIL_COND(p_far <= p_near); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-14 14:35:39 -06:00
										 |  |  | 	real_t *te = &matrix[0][0]; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	real_t x = 2 * p_near / (p_right - p_left); | 
					
						
							|  |  |  | 	real_t y = 2 * p_near / (p_top - p_bottom); | 
					
						
							| 
									
										
										
										
											2015-03-02 00:54:10 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	real_t a = (p_right + p_left) / (p_right - p_left); | 
					
						
							|  |  |  | 	real_t b = (p_top + p_bottom) / (p_top - p_bottom); | 
					
						
							|  |  |  | 	real_t c = -(p_far + p_near) / (p_far - p_near); | 
					
						
							|  |  |  | 	real_t d = -2 * p_far * p_near / (p_far - p_near); | 
					
						
							| 
									
										
										
										
											2015-03-02 00:54:10 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 22:15:47 +01:00
										 |  |  | 	te[0] = x; | 
					
						
							|  |  |  | 	te[1] = 0; | 
					
						
							|  |  |  | 	te[2] = 0; | 
					
						
							|  |  |  | 	te[3] = 0; | 
					
						
							|  |  |  | 	te[4] = 0; | 
					
						
							|  |  |  | 	te[5] = y; | 
					
						
							|  |  |  | 	te[6] = 0; | 
					
						
							|  |  |  | 	te[7] = 0; | 
					
						
							|  |  |  | 	te[8] = a; | 
					
						
							|  |  |  | 	te[9] = b; | 
					
						
							|  |  |  | 	te[10] = c; | 
					
						
							|  |  |  | 	te[11] = -1; | 
					
						
							|  |  |  | 	te[12] = 0; | 
					
						
							|  |  |  | 	te[13] = 0; | 
					
						
							|  |  |  | 	te[14] = d; | 
					
						
							|  |  |  | 	te[15] = 0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-19 17:17:02 +01:00
										 |  |  | void CameraMatrix::set_frustum(real_t p_size, real_t p_aspect, Vector2 p_offset, real_t p_near, real_t p_far, bool p_flip_fov) { | 
					
						
							|  |  |  | 	if (!p_flip_fov) { | 
					
						
							|  |  |  | 		p_size *= p_aspect; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	set_frustum(-p_size / 2 + p_offset.x, +p_size / 2 + p_offset.x, -p_size / p_aspect / 2 + p_offset.y, +p_size / p_aspect / 2 + p_offset.y, p_near, p_far); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-14 14:35:39 -06:00
										 |  |  | real_t CameraMatrix::get_z_far() const { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	const real_t *matrix = (const real_t *)this->matrix; | 
					
						
							|  |  |  | 	Plane new_plane = Plane(matrix[3] - matrix[2], | 
					
						
							|  |  |  | 			matrix[7] - matrix[6], | 
					
						
							|  |  |  | 			matrix[11] - matrix[10], | 
					
						
							|  |  |  | 			matrix[15] - matrix[14]); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	new_plane.normal = -new_plane.normal; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	new_plane.normalize(); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-10 16:47:11 +02:00
										 |  |  | 	return new_plane.d; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2020-05-14 14:29:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-14 14:35:39 -06:00
										 |  |  | real_t CameraMatrix::get_z_near() const { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	const real_t *matrix = (const real_t *)this->matrix; | 
					
						
							|  |  |  | 	Plane new_plane = Plane(matrix[3] + matrix[2], | 
					
						
							|  |  |  | 			matrix[7] + matrix[6], | 
					
						
							|  |  |  | 			matrix[11] + matrix[10], | 
					
						
							|  |  |  | 			-matrix[15] - matrix[14]); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	new_plane.normalize(); | 
					
						
							| 
									
										
										
										
											2020-05-10 16:47:11 +02:00
										 |  |  | 	return new_plane.d; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-21 18:39:16 +00:00
										 |  |  | Vector2 CameraMatrix::get_viewport_half_extents() const { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	const real_t *matrix = (const real_t *)this->matrix; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	///////--- Near Plane ---///////
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Plane near_plane = Plane(matrix[3] + matrix[2], | 
					
						
							|  |  |  | 			matrix[7] + matrix[6], | 
					
						
							|  |  |  | 			matrix[11] + matrix[10], | 
					
						
							| 
									
										
										
										
											2017-01-16 20:32:44 +11:00
										 |  |  | 			-matrix[15] - matrix[14]); | 
					
						
							| 
									
										
										
										
											2017-01-15 22:15:47 +01:00
										 |  |  | 	near_plane.normalize(); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	///////--- Right Plane ---///////
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Plane right_plane = Plane(matrix[3] - matrix[0], | 
					
						
							|  |  |  | 			matrix[7] - matrix[4], | 
					
						
							|  |  |  | 			matrix[11] - matrix[8], | 
					
						
							|  |  |  | 			-matrix[15] + matrix[12]); | 
					
						
							| 
									
										
										
										
											2017-01-15 22:15:47 +01:00
										 |  |  | 	right_plane.normalize(); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Plane top_plane = Plane(matrix[3] - matrix[1], | 
					
						
							|  |  |  | 			matrix[7] - matrix[5], | 
					
						
							|  |  |  | 			matrix[11] - matrix[9], | 
					
						
							| 
									
										
										
										
											2017-01-16 20:32:44 +11:00
										 |  |  | 			-matrix[15] + matrix[13]); | 
					
						
							| 
									
										
										
										
											2017-01-15 22:15:47 +01:00
										 |  |  | 	top_plane.normalize(); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	Vector3 res; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	near_plane.intersect_3(right_plane, top_plane, &res); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-21 18:39:16 +00:00
										 |  |  | 	return Vector2(res.x, res.y); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-12 22:21:01 -03:00
										 |  |  | Vector2 CameraMatrix::get_far_plane_half_extents() const { | 
					
						
							| 
									
										
										
										
											2020-01-21 14:24:22 -03:00
										 |  |  | 	const real_t *matrix = (const real_t *)this->matrix; | 
					
						
							|  |  |  | 	///////--- Far Plane ---///////
 | 
					
						
							|  |  |  | 	Plane far_plane = Plane(matrix[3] - matrix[2], | 
					
						
							|  |  |  | 			matrix[7] - matrix[6], | 
					
						
							|  |  |  | 			matrix[11] - matrix[10], | 
					
						
							|  |  |  | 			-matrix[15] + matrix[14]); | 
					
						
							|  |  |  | 	far_plane.normalize(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	///////--- Right Plane ---///////
 | 
					
						
							|  |  |  | 	Plane right_plane = Plane(matrix[3] - matrix[0], | 
					
						
							|  |  |  | 			matrix[7] - matrix[4], | 
					
						
							|  |  |  | 			matrix[11] - matrix[8], | 
					
						
							|  |  |  | 			-matrix[15] + matrix[12]); | 
					
						
							|  |  |  | 	right_plane.normalize(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Plane top_plane = Plane(matrix[3] - matrix[1], | 
					
						
							|  |  |  | 			matrix[7] - matrix[5], | 
					
						
							|  |  |  | 			matrix[11] - matrix[9], | 
					
						
							|  |  |  | 			-matrix[15] + matrix[13]); | 
					
						
							|  |  |  | 	top_plane.normalize(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector3 res; | 
					
						
							|  |  |  | 	far_plane.intersect_3(right_plane, top_plane, &res); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-12 22:21:01 -03:00
										 |  |  | 	return Vector2(res.x, res.y); | 
					
						
							| 
									
										
										
										
											2020-01-21 14:24:22 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | bool CameraMatrix::get_endpoints(const Transform &p_transform, Vector3 *p_8points) const { | 
					
						
							| 
									
										
										
										
											2017-09-07 18:00:47 -03:00
										 |  |  | 	Vector<Plane> planes = get_projection_planes(Transform()); | 
					
						
							| 
									
										
										
										
											2017-09-02 22:32:31 +02:00
										 |  |  | 	const Planes intersections[8][3] = { | 
					
						
							|  |  |  | 		{ PLANE_FAR, PLANE_LEFT, PLANE_TOP }, | 
					
						
							|  |  |  | 		{ PLANE_FAR, PLANE_LEFT, PLANE_BOTTOM }, | 
					
						
							|  |  |  | 		{ PLANE_FAR, PLANE_RIGHT, PLANE_TOP }, | 
					
						
							|  |  |  | 		{ PLANE_FAR, PLANE_RIGHT, PLANE_BOTTOM }, | 
					
						
							|  |  |  | 		{ PLANE_NEAR, PLANE_LEFT, PLANE_TOP }, | 
					
						
							|  |  |  | 		{ PLANE_NEAR, PLANE_LEFT, PLANE_BOTTOM }, | 
					
						
							|  |  |  | 		{ PLANE_NEAR, PLANE_RIGHT, PLANE_TOP }, | 
					
						
							|  |  |  | 		{ PLANE_NEAR, PLANE_RIGHT, PLANE_BOTTOM }, | 
					
						
							| 
									
										
										
										
											2017-09-07 18:00:47 -03:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2017-04-23 22:10:41 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-02 22:32:31 +02:00
										 |  |  | 	for (int i = 0; i < 8; i++) { | 
					
						
							| 
									
										
										
										
											2017-09-07 18:00:47 -03:00
										 |  |  | 		Vector3 point; | 
					
						
							| 
									
										
										
										
											2017-09-02 22:32:31 +02:00
										 |  |  | 		bool res = planes[intersections[i][0]].intersect_3(planes[intersections[i][1]], planes[intersections[i][2]], &point); | 
					
						
							| 
									
										
										
										
											2017-04-23 22:10:41 +10:00
										 |  |  | 		ERR_FAIL_COND_V(!res, false); | 
					
						
							| 
									
										
										
										
											2017-09-02 22:32:31 +02:00
										 |  |  | 		p_8points[i] = p_transform.xform(point); | 
					
						
							| 
									
										
										
										
											2017-04-23 22:10:41 +10:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | Vector<Plane> CameraMatrix::get_projection_planes(const Transform &p_transform) const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	/** Fast Plane Extraction from combined modelview/projection matrices.
 | 
					
						
							|  |  |  | 	 * References: | 
					
						
							| 
									
										
										
										
											2019-07-23 21:06:12 -03:00
										 |  |  | 	 * https://web.archive.org/web/20011221205252/http://www.markmorley.com/opengl/frustumculling.html
 | 
					
						
							|  |  |  | 	 * https://web.archive.org/web/20061020020112/http://www2.ravensoft.com/users/ggribb/plane%20extraction.pdf
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	Vector<Plane> planes; | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	const real_t *matrix = (const real_t *)this->matrix; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Plane new_plane; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	///////--- Near Plane ---///////
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	new_plane = Plane(matrix[3] + matrix[2], | 
					
						
							|  |  |  | 			matrix[7] + matrix[6], | 
					
						
							|  |  |  | 			matrix[11] + matrix[10], | 
					
						
							|  |  |  | 			matrix[15] + matrix[14]); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	new_plane.normal = -new_plane.normal; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	new_plane.normalize(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	planes.push_back(p_transform.xform(new_plane)); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	///////--- Far Plane ---///////
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	new_plane = Plane(matrix[3] - matrix[2], | 
					
						
							|  |  |  | 			matrix[7] - matrix[6], | 
					
						
							|  |  |  | 			matrix[11] - matrix[10], | 
					
						
							|  |  |  | 			matrix[15] - matrix[14]); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	new_plane.normal = -new_plane.normal; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	new_plane.normalize(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	planes.push_back(p_transform.xform(new_plane)); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	///////--- Left Plane ---///////
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	new_plane = Plane(matrix[3] + matrix[0], | 
					
						
							|  |  |  | 			matrix[7] + matrix[4], | 
					
						
							|  |  |  | 			matrix[11] + matrix[8], | 
					
						
							|  |  |  | 			matrix[15] + matrix[12]); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	new_plane.normal = -new_plane.normal; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	new_plane.normalize(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	planes.push_back(p_transform.xform(new_plane)); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	///////--- Top Plane ---///////
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	new_plane = Plane(matrix[3] - matrix[1], | 
					
						
							|  |  |  | 			matrix[7] - matrix[5], | 
					
						
							|  |  |  | 			matrix[11] - matrix[9], | 
					
						
							|  |  |  | 			matrix[15] - matrix[13]); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	new_plane.normal = -new_plane.normal; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	new_plane.normalize(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	planes.push_back(p_transform.xform(new_plane)); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	///////--- Right Plane ---///////
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	new_plane = Plane(matrix[3] - matrix[0], | 
					
						
							|  |  |  | 			matrix[7] - matrix[4], | 
					
						
							|  |  |  | 			matrix[11] - matrix[8], | 
					
						
							|  |  |  | 			matrix[15] - matrix[12]); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	new_plane.normal = -new_plane.normal; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	new_plane.normalize(); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	planes.push_back(p_transform.xform(new_plane)); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	///////--- Bottom Plane ---///////
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	new_plane = Plane(matrix[3] + matrix[1], | 
					
						
							|  |  |  | 			matrix[7] + matrix[5], | 
					
						
							|  |  |  | 			matrix[11] + matrix[9], | 
					
						
							|  |  |  | 			matrix[15] + matrix[13]); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	new_plane.normal = -new_plane.normal; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	new_plane.normalize(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	planes.push_back(p_transform.xform(new_plane)); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return planes; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CameraMatrix CameraMatrix::inverse() const { | 
					
						
							|  |  |  | 	CameraMatrix cm = *this; | 
					
						
							|  |  |  | 	cm.invert(); | 
					
						
							|  |  |  | 	return cm; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CameraMatrix::invert() { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int i, j, k; | 
					
						
							|  |  |  | 	int pvt_i[4], pvt_j[4]; /* Locations of pivot matrix */ | 
					
						
							|  |  |  | 	real_t pvt_val; /* Value of current pivot element */ | 
					
						
							|  |  |  | 	real_t hold; /* Temporary storage */ | 
					
						
							|  |  |  | 	real_t determinat; /* Determinant */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	determinat = 1.0; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (k = 0; k < 4; k++) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		/** Locate k'th pivot element **/ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		pvt_val = matrix[k][k]; /** Initialize for search **/ | 
					
						
							|  |  |  | 		pvt_i[k] = k; | 
					
						
							|  |  |  | 		pvt_j[k] = k; | 
					
						
							|  |  |  | 		for (i = k; i < 4; i++) { | 
					
						
							|  |  |  | 			for (j = k; j < 4; j++) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				if (Math::absd(matrix[i][j]) > Math::absd(pvt_val)) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					pvt_i[k] = i; | 
					
						
							|  |  |  | 					pvt_j[k] = j; | 
					
						
							|  |  |  | 					pvt_val = matrix[i][j]; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/** Product of pivots, gives determinant when finished **/ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		determinat *= pvt_val; | 
					
						
							|  |  |  | 		if (Math::absd(determinat) < 1e-7) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			return; //(false);  /** Matrix is singular (zero determinant). **/
 | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/** "Interchange" rows (with sign change stuff) **/ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		i = pvt_i[k]; | 
					
						
							|  |  |  | 		if (i != k) { /** If rows are different **/ | 
					
						
							|  |  |  | 			for (j = 0; j < 4; j++) { | 
					
						
							|  |  |  | 				hold = -matrix[k][j]; | 
					
						
							|  |  |  | 				matrix[k][j] = matrix[i][j]; | 
					
						
							|  |  |  | 				matrix[i][j] = hold; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/** "Interchange" columns **/ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		j = pvt_j[k]; | 
					
						
							|  |  |  | 		if (j != k) { /** If columns are different **/ | 
					
						
							|  |  |  | 			for (i = 0; i < 4; i++) { | 
					
						
							|  |  |  | 				hold = -matrix[i][k]; | 
					
						
							|  |  |  | 				matrix[i][k] = matrix[i][j]; | 
					
						
							|  |  |  | 				matrix[i][j] = hold; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/** Divide column by minus pivot value **/ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		for (i = 0; i < 4; i++) { | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 			if (i != k) { | 
					
						
							| 
									
										
										
										
											2020-05-10 12:56:01 +02:00
										 |  |  | 				matrix[i][k] /= (-pvt_val); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/** Reduce the matrix **/ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		for (i = 0; i < 4; i++) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			hold = matrix[i][k]; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			for (j = 0; j < 4; j++) { | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 				if (i != k && j != k) { | 
					
						
							| 
									
										
										
										
											2020-05-10 12:56:01 +02:00
										 |  |  | 					matrix[i][j] += hold * matrix[k][j]; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/** Divide row by pivot **/ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		for (j = 0; j < 4; j++) { | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 			if (j != k) { | 
					
						
							| 
									
										
										
										
											2020-05-10 12:56:01 +02:00
										 |  |  | 				matrix[k][j] /= pvt_val; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/** Replace pivot by reciprocal (at last we can touch it). **/ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		matrix[k][k] = 1.0 / pvt_val; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* That was most of the work, one final pass of row/column interchange */ | 
					
						
							|  |  |  | 	/* to finish */ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (k = 4 - 2; k >= 0; k--) { /* Don't need to work with 1 by 1 corner*/ | 
					
						
							|  |  |  | 		i = pvt_j[k]; /* Rows to swap correspond to pivot COLUMN */ | 
					
						
							|  |  |  | 		if (i != k) { /* If rows are different */ | 
					
						
							|  |  |  | 			for (j = 0; j < 4; j++) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				hold = matrix[k][j]; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				matrix[k][j] = -matrix[i][j]; | 
					
						
							|  |  |  | 				matrix[i][j] = hold; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		j = pvt_i[k]; /* Columns to swap correspond to pivot ROW */ | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		if (j != k) { /* If columns are different */ | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			for (i = 0; i < 4; i++) { | 
					
						
							|  |  |  | 				hold = matrix[i][k]; | 
					
						
							|  |  |  | 				matrix[i][k] = -matrix[i][j]; | 
					
						
							|  |  |  | 				matrix[i][j] = hold; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-20 17:54:03 -03:00
										 |  |  | void CameraMatrix::flip_y() { | 
					
						
							|  |  |  | 	for (int i = 0; i < 4; i++) { | 
					
						
							|  |  |  | 		matrix[1][i] = -matrix[1][i]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | CameraMatrix::CameraMatrix() { | 
					
						
							|  |  |  | 	set_identity(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | CameraMatrix CameraMatrix::operator*(const CameraMatrix &p_matrix) const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	CameraMatrix new_matrix; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (int j = 0; j < 4; j++) { | 
					
						
							|  |  |  | 		for (int i = 0; i < 4; i++) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			real_t ab = 0; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 			for (int k = 0; k < 4; k++) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				ab += matrix[k][i] * p_matrix.matrix[j][k]; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			new_matrix.matrix[j][i] = ab; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return new_matrix; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-09 17:50:51 -03:00
										 |  |  | void CameraMatrix::set_depth_correction(bool p_flip_y) { | 
					
						
							| 
									
										
										
										
											2019-09-06 22:51:27 -03:00
										 |  |  | 	real_t *m = &matrix[0][0]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	m[0] = 1; | 
					
						
							|  |  |  | 	m[1] = 0.0; | 
					
						
							|  |  |  | 	m[2] = 0.0; | 
					
						
							|  |  |  | 	m[3] = 0.0; | 
					
						
							|  |  |  | 	m[4] = 0.0; | 
					
						
							| 
									
										
										
										
											2019-09-09 17:50:51 -03:00
										 |  |  | 	m[5] = p_flip_y ? -1 : 1; | 
					
						
							| 
									
										
										
										
											2019-09-06 22:51:27 -03:00
										 |  |  | 	m[6] = 0.0; | 
					
						
							|  |  |  | 	m[7] = 0.0; | 
					
						
							|  |  |  | 	m[8] = 0.0; | 
					
						
							|  |  |  | 	m[9] = 0.0; | 
					
						
							|  |  |  | 	m[10] = 0.5; | 
					
						
							|  |  |  | 	m[11] = 0.0; | 
					
						
							|  |  |  | 	m[12] = 0.0; | 
					
						
							|  |  |  | 	m[13] = 0.0; | 
					
						
							|  |  |  | 	m[14] = 0.5; | 
					
						
							|  |  |  | 	m[15] = 1.0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | void CameraMatrix::set_light_bias() { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	real_t *m = &matrix[0][0]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-01 12:59:42 +02:00
										 |  |  | 	m[0] = 0.5; | 
					
						
							|  |  |  | 	m[1] = 0.0; | 
					
						
							|  |  |  | 	m[2] = 0.0; | 
					
						
							|  |  |  | 	m[3] = 0.0; | 
					
						
							|  |  |  | 	m[4] = 0.0; | 
					
						
							|  |  |  | 	m[5] = 0.5; | 
					
						
							|  |  |  | 	m[6] = 0.0; | 
					
						
							|  |  |  | 	m[7] = 0.0; | 
					
						
							|  |  |  | 	m[8] = 0.0; | 
					
						
							|  |  |  | 	m[9] = 0.0; | 
					
						
							|  |  |  | 	m[10] = 0.5; | 
					
						
							|  |  |  | 	m[11] = 0.0; | 
					
						
							|  |  |  | 	m[12] = 0.5; | 
					
						
							|  |  |  | 	m[13] = 0.5; | 
					
						
							|  |  |  | 	m[14] = 0.5; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	m[15] = 1.0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void CameraMatrix::set_light_atlas_rect(const Rect2 &p_rect) { | 
					
						
							|  |  |  | 	real_t *m = &matrix[0][0]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-01 12:59:42 +02:00
										 |  |  | 	m[0] = p_rect.size.width; | 
					
						
							|  |  |  | 	m[1] = 0.0; | 
					
						
							|  |  |  | 	m[2] = 0.0; | 
					
						
							|  |  |  | 	m[3] = 0.0; | 
					
						
							|  |  |  | 	m[4] = 0.0; | 
					
						
							|  |  |  | 	m[5] = p_rect.size.height; | 
					
						
							|  |  |  | 	m[6] = 0.0; | 
					
						
							|  |  |  | 	m[7] = 0.0; | 
					
						
							|  |  |  | 	m[8] = 0.0; | 
					
						
							|  |  |  | 	m[9] = 0.0; | 
					
						
							|  |  |  | 	m[10] = 1.0; | 
					
						
							|  |  |  | 	m[11] = 0.0; | 
					
						
							|  |  |  | 	m[12] = p_rect.position.x; | 
					
						
							|  |  |  | 	m[13] = p_rect.position.y; | 
					
						
							|  |  |  | 	m[14] = 0.0; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	m[15] = 1.0; | 
					
						
							| 
									
										
										
										
											2016-11-09 23:55:06 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | CameraMatrix::operator String() const { | 
					
						
							|  |  |  | 	String str; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	for (int i = 0; i < 4; i++) { | 
					
						
							|  |  |  | 		for (int j = 0; j < 4; j++) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			str += String((j > 0) ? ", " : "\n") + rtos(matrix[i][j]); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return str; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-14 14:35:39 -06:00
										 |  |  | real_t CameraMatrix::get_aspect() const { | 
					
						
							| 
									
										
										
										
											2020-01-21 18:39:16 +00:00
										 |  |  | 	Vector2 vp_he = get_viewport_half_extents(); | 
					
						
							|  |  |  | 	return vp_he.x / vp_he.y; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-04 12:45:30 -03:00
										 |  |  | int CameraMatrix::get_pixels_per_meter(int p_for_pixel_width) const { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Vector3 result = xform(Vector3(1, 0, -1)); | 
					
						
							| 
									
										
										
										
											2016-12-04 12:45:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return int((result.x * 0.5 + 0.5) * p_for_pixel_width); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 18:00:47 -03:00
										 |  |  | bool CameraMatrix::is_orthogonal() const { | 
					
						
							| 
									
										
										
										
											2017-09-02 22:32:31 +02:00
										 |  |  | 	return matrix[3][3] == 1.0; | 
					
						
							| 
									
										
										
										
											2017-09-07 18:00:47 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-14 14:35:39 -06:00
										 |  |  | real_t CameraMatrix::get_fov() const { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	const real_t *matrix = (const real_t *)this->matrix; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Plane right_plane = Plane(matrix[3] - matrix[0], | 
					
						
							|  |  |  | 			matrix[7] - matrix[4], | 
					
						
							|  |  |  | 			matrix[11] - matrix[8], | 
					
						
							|  |  |  | 			-matrix[15] + matrix[12]); | 
					
						
							| 
									
										
										
										
											2017-01-15 22:15:47 +01:00
										 |  |  | 	right_plane.normalize(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-23 22:10:41 +10:00
										 |  |  | 	if ((matrix[8] == 0) && (matrix[9] == 0)) { | 
					
						
							|  |  |  | 		return Math::rad2deg(Math::acos(Math::abs(right_plane.normal.x))) * 2.0; | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2017-09-19 15:51:00 +07:00
										 |  |  | 		// our frustum is asymmetrical need to calculate the left planes angle separately..
 | 
					
						
							| 
									
										
										
										
											2017-04-23 22:10:41 +10:00
										 |  |  | 		Plane left_plane = Plane(matrix[3] + matrix[0], | 
					
						
							|  |  |  | 				matrix[7] + matrix[4], | 
					
						
							|  |  |  | 				matrix[11] + matrix[8], | 
					
						
							|  |  |  | 				matrix[15] + matrix[12]); | 
					
						
							|  |  |  | 		left_plane.normalize(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return Math::rad2deg(Math::acos(Math::abs(left_plane.normal.x))) + Math::rad2deg(Math::acos(Math::abs(right_plane.normal.x))); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-17 15:56:59 -03:00
										 |  |  | float CameraMatrix::get_lod_multiplier() const { | 
					
						
							|  |  |  | 	if (is_orthogonal()) { | 
					
						
							|  |  |  | 		return get_viewport_half_extents().x; | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		float zn = get_z_near(); | 
					
						
							|  |  |  | 		float width = get_viewport_half_extents().x * 2.0; | 
					
						
							|  |  |  | 		return 1.0 / (zn / width); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//usage is lod_size / (lod_distance * multiplier) < threshold
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | void CameraMatrix::make_scale(const Vector3 &p_scale) { | 
					
						
							|  |  |  | 	set_identity(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	matrix[0][0] = p_scale.x; | 
					
						
							|  |  |  | 	matrix[1][1] = p_scale.y; | 
					
						
							|  |  |  | 	matrix[2][2] = p_scale.z; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 21:09:00 -05:00
										 |  |  | void CameraMatrix::scale_translate_to_fit(const AABB &p_aabb) { | 
					
						
							| 
									
										
										
										
											2017-06-06 20:33:51 +02:00
										 |  |  | 	Vector3 min = p_aabb.position; | 
					
						
							|  |  |  | 	Vector3 max = p_aabb.position + p_aabb.size; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	matrix[0][0] = 2 / (max.x - min.x); | 
					
						
							|  |  |  | 	matrix[1][0] = 0; | 
					
						
							|  |  |  | 	matrix[2][0] = 0; | 
					
						
							|  |  |  | 	matrix[3][0] = -(max.x + min.x) / (max.x - min.x); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	matrix[0][1] = 0; | 
					
						
							|  |  |  | 	matrix[1][1] = 2 / (max.y - min.y); | 
					
						
							|  |  |  | 	matrix[2][1] = 0; | 
					
						
							|  |  |  | 	matrix[3][1] = -(max.y + min.y) / (max.y - min.y); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	matrix[0][2] = 0; | 
					
						
							|  |  |  | 	matrix[1][2] = 0; | 
					
						
							|  |  |  | 	matrix[2][2] = 2 / (max.z - min.z); | 
					
						
							|  |  |  | 	matrix[3][2] = -(max.z + min.z) / (max.z - min.z); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	matrix[0][3] = 0; | 
					
						
							|  |  |  | 	matrix[1][3] = 0; | 
					
						
							|  |  |  | 	matrix[2][3] = 0; | 
					
						
							|  |  |  | 	matrix[3][3] = 1; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CameraMatrix::operator Transform() const { | 
					
						
							|  |  |  | 	Transform tr; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	const real_t *m = &matrix[0][0]; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	tr.basis.elements[0][0] = m[0]; | 
					
						
							|  |  |  | 	tr.basis.elements[1][0] = m[1]; | 
					
						
							|  |  |  | 	tr.basis.elements[2][0] = m[2]; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	tr.basis.elements[0][1] = m[4]; | 
					
						
							|  |  |  | 	tr.basis.elements[1][1] = m[5]; | 
					
						
							|  |  |  | 	tr.basis.elements[2][1] = m[6]; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	tr.basis.elements[0][2] = m[8]; | 
					
						
							|  |  |  | 	tr.basis.elements[1][2] = m[9]; | 
					
						
							|  |  |  | 	tr.basis.elements[2][2] = m[10]; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	tr.origin.x = m[12]; | 
					
						
							|  |  |  | 	tr.origin.y = m[13]; | 
					
						
							|  |  |  | 	tr.origin.z = m[14]; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return tr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | CameraMatrix::CameraMatrix(const Transform &p_transform) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	const Transform &tr = p_transform; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	real_t *m = &matrix[0][0]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	m[0] = tr.basis.elements[0][0]; | 
					
						
							|  |  |  | 	m[1] = tr.basis.elements[1][0]; | 
					
						
							|  |  |  | 	m[2] = tr.basis.elements[2][0]; | 
					
						
							|  |  |  | 	m[3] = 0.0; | 
					
						
							|  |  |  | 	m[4] = tr.basis.elements[0][1]; | 
					
						
							|  |  |  | 	m[5] = tr.basis.elements[1][1]; | 
					
						
							|  |  |  | 	m[6] = tr.basis.elements[2][1]; | 
					
						
							|  |  |  | 	m[7] = 0.0; | 
					
						
							|  |  |  | 	m[8] = tr.basis.elements[0][2]; | 
					
						
							|  |  |  | 	m[9] = tr.basis.elements[1][2]; | 
					
						
							|  |  |  | 	m[10] = tr.basis.elements[2][2]; | 
					
						
							|  |  |  | 	m[11] = 0.0; | 
					
						
							|  |  |  | 	m[12] = tr.origin.x; | 
					
						
							|  |  |  | 	m[13] = tr.origin.y; | 
					
						
							|  |  |  | 	m[14] = tr.origin.z; | 
					
						
							|  |  |  | 	m[15] = 1.0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | CameraMatrix::~CameraMatrix() { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } |