Files
test2/source/blender/blenkernel/intern/subdiv_inline.h
Sergey Sharybin fb053ae2e5 Multires: Correct averaging
Before that only normal component was averaged, which is not
really correct.

Unfortunately, the new code is somewhat slower due to more
involved math to deal properly with non-quad faces, but the
plan is to move averaging from runtime to edit time, This
means, that mdisps will always be continuous around the edges
and no averaging on every frame change of animated character
will be needed.
2019-01-18 12:29:53 +01:00

113 lines
2.9 KiB
C

/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* 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.
*
* Contributor(s): Sergey Sharybin.
*
* ***** END GPL LICENSE BLOCK *****
*/
/** \file blender/blenkernel/intern/subdiv_inline.h
* \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;
}
}
#endif /* __SUBDIV_INLINE_H__ */