forked from bartvdbraak/blender
289c8b5758
This patch adds a new remeshing modifier. The algorithm is based on the paper "Dual Contouring of Hermite Data", and the implementation was contributed to Blender by Dr. Tao Ju. The contributed code is in intern/dualcon, and was modified to compile under gcc and work on 64-bit systems. Files not needed for Blender were removed and a small C wrapper was added in order to interface it with Blender. The rest of the patch is just standard modifier stuff. Reviewed by Sergey, code review link: http://codereview.appspot.com/5491053/ The remesh icon was contributed by Zafio: http://blenderartists.org/forum/showthread.php?240751-Request-for-modifier-icon/page2. Thanks to everyone in that thread for the icon proposals and discussion. Documentation and examples on the Blender wiki: http://wiki.blender.org/index.php/User:Nicholasbishop/RemeshModifier In case the history is needed for anything, check the remesh-modifier branch of this git repository: https://gitorious.org/~nicholasbishop/blenderprojects/nicholasbishop-blender
96 lines
2.5 KiB
C
96 lines
2.5 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.
|
|
*
|
|
* Contributor(s): Nicholas Bishop
|
|
*
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
*/
|
|
|
|
#ifndef DUALCON_H
|
|
#define DUALCON_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef float (*DualConCo)[3];
|
|
typedef unsigned int (*DualConFaces)[4];
|
|
struct DerivedMesh;
|
|
|
|
typedef struct DualConInput {
|
|
DualConCo co;
|
|
int co_stride;
|
|
int totco;
|
|
|
|
DualConFaces faces;
|
|
int face_stride;
|
|
int totface;
|
|
|
|
float min[3], max[3];
|
|
} DualConInput;
|
|
|
|
/* callback for allocating memory for output */
|
|
typedef void *(*DualConAllocOutput)(int totvert, int totquad);
|
|
/* callback for adding a new vertex to the output */
|
|
typedef void (*DualConAddVert)(void *output, const float co[3]);
|
|
/* callback for adding a new quad to the output */
|
|
typedef void (*DualConAddQuad)(void *output, const int vert_indices[4]);
|
|
|
|
typedef enum {
|
|
DUALCON_FLOOD_FILL = 1,
|
|
} DualConFlags;
|
|
|
|
typedef enum {
|
|
/* blocky */
|
|
DUALCON_CENTROID,
|
|
/* smooth */
|
|
DUALCON_MASS_POINT,
|
|
/* keeps sharp edges */
|
|
DUALCON_SHARP_FEATURES,
|
|
} DualConMode;
|
|
|
|
/* Usage:
|
|
|
|
The three callback arguments are used for creating the output
|
|
mesh. The alloc_output callback takes the total number of vertices
|
|
and faces (quads) that will be in the output. It should allocate
|
|
and return a structure to hold the output mesh. The add_vert and
|
|
add_quad callbacks will then be called for each new vertex and
|
|
quad, and the callback should add the new mesh elements to the
|
|
structure.
|
|
*/
|
|
void *dualcon(const DualConInput *input_mesh,
|
|
/* callbacks for output */
|
|
DualConAllocOutput alloc_output,
|
|
DualConAddVert add_vert,
|
|
DualConAddQuad add_quad,
|
|
|
|
/* flags and settings to control the remeshing
|
|
algorithm */
|
|
DualConFlags flags,
|
|
DualConMode mode,
|
|
float threshold,
|
|
float hermite_num,
|
|
float scale,
|
|
int depth);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|