Blender V5.0
projection_inverse.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
7#include "util/defines.h"
8
10
12 ccl_private float M[4][4])
13{
14 /* SPDX-License-Identifier: BSD-3-Clause
15 * Adapted from code:
16 * Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
17 * Digital Ltd. LLC. All rights reserved. */
18
19 /* forward elimination */
20 for (int i = 0; i < 4; i++) {
21 int pivot = i;
22 float pivotsize = M[i][i];
23
24 if (pivotsize < 0) {
25 pivotsize = -pivotsize;
26 }
27
28 for (int j = i + 1; j < 4; j++) {
29 float tmp = M[j][i];
30
31 if (tmp < 0) {
32 tmp = -tmp;
33 }
34
35 if (tmp > pivotsize) {
36 pivot = j;
37 pivotsize = tmp;
38 }
39 }
40
41 if (UNLIKELY(pivotsize == 0.0f)) {
42 return false;
43 }
44
45 if (pivot != i) {
46 for (int j = 0; j < 4; j++) {
47 float tmp;
48
49 tmp = M[i][j];
50 M[i][j] = M[pivot][j];
51 M[pivot][j] = tmp;
52
53 tmp = R[i][j];
54 R[i][j] = R[pivot][j];
55 R[pivot][j] = tmp;
56 }
57 }
58
59 for (int j = i + 1; j < 4; j++) {
60 const float f = M[j][i] / M[i][i];
61
62 for (int k = 0; k < 4; k++) {
63 M[j][k] -= f * M[i][k];
64 R[j][k] -= f * R[i][k];
65 }
66 }
67 }
68
69 /* backward substitution */
70 for (int i = 3; i >= 0; --i) {
71 float f = M[i][i];
72
73 if (UNLIKELY(f == 0.0f)) {
74 return false;
75 }
76
77 for (int j = 0; j < 4; j++) {
78 M[i][j] /= f;
79 R[i][j] /= f;
80 }
81
82 for (int j = 0; j < i; j++) {
83 f = M[j][i];
84
85 for (int k = 0; k < 4; k++) {
86 M[j][k] -= f * M[i][k];
87 R[j][k] -= f * R[i][k];
88 }
89 }
90 }
91
92 return true;
93}
94
#define UNLIKELY(x)
#define ccl_device_forceinline
#define ccl_private
#define CCL_NAMESPACE_END
#define M
#define R
CCL_NAMESPACE_BEGIN ccl_device_forceinline bool projection_inverse_impl(ccl_private float R[4][4], ccl_private float M[4][4])
i
Definition text_draw.cc:230