Blender V5.0
subdiv_inline.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2018 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include "BLI_assert.h"
12#include "BLI_compiler_compat.h"
13
14#include "BKE_subdiv.hh"
15
16#include <cmath>
17
18namespace blender::bke::subdiv {
19
20BLI_INLINE void ptex_face_uv_to_grid_uv(const float ptex_u,
21 const float ptex_v,
22 float *r_grid_u,
23 float *r_grid_v)
24{
25 *r_grid_u = 1.0f - ptex_v;
26 *r_grid_v = 1.0f - ptex_u;
27}
28
30{
31 return float2(1.0f - ptex_uv.y, 1.0f - ptex_uv.x);
32}
33
34BLI_INLINE void grid_uv_to_ptex_face_uv(const float grid_u,
35 const float grid_v,
36 float *r_ptex_u,
37 float *r_ptex_v)
38{
39 *r_ptex_u = 1.0f - grid_v;
40 *r_ptex_v = 1.0f - grid_u;
41}
42
43BLI_INLINE int grid_size_from_level(const int level)
44{
45 return (1 << (level - 1)) + 1;
46}
47
48BLI_INLINE int rotate_quad_to_corner(const float quad_u,
49 const float quad_v,
50 float *r_corner_u,
51 float *r_corner_v)
52{
53 int corner;
54 if (quad_u <= 0.5f && quad_v <= 0.5f) {
55 corner = 0;
56 *r_corner_u = 2.0f * quad_u;
57 *r_corner_v = 2.0f * quad_v;
58 }
59 else if (quad_u > 0.5f && quad_v <= 0.5f) {
60 corner = 1;
61 *r_corner_u = 2.0f * quad_v;
62 *r_corner_v = 2.0f * (1.0f - quad_u);
63 }
64 else if (quad_u > 0.5f && quad_v > 0.5f) {
65 corner = 2;
66 *r_corner_u = 2.0f * (1.0f - quad_u);
67 *r_corner_v = 2.0f * (1.0f - quad_v);
68 }
69 else {
70 BLI_assert(quad_u <= 0.5f && quad_v >= 0.5f);
71 corner = 3;
72 *r_corner_u = 2.0f * (1.0f - quad_v);
73 *r_corner_v = 2.0f * quad_u;
74 }
75 return corner;
76}
77
79{
80 switch (corner) {
81 case 0:
82 return 2.0f * quad;
83 case 1:
84 return {2.0f * quad.y, 2.0f * (1.0f - quad.x)};
85 case 2:
86 return 2.0f * (1.0f - quad);
87 case 3:
88 default:
89 BLI_assert(corner == 3);
90 return {2.0f * (1.0f - quad.y), 2.0f * quad.x};
91 }
92}
93
95 const int corner, const float grid_u, const float grid_v, float *r_quad_u, float *r_quad_v)
96{
97 if (corner == 0) {
98 *r_quad_u = 0.5f - grid_v * 0.5f;
99 *r_quad_v = 0.5f - grid_u * 0.5f;
100 }
101 else if (corner == 1) {
102 *r_quad_u = 0.5f + grid_u * 0.5f;
103 *r_quad_v = 0.5f - grid_v * 0.5f;
104 }
105 else if (corner == 2) {
106 *r_quad_u = 0.5f + grid_v * 0.5f;
107 *r_quad_v = 0.5f + grid_u * 0.5f;
108 }
109 else {
110 BLI_assert(corner == 3);
111 *r_quad_u = 0.5f - grid_u * 0.5f;
112 *r_quad_v = 0.5f + grid_v * 0.5f;
113 }
114}
115
117{
118 return crease * crease * 10.0f;
119}
120
121BLI_INLINE float sharpness_to_crease(float sharpness)
122{
123 return sqrt(sharpness * 0.1f);
124}
125
126} // namespace blender::bke::subdiv
#define BLI_assert(a)
Definition BLI_assert.h:46
#define BLI_INLINE
blender::gpu::Batch * quad
#define sqrt
BLI_INLINE float crease_to_sharpness(float crease)
BLI_INLINE void rotate_grid_to_quad(int corner, float grid_u, float grid_v, float *r_quad_u, float *r_quad_v)
BLI_INLINE void grid_uv_to_ptex_face_uv(float grid_u, float grid_v, float *r_ptex_u, float *r_ptex_v)
BLI_INLINE float sharpness_to_crease(float sharpness)
BLI_INLINE void ptex_face_uv_to_grid_uv(float ptex_u, float ptex_v, float *r_grid_u, float *r_grid_v)
BLI_INLINE int grid_size_from_level(int level)
BLI_INLINE int rotate_quad_to_corner(float quad_u, float quad_v, float *r_corner_u, float *r_corner_v)
VecBase< float, 2 > float2