This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/source/blender/blenkernel/intern/subdiv_inline.h
Sergey Sharybin b49dbb635a Subdiv: Make Blender crease to OSD sharpness reusable
Makes it so conversion is centralized in a single place.

We might consider removing any conversion, passing value as-is which
will be easier for I/O scripts to match crease. The downside of that
would be loose of control range in certain qualities and values of
crease.

There shouldn't be any functional changes in this commit.
2020-03-19 10:33:51 +01:00

119 lines
3.5 KiB
C++

/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2018 by Blender Foundation.
* All rights reserved.
*/
/** \file
* \ingroup bke
*/
#ifndef __SUBDIV_INLINE_H__
#define __SUBDIV_INLINE_H__
#include "BLI_assert.h"
#include "BLI_compiler_compat.h"
#include "BKE_subdiv.h"
BLI_INLINE void BKE_subdiv_ptex_face_uv_to_grid_uv(const float ptex_u,
const float ptex_v,
float *r_grid_u,
float *r_grid_v)
{
*r_grid_u = 1.0f - ptex_v;
*r_grid_v = 1.0f - ptex_u;
}
BLI_INLINE void BKE_subdiv_grid_uv_to_ptex_face_uv(const float grid_u,
const float grid_v,
float *r_ptex_u,
float *r_ptex_v)
{
*r_ptex_u = 1.0f - grid_v;
*r_ptex_v = 1.0f - grid_u;
}
BLI_INLINE int BKE_subdiv_grid_size_from_level(const int level)
{
return (1 << (level - 1)) + 1;
}
BLI_INLINE int BKE_subdiv_rotate_quad_to_corner(const float quad_u,
const float quad_v,
float *r_corner_u,
float *r_corner_v)
{
int corner;
if (quad_u <= 0.5f && quad_v <= 0.5f) {
corner = 0;
*r_corner_u = 2.0f * quad_u;
*r_corner_v = 2.0f * quad_v;
}
else if (quad_u > 0.5f && quad_v <= 0.5f) {
corner = 1;
*r_corner_u = 2.0f * quad_v;
*r_corner_v = 2.0f * (1.0f - quad_u);
}
else if (quad_u > 0.5f && quad_v > 0.5f) {
corner = 2;
*r_corner_u = 2.0f * (1.0f - quad_u);
*r_corner_v = 2.0f * (1.0f - quad_v);
}
else {
BLI_assert(quad_u <= 0.5f && quad_v >= 0.5f);
corner = 3;
*r_corner_u = 2.0f * (1.0f - quad_v);
*r_corner_v = 2.0f * quad_u;
}
return corner;
}
BLI_INLINE void BKE_subdiv_rotate_grid_to_quad(
const int corner, const float grid_u, const float grid_v, float *r_quad_u, float *r_quad_v)
{
if (corner == 0) {
*r_quad_u = 0.5f - grid_v * 0.5f;
*r_quad_v = 0.5f - grid_u * 0.5f;
}
else if (corner == 1) {
*r_quad_u = 0.5f + grid_u * 0.5f;
*r_quad_v = 0.5f - grid_v * 0.5f;
}
else if (corner == 2) {
*r_quad_u = 0.5f + grid_v * 0.5f;
*r_quad_v = 0.5f + grid_u * 0.5f;
}
else {
BLI_assert(corner == 3);
*r_quad_u = 0.5f - grid_u * 0.5f;
*r_quad_v = 0.5f + grid_v * 0.5f;
}
}
BLI_INLINE float BKE_subdiv_edge_crease_to_sharpness_f(float edge_crease)
{
return edge_crease * edge_crease * 10.0f;
}
BLI_INLINE float BKE_subdiv_edge_crease_to_sharpness_char(char edge_crease)
{
const float edge_crease_f = edge_crease / 255.0f;
return BKE_subdiv_edge_crease_to_sharpness_f(edge_crease_f);
}
#endif /* __SUBDIV_INLINE_H__ */