2006-08-28 01:12:36 +00:00
|
|
|
/*
|
2011-10-10 09:38:02 +00:00
|
|
|
* ***** 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) 2006 Blender Foundation.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* The Original Code is: all of this file.
|
|
|
|
*
|
|
|
|
* Contributor(s): Ben Batt <benbatt@gmail.com>
|
|
|
|
*
|
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
|
|
*
|
|
|
|
* Implementation of CustomData.
|
|
|
|
*
|
|
|
|
* BKE_customdata.h contains the function prototypes for this file.
|
|
|
|
*
|
|
|
|
*/
|
2011-02-27 20:40:57 +00:00
|
|
|
|
|
|
|
/** \file blender/blenkernel/intern/customdata.c
|
|
|
|
* \ingroup bke
|
|
|
|
*/
|
|
|
|
|
2006-08-28 01:12:36 +00:00
|
|
|
|
2009-11-25 14:27:50 +00:00
|
|
|
#include <math.h>
|
|
|
|
#include <string.h>
|
2010-11-07 08:49:07 +00:00
|
|
|
#include <assert.h>
|
2009-11-25 14:27:50 +00:00
|
|
|
|
|
|
|
#include "MEM_guardedalloc.h"
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
#include "DNA_meshdata_types.h"
|
2009-11-25 14:27:50 +00:00
|
|
|
#include "DNA_ID.h"
|
2006-08-28 01:12:36 +00:00
|
|
|
|
2009-11-25 14:27:50 +00:00
|
|
|
#include "BLI_blenlib.h"
|
|
|
|
#include "BLI_linklist.h"
|
2010-09-30 22:27:37 +00:00
|
|
|
#include "BLI_math.h"
|
2009-11-25 14:27:50 +00:00
|
|
|
#include "BLI_mempool.h"
|
2011-01-07 18:36:47 +00:00
|
|
|
#include "BLI_utildefines.h"
|
2006-08-28 01:12:36 +00:00
|
|
|
|
2009-11-25 14:27:50 +00:00
|
|
|
#include "BKE_customdata.h"
|
2009-12-10 14:26:06 +00:00
|
|
|
#include "BKE_customdata_file.h"
|
2009-11-25 14:27:50 +00:00
|
|
|
#include "BKE_global.h"
|
2010-10-18 06:41:16 +00:00
|
|
|
#include "BKE_main.h"
|
2009-11-25 14:27:50 +00:00
|
|
|
#include "BKE_utildefines.h"
|
2010-11-04 16:00:28 +00:00
|
|
|
#include "BKE_multires.h"
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
/* number of layers to add when growing a CustomData object */
|
|
|
|
#define CUSTOMDATA_GROW 5
|
|
|
|
|
|
|
|
/********************* Layer type information **********************/
|
|
|
|
typedef struct LayerTypeInfo {
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
int size; /* the memory size of one element of this layer's data */
|
2010-12-03 17:05:21 +00:00
|
|
|
const char *structname; /* name of the struct used, for file writing */
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
int structnum; /* number of structs per element, for file writing */
|
2010-12-03 17:05:21 +00:00
|
|
|
const char *defaultname; /* default layer name */
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
/* a function to copy count elements of this layer's data
|
|
|
|
* (deep copy if appropriate)
|
|
|
|
* if NULL, memcpy is used
|
|
|
|
*/
|
2006-12-12 21:29:09 +00:00
|
|
|
void (*copy)(const void *source, void *dest, int count);
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
/* a function to free any dynamically allocated components of this
|
|
|
|
* layer's data (note the data pointer itself should not be freed)
|
|
|
|
* size should be the size of one element of this layer's data (e.g.
|
|
|
|
* LayerTypeInfo.size)
|
|
|
|
*/
|
|
|
|
void (*free)(void *data, int count, int size);
|
|
|
|
|
|
|
|
/* a function to interpolate between count source elements of this
|
|
|
|
* layer's data and store the result in dest
|
|
|
|
* if weights == NULL or sub_weights == NULL, they should default to 1
|
|
|
|
*
|
|
|
|
* weights gives the weight for each element in sources
|
|
|
|
* sub_weights gives the sub-element weights for each element in sources
|
|
|
|
* (there should be (sub element count)^2 weights per element)
|
|
|
|
* count gives the number of elements in sources
|
|
|
|
*/
|
|
|
|
void (*interp)(void **sources, float *weights, float *sub_weights,
|
2010-03-22 09:30:00 +00:00
|
|
|
int count, void *dest);
|
2006-08-28 01:12:36 +00:00
|
|
|
|
2010-03-22 09:30:00 +00:00
|
|
|
/* a function to swap the data in corners of the element */
|
2010-04-10 22:12:10 +00:00
|
|
|
void (*swap)(void *data, const int *corner_indices);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
2010-03-22 09:30:00 +00:00
|
|
|
/* a function to set a layer's data to default values. if NULL, the
|
2006-11-11 16:38:37 +00:00
|
|
|
default is assumed to be all zeros */
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
void (*set_default)(void *data, int count);
|
2009-11-25 14:27:50 +00:00
|
|
|
|
2010-03-22 09:30:00 +00:00
|
|
|
/* a function to read data from a cdf file */
|
2009-12-10 14:26:06 +00:00
|
|
|
int (*read)(CDataFile *cdf, void *data, int count);
|
2009-11-25 14:27:50 +00:00
|
|
|
|
2010-03-22 09:30:00 +00:00
|
|
|
/* a function to write data to a cdf file */
|
2009-12-10 14:26:06 +00:00
|
|
|
int (*write)(CDataFile *cdf, void *data, int count);
|
|
|
|
|
2010-03-22 09:30:00 +00:00
|
|
|
/* a function to determine file size */
|
2009-12-10 14:26:06 +00:00
|
|
|
size_t (*filesize)(CDataFile *cdf, void *data, int count);
|
2011-01-02 17:08:25 +00:00
|
|
|
|
|
|
|
/* a function to validate layer contents depending on
|
|
|
|
* sub-elements count
|
|
|
|
*/
|
|
|
|
void (*validate)(void *source, int sub_elements);
|
2006-11-11 16:38:37 +00:00
|
|
|
} LayerTypeInfo;
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
static void layerCopy_mdeformvert(const void *source, void *dest,
|
2010-03-22 09:30:00 +00:00
|
|
|
int count)
|
2006-08-28 01:12:36 +00:00
|
|
|
{
|
2006-12-12 21:29:09 +00:00
|
|
|
int i, size = sizeof(MDeformVert);
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
memcpy(dest, source, count * size);
|
|
|
|
|
|
|
|
for(i = 0; i < count; ++i) {
|
|
|
|
MDeformVert *dvert = (MDeformVert *)((char *)dest + i * size);
|
|
|
|
|
2008-04-15 18:07:04 +00:00
|
|
|
if(dvert->totweight) {
|
|
|
|
MDeformWeight *dw = MEM_callocN(dvert->totweight * sizeof(*dw),
|
|
|
|
"layerCopy_mdeformvert dw");
|
|
|
|
|
|
|
|
memcpy(dw, dvert->dw, dvert->totweight * sizeof(*dw));
|
|
|
|
dvert->dw = dw;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
dvert->dw = NULL;
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void layerFree_mdeformvert(void *data, int count, int size)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0; i < count; ++i) {
|
|
|
|
MDeformVert *dvert = (MDeformVert *)((char *)data + i * size);
|
|
|
|
|
|
|
|
if(dvert->dw) {
|
|
|
|
MEM_freeN(dvert->dw);
|
|
|
|
dvert->dw = NULL;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
dvert->totweight = 0;
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void linklist_free_simple(void *link)
|
|
|
|
{
|
|
|
|
MEM_freeN(link);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void layerInterp_mdeformvert(void **sources, float *weights,
|
2010-10-17 06:38:56 +00:00
|
|
|
float *UNUSED(sub_weights), int count, void *dest)
|
2006-08-28 01:12:36 +00:00
|
|
|
{
|
|
|
|
MDeformVert *dvert = dest;
|
|
|
|
LinkNode *dest_dw = NULL; /* a list of lists of MDeformWeight pointers */
|
|
|
|
LinkNode *node;
|
|
|
|
int i, j, totweight;
|
|
|
|
|
|
|
|
if(count <= 0) return;
|
|
|
|
|
|
|
|
/* build a list of unique def_nrs for dest */
|
|
|
|
totweight = 0;
|
|
|
|
for(i = 0; i < count; ++i) {
|
|
|
|
MDeformVert *source = sources[i];
|
|
|
|
float interp_weight = weights ? weights[i] : 1.0f;
|
|
|
|
|
|
|
|
for(j = 0; j < source->totweight; ++j) {
|
|
|
|
MDeformWeight *dw = &source->dw[j];
|
|
|
|
|
|
|
|
for(node = dest_dw; node; node = node->next) {
|
|
|
|
MDeformWeight *tmp_dw = (MDeformWeight *)node->link;
|
|
|
|
|
|
|
|
if(tmp_dw->def_nr == dw->def_nr) {
|
|
|
|
tmp_dw->weight += dw->weight * interp_weight;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if this def_nr is not in the list, add it */
|
|
|
|
if(!node) {
|
|
|
|
MDeformWeight *tmp_dw = MEM_callocN(sizeof(*tmp_dw),
|
2010-03-22 09:30:00 +00:00
|
|
|
"layerInterp_mdeformvert tmp_dw");
|
2006-08-28 01:12:36 +00:00
|
|
|
tmp_dw->def_nr = dw->def_nr;
|
|
|
|
tmp_dw->weight = dw->weight * interp_weight;
|
|
|
|
BLI_linklist_prepend(&dest_dw, tmp_dw);
|
|
|
|
totweight++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* now we know how many unique deform weights there are, so realloc */
|
|
|
|
if(dvert->dw) MEM_freeN(dvert->dw);
|
|
|
|
|
2006-11-11 23:23:15 +00:00
|
|
|
if(totweight) {
|
|
|
|
dvert->dw = MEM_callocN(sizeof(*dvert->dw) * totweight,
|
2010-03-22 09:30:00 +00:00
|
|
|
"layerInterp_mdeformvert dvert->dw");
|
2006-11-11 23:23:15 +00:00
|
|
|
dvert->totweight = totweight;
|
|
|
|
|
|
|
|
for(i = 0, node = dest_dw; node; node = node->next, ++i)
|
|
|
|
dvert->dw[i] = *((MDeformWeight *)node->link);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
memset(dvert, 0, sizeof(*dvert));
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
BLI_linklist_free(dest_dw, linklist_free_simple);
|
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
|
|
|
static void layerInterp_msticky(void **sources, float *weights,
|
2010-10-17 06:38:56 +00:00
|
|
|
float *UNUSED(sub_weights), int count, void *dest)
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
{
|
|
|
|
float co[2], w;
|
|
|
|
MSticky *mst;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
co[0] = co[1] = 0.0f;
|
|
|
|
for(i = 0; i < count; i++) {
|
|
|
|
w = weights ? weights[i] : 1.0f;
|
|
|
|
mst = (MSticky*)sources[i];
|
|
|
|
|
|
|
|
co[0] += w*mst->co[0];
|
|
|
|
co[1] += w*mst->co[1];
|
|
|
|
}
|
|
|
|
|
|
|
|
mst = (MSticky*)dest;
|
|
|
|
mst->co[0] = co[0];
|
|
|
|
mst->co[1] = co[1];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
static void layerCopy_tface(const void *source, void *dest, int count)
|
2006-11-11 16:38:37 +00:00
|
|
|
{
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
const MTFace *source_tf = (const MTFace*)source;
|
|
|
|
MTFace *dest_tf = (MTFace*)dest;
|
2006-11-11 16:38:37 +00:00
|
|
|
int i;
|
|
|
|
|
2006-12-22 07:45:01 +00:00
|
|
|
for(i = 0; i < count; ++i)
|
2006-11-11 16:38:37 +00:00
|
|
|
dest_tf[i] = source_tf[i];
|
|
|
|
}
|
|
|
|
|
2006-08-28 01:12:36 +00:00
|
|
|
static void layerInterp_tface(void **sources, float *weights,
|
2010-03-22 09:30:00 +00:00
|
|
|
float *sub_weights, int count, void *dest)
|
2006-08-28 01:12:36 +00:00
|
|
|
{
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
MTFace *tf = dest;
|
2006-08-28 01:12:36 +00:00
|
|
|
int i, j, k;
|
|
|
|
float uv[4][2];
|
2006-11-11 16:38:37 +00:00
|
|
|
float *sub_weight;
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
if(count <= 0) return;
|
|
|
|
|
|
|
|
memset(uv, 0, sizeof(uv));
|
|
|
|
|
2006-11-11 16:38:37 +00:00
|
|
|
sub_weight = sub_weights;
|
2006-08-28 01:12:36 +00:00
|
|
|
for(i = 0; i < count; ++i) {
|
|
|
|
float weight = weights ? weights[i] : 1;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
MTFace *src = sources[i];
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
for(j = 0; j < 4; ++j) {
|
|
|
|
if(sub_weights) {
|
2006-11-11 16:38:37 +00:00
|
|
|
for(k = 0; k < 4; ++k, ++sub_weight) {
|
|
|
|
float w = (*sub_weight) * weight;
|
2006-08-28 01:12:36 +00:00
|
|
|
float *tmp_uv = src->uv[k];
|
|
|
|
|
2006-11-11 16:38:37 +00:00
|
|
|
uv[j][0] += tmp_uv[0] * w;
|
|
|
|
uv[j][1] += tmp_uv[1] * w;
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
uv[j][0] += src->uv[j][0] * weight;
|
|
|
|
uv[j][1] += src->uv[j][1] * weight;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
*tf = *(MTFace *)sources[0];
|
2006-08-28 01:12:36 +00:00
|
|
|
for(j = 0; j < 4; ++j) {
|
|
|
|
tf->uv[j][0] = uv[j][0];
|
|
|
|
tf->uv[j][1] = uv[j][1];
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-04-10 22:12:10 +00:00
|
|
|
static void layerSwap_tface(void *data, const int *corner_indices)
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
{
|
|
|
|
MTFace *tf = data;
|
|
|
|
float uv[4][2];
|
2008-09-29 17:08:11 +00:00
|
|
|
static const short pin_flags[4] =
|
2010-03-22 09:30:00 +00:00
|
|
|
{ TF_PIN1, TF_PIN2, TF_PIN3, TF_PIN4 };
|
2008-09-29 17:08:11 +00:00
|
|
|
static const char sel_flags[4] =
|
2010-03-22 09:30:00 +00:00
|
|
|
{ TF_SEL1, TF_SEL2, TF_SEL3, TF_SEL4 };
|
2008-08-04 14:49:55 +00:00
|
|
|
short unwrap = tf->unwrap & ~(TF_PIN1 | TF_PIN2 | TF_PIN3 | TF_PIN4);
|
|
|
|
char flag = tf->flag & ~(TF_SEL1 | TF_SEL2 | TF_SEL3 | TF_SEL4);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
int j;
|
2006-08-28 01:12:36 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
for(j = 0; j < 4; ++j) {
|
2008-08-04 14:49:55 +00:00
|
|
|
int source_index = corner_indices[j];
|
|
|
|
|
|
|
|
uv[j][0] = tf->uv[source_index][0];
|
|
|
|
uv[j][1] = tf->uv[source_index][1];
|
|
|
|
|
|
|
|
// swap pinning flags around
|
|
|
|
if(tf->unwrap & pin_flags[source_index]) {
|
|
|
|
unwrap |= pin_flags[j];
|
|
|
|
}
|
|
|
|
|
|
|
|
// swap selection flags around
|
|
|
|
if(tf->flag & sel_flags[source_index]) {
|
|
|
|
flag |= sel_flags[j];
|
|
|
|
}
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
|
|
|
memcpy(tf->uv, uv, sizeof(tf->uv));
|
2008-08-04 14:49:55 +00:00
|
|
|
tf->unwrap = unwrap;
|
|
|
|
tf->flag = flag;
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
static void layerDefault_tface(void *data, int count)
|
2006-11-11 16:38:37 +00:00
|
|
|
{
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
static MTFace default_tf = {{{0, 0}, {1, 0}, {1, 1}, {0, 1}}, NULL,
|
TexFace to Material Settings big patch
Summary:
========
The idea here is to move the texface options into the material panel.
For images with the change please visit:
http://code.blender.org/index.php/2011/09/bge-material-texface-changes
1 - Some of the legacy problems 2.49 and 2.5x has with the texface system:
==========================================================================
1.1) Shadow, Bilboard and Halo are mutual exclusive (in the code), yet you can
select a face to be more than one mode.
1.2) Sort only works for blend Alpha yet it's an option regardless of the
Transparency Blend you pick.
1.3) Shared doesn't affect anything in BGE.
1.4) ObColor only works for Text objects (old bitmap texts) when using Texture
Face Materials. (not address yet, I so far ignored obcolor)
2 - Notes:
============
2.1) Now "Use Face Textures" in material Option panel will work in Multitexture
even if there is no texture channel.
2.2) In FaceTexture mode it will use TexFace all the time, even if you don't
check the "Use Texture Face" option in the UI. It's a matter of decision, since
the code for either way is there. I decided by the solution that makes the
creation of a material fast - in this mode the user doesn't need to mess with
textures or this "Use Texture Face" option at all. I'm not strong in my opinion
here. But I think if we don't have this then what is the point of the Texture
Face mode?
2.3) I kept references for tface only when we need the image, UV or the tiling
setting. It should help later when/if we split the Image and UV layers from the
tface struct (Campbell and Brecht proposal).
3 - Changes in a Nutshell:
==========================
3.1) "Texture Face" panel (in the Mesh/Object Data panel) no longer exists. Those settings are all part of the material properties, visible when Game Render is set.
3.2) "Texture Face" Shading mode (in the Render panel) is now called “Single Texture”, it needs a material for special settings (e.g. Billboard, Alpha Sort, …).
3.3) New options in the Material Panel
* Shadeless option in the Material panel is now supported for all three Shading modes.
* Physics is now toggleable, this is the old Collision option.
* Two Side (on) is now called Back Culling (off).
* Alpha Sort is one of the Alpha options, together (and mutually exclusive) to Alpha Blend, Alpha Clip, Add and Opaque (i.e. solid).
* Shadow, Billboard and Halo are grouped in the “Face Orientation” property.
* "Face Textures" and "Face Textures Alpha" (under Options) can be used for all but GLSL shading mode (to be supported in GLSL eventually).
* The backend in the game engine is still the same as before. The only changes are in the interface and in the way you need to think your materials. The bottomline is: It’s no longer possible to share materials between faces that do not share the same game properties.
4 - Acknowledgment:
==================
Mike Pan for the design discussions, and testing along the whole development process.
Vitor Balbio for the first hands-on code with the interface changes. That helped me a lot to push me into work on that.
Benoit Bolsee and Brecht van Lommel for patch review (* no one reviewed the whole patch, or the latest iteractions, so I still hold liability for any problems).
Blender artists that gave feedback and helped testing the patch.
Patch review and original documentation can be found here:
http://wiki.blender.org/index.php/User:Dfelinto/TexFace
http://codereview.appspot.com/4289041/
2011-09-19 19:55:59 +00:00
|
|
|
0, 0, TF_DYNAMIC|TF_CONVERTED, 0, 0};
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
MTFace *tf = (MTFace*)data;
|
|
|
|
int i;
|
2006-11-11 16:38:37 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
for(i = 0; i < count; i++)
|
|
|
|
tf[i] = default_tf;
|
2006-11-11 16:38:37 +00:00
|
|
|
}
|
|
|
|
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
static void layerCopy_origspace_face(const void *source, void *dest, int count)
|
|
|
|
{
|
|
|
|
const OrigSpaceFace *source_tf = (const OrigSpaceFace*)source;
|
|
|
|
OrigSpaceFace *dest_tf = (OrigSpaceFace*)dest;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0; i < count; ++i)
|
|
|
|
dest_tf[i] = source_tf[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
static void layerInterp_origspace_face(void **sources, float *weights,
|
|
|
|
float *sub_weights, int count, void *dest)
|
|
|
|
{
|
|
|
|
OrigSpaceFace *osf = dest;
|
|
|
|
int i, j, k;
|
|
|
|
float uv[4][2];
|
|
|
|
float *sub_weight;
|
|
|
|
|
|
|
|
if(count <= 0) return;
|
|
|
|
|
|
|
|
memset(uv, 0, sizeof(uv));
|
|
|
|
|
|
|
|
sub_weight = sub_weights;
|
|
|
|
for(i = 0; i < count; ++i) {
|
|
|
|
float weight = weights ? weights[i] : 1;
|
|
|
|
OrigSpaceFace *src = sources[i];
|
|
|
|
|
|
|
|
for(j = 0; j < 4; ++j) {
|
|
|
|
if(sub_weights) {
|
|
|
|
for(k = 0; k < 4; ++k, ++sub_weight) {
|
|
|
|
float w = (*sub_weight) * weight;
|
|
|
|
float *tmp_uv = src->uv[k];
|
|
|
|
|
|
|
|
uv[j][0] += tmp_uv[0] * w;
|
|
|
|
uv[j][1] += tmp_uv[1] * w;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
uv[j][0] += src->uv[j][0] * weight;
|
|
|
|
uv[j][1] += src->uv[j][1] * weight;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*osf = *(OrigSpaceFace *)sources[0];
|
|
|
|
for(j = 0; j < 4; ++j) {
|
|
|
|
osf->uv[j][0] = uv[j][0];
|
|
|
|
osf->uv[j][1] = uv[j][1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-04-10 22:12:10 +00:00
|
|
|
static void layerSwap_origspace_face(void *data, const int *corner_indices)
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
{
|
|
|
|
OrigSpaceFace *osf = data;
|
|
|
|
float uv[4][2];
|
|
|
|
int j;
|
|
|
|
|
|
|
|
for(j = 0; j < 4; ++j) {
|
|
|
|
uv[j][0] = osf->uv[corner_indices[j]][0];
|
|
|
|
uv[j][1] = osf->uv[corner_indices[j]][1];
|
|
|
|
}
|
|
|
|
memcpy(osf->uv, uv, sizeof(osf->uv));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void layerDefault_origspace_face(void *data, int count)
|
|
|
|
{
|
|
|
|
static OrigSpaceFace default_osf = {{{0, 0}, {1, 0}, {1, 1}, {0, 1}}};
|
|
|
|
OrigSpaceFace *osf = (OrigSpaceFace*)data;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0; i < count; i++)
|
|
|
|
osf[i] = default_osf;
|
|
|
|
}
|
2009-01-06 18:59:03 +00:00
|
|
|
|
2010-04-17 15:47:00 +00:00
|
|
|
static void layerSwap_mdisps(void *data, const int *ci)
|
2009-01-06 18:59:03 +00:00
|
|
|
{
|
|
|
|
MDisps *s = data;
|
|
|
|
float (*d)[3] = NULL;
|
2009-12-07 19:11:37 +00:00
|
|
|
int corners, cornersize, S;
|
2009-01-06 18:59:03 +00:00
|
|
|
|
2010-09-30 22:27:37 +00:00
|
|
|
if(s->disps) {
|
2010-10-16 20:43:16 +00:00
|
|
|
int nverts= (ci[1] == 3) ? 4 : 3; /* silly way to know vertex count of face */
|
2010-11-04 16:00:28 +00:00
|
|
|
corners= multires_mdisp_corners(s);
|
2010-10-16 20:43:16 +00:00
|
|
|
cornersize= s->totdisp/corners;
|
2009-01-06 18:59:03 +00:00
|
|
|
|
2010-10-16 20:43:16 +00:00
|
|
|
if(corners!=nverts) {
|
|
|
|
/* happens when face changed vertex count in edit mode
|
|
|
|
if it happened, just forgot displacement */
|
2009-01-06 18:59:03 +00:00
|
|
|
|
2010-10-16 20:43:16 +00:00
|
|
|
MEM_freeN(s->disps);
|
2010-11-04 16:00:28 +00:00
|
|
|
s->totdisp= (s->totdisp/corners)*nverts;
|
|
|
|
s->disps= MEM_callocN(s->totdisp*sizeof(float)*3, "mdisp swap");
|
2010-10-16 20:43:16 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
d= MEM_callocN(sizeof(float) * 3 * s->totdisp, "mdisps swap");
|
2009-01-06 18:59:03 +00:00
|
|
|
|
2010-09-30 22:27:37 +00:00
|
|
|
for(S = 0; S < corners; S++)
|
|
|
|
memcpy(d + cornersize*S, s->disps + cornersize*ci[S], cornersize*3*sizeof(float));
|
|
|
|
|
2009-01-06 18:59:03 +00:00
|
|
|
MEM_freeN(s->disps);
|
2010-10-16 20:43:16 +00:00
|
|
|
s->disps= d;
|
2010-09-30 22:27:37 +00:00
|
|
|
}
|
2009-01-06 18:59:03 +00:00
|
|
|
}
|
|
|
|
|
2010-12-13 21:22:30 +00:00
|
|
|
static void layerInterp_mdisps(void **sources, float *UNUSED(weights),
|
|
|
|
float *sub_weights, int count, void *dest)
|
2009-01-06 18:59:03 +00:00
|
|
|
{
|
|
|
|
MDisps *d = dest;
|
|
|
|
MDisps *s = NULL;
|
|
|
|
int st, stl;
|
|
|
|
int i, x, y;
|
2010-12-13 21:22:30 +00:00
|
|
|
int side, S, dst_corners, src_corners;
|
|
|
|
float crn_weight[4][2];
|
2011-01-02 17:38:22 +00:00
|
|
|
float (*sw)[4] = (void*)sub_weights;
|
2010-12-13 21:22:30 +00:00
|
|
|
float (*disps)[3], (*out)[3];
|
2009-01-06 18:59:03 +00:00
|
|
|
|
2011-01-11 22:06:44 +00:00
|
|
|
/* happens when flipping normals of newly created mesh */
|
|
|
|
if(!d->totdisp)
|
|
|
|
return;
|
|
|
|
|
2010-12-13 21:22:30 +00:00
|
|
|
s = sources[0];
|
|
|
|
dst_corners = multires_mdisp_corners(d);
|
2010-12-22 21:38:06 +00:00
|
|
|
src_corners = multires_mdisp_corners(s);
|
2010-12-13 21:22:30 +00:00
|
|
|
|
2011-01-02 17:38:22 +00:00
|
|
|
if(sub_weights && count == 2 && src_corners == 3) {
|
|
|
|
src_corners = multires_mdisp_corners(sources[1]);
|
|
|
|
|
|
|
|
/* special case -- converting two triangles to quad */
|
|
|
|
if(src_corners == 3 && dst_corners == 4) {
|
|
|
|
MDisps tris[2];
|
|
|
|
int vindex[4] = {0};
|
|
|
|
|
|
|
|
for(i = 0; i < 2; i++)
|
|
|
|
for(y = 0; y < 4; y++)
|
|
|
|
for(x = 0; x < 4; x++)
|
|
|
|
if(sw[x+i*4][y])
|
|
|
|
vindex[x] = y;
|
|
|
|
|
|
|
|
for(i = 0; i < 2; i++) {
|
2011-02-13 10:52:18 +00:00
|
|
|
float sw_m4[4][4] = {{0}};
|
2011-01-02 17:38:22 +00:00
|
|
|
int a = 7 & ~(1 << vindex[i*2] | 1 << vindex[i*2+1]);
|
|
|
|
|
2011-02-13 10:52:18 +00:00
|
|
|
sw_m4[0][vindex[i*2+1]] = 1;
|
|
|
|
sw_m4[1][vindex[i*2]] = 1;
|
2011-01-02 17:38:22 +00:00
|
|
|
|
|
|
|
for(x = 0; x < 3; x++)
|
|
|
|
if(a & (1 << x))
|
2011-02-13 10:52:18 +00:00
|
|
|
sw_m4[2][x] = 1;
|
2011-01-02 17:38:22 +00:00
|
|
|
|
|
|
|
tris[i] = *((MDisps*)sources[i]);
|
|
|
|
tris[i].disps = MEM_dupallocN(tris[i].disps);
|
2011-02-13 10:52:18 +00:00
|
|
|
layerInterp_mdisps(&sources[i], NULL, (float*)sw_m4, 1, &tris[i]);
|
2011-01-02 17:38:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
mdisp_join_tris(d, &tris[0], &tris[1]);
|
|
|
|
|
|
|
|
for(i = 0; i < 2; i++)
|
|
|
|
MEM_freeN(tris[i].disps);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2009-01-06 18:59:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* For now, some restrictions on the input */
|
2011-01-02 17:38:22 +00:00
|
|
|
if(count != 1 || !sub_weights) {
|
2010-12-13 21:22:30 +00:00
|
|
|
for(i = 0; i < d->totdisp; ++i)
|
|
|
|
zero_v3(d->disps[i]);
|
2009-01-06 18:59:03 +00:00
|
|
|
|
2010-12-13 21:22:30 +00:00
|
|
|
return;
|
2009-01-06 18:59:03 +00:00
|
|
|
}
|
|
|
|
|
2010-12-13 21:22:30 +00:00
|
|
|
/* Initialize the destination */
|
2011-03-19 05:06:06 +00:00
|
|
|
disps = MEM_callocN(3*d->totdisp*sizeof(float), "iterp disps");
|
2009-01-06 18:59:03 +00:00
|
|
|
|
2010-12-13 21:22:30 +00:00
|
|
|
side = sqrt(d->totdisp / dst_corners);
|
|
|
|
st = (side<<1)-1;
|
2009-01-06 18:59:03 +00:00
|
|
|
stl = st - 1;
|
|
|
|
|
2010-12-13 21:22:30 +00:00
|
|
|
sw= (void*)sub_weights;
|
2009-01-06 18:59:03 +00:00
|
|
|
for(i = 0; i < 4; ++i) {
|
2010-12-13 21:22:30 +00:00
|
|
|
crn_weight[i][0] = 0 * sw[i][0] + stl * sw[i][1] + stl * sw[i][2] + 0 * sw[i][3];
|
|
|
|
crn_weight[i][1] = 0 * sw[i][0] + 0 * sw[i][1] + stl * sw[i][2] + stl * sw[i][3];
|
2009-01-06 18:59:03 +00:00
|
|
|
}
|
|
|
|
|
2010-12-13 21:22:30 +00:00
|
|
|
multires_mdisp_smooth_bounds(s);
|
|
|
|
|
|
|
|
out = disps;
|
|
|
|
for(S = 0; S < dst_corners; S++) {
|
|
|
|
float base[2], axis_x[2], axis_y[2];
|
|
|
|
|
|
|
|
mdisp_apply_weight(S, dst_corners, 0, 0, st, crn_weight, &base[0], &base[1]);
|
|
|
|
mdisp_apply_weight(S, dst_corners, side-1, 0, st, crn_weight, &axis_x[0], &axis_x[1]);
|
|
|
|
mdisp_apply_weight(S, dst_corners, 0, side-1, st, crn_weight, &axis_y[0], &axis_y[1]);
|
|
|
|
|
2011-02-12 10:18:21 +00:00
|
|
|
sub_v2_v2(axis_x, base);
|
|
|
|
sub_v2_v2(axis_y, base);
|
2010-12-13 21:22:30 +00:00
|
|
|
normalize_v2(axis_x);
|
|
|
|
normalize_v2(axis_y);
|
|
|
|
|
|
|
|
for(y = 0; y < side; ++y) {
|
|
|
|
for(x = 0; x < side; ++x, ++out) {
|
|
|
|
int crn;
|
|
|
|
float face_u, face_v, crn_u, crn_v;
|
|
|
|
|
|
|
|
mdisp_apply_weight(S, dst_corners, x, y, st, crn_weight, &face_u, &face_v);
|
2011-06-05 20:54:04 +00:00
|
|
|
crn = mdisp_rot_face_to_quad_crn(src_corners, st, face_u, face_v, &crn_u, &crn_v);
|
2010-12-13 21:22:30 +00:00
|
|
|
|
2011-01-02 16:43:28 +00:00
|
|
|
old_mdisps_bilinear((*out), &s->disps[crn*side*side], side, crn_u, crn_v);
|
2010-12-13 21:22:30 +00:00
|
|
|
mdisp_flip_disp(crn, dst_corners, axis_x, axis_y, *out);
|
|
|
|
}
|
2009-01-06 18:59:03 +00:00
|
|
|
}
|
|
|
|
}
|
2010-12-13 21:22:30 +00:00
|
|
|
|
|
|
|
MEM_freeN(d->disps);
|
|
|
|
d->disps = disps;
|
2009-01-06 18:59:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void layerCopy_mdisps(const void *source, void *dest, int count)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
const MDisps *s = source;
|
|
|
|
MDisps *d = dest;
|
|
|
|
|
|
|
|
for(i = 0; i < count; ++i) {
|
|
|
|
if(s[i].disps) {
|
|
|
|
d[i].disps = MEM_dupallocN(s[i].disps);
|
|
|
|
d[i].totdisp = s[i].totdisp;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
d[i].disps = NULL;
|
|
|
|
d[i].totdisp = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-02 17:08:25 +00:00
|
|
|
static void layerValidate_mdisps(void *data, int sub_elements)
|
|
|
|
{
|
|
|
|
MDisps *disps = data;
|
|
|
|
if(disps->disps) {
|
|
|
|
int corners = multires_mdisp_corners(disps);
|
|
|
|
|
|
|
|
if(corners != sub_elements) {
|
|
|
|
MEM_freeN(disps->disps);
|
|
|
|
disps->totdisp = disps->totdisp / corners * sub_elements;
|
|
|
|
disps->disps = MEM_callocN(3*disps->totdisp*sizeof(float), "layerValidate_mdisps");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-10-17 06:38:56 +00:00
|
|
|
static void layerFree_mdisps(void *data, int count, int UNUSED(size))
|
2009-01-06 18:59:03 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
MDisps *d = data;
|
|
|
|
|
|
|
|
for(i = 0; i < count; ++i) {
|
|
|
|
if(d[i].disps)
|
|
|
|
MEM_freeN(d[i].disps);
|
|
|
|
d[i].disps = NULL;
|
|
|
|
d[i].totdisp = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
static int layerRead_mdisps(CDataFile *cdf, void *data, int count)
|
2009-11-25 14:27:50 +00:00
|
|
|
{
|
|
|
|
MDisps *d = data;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0; i < count; ++i) {
|
|
|
|
if(!d[i].disps)
|
|
|
|
d[i].disps = MEM_callocN(sizeof(float)*3*d[i].totdisp, "mdisps read");
|
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
if(!cdf_read_data(cdf, d[i].totdisp*3*sizeof(float), d[i].disps)) {
|
2010-05-07 09:48:40 +00:00
|
|
|
printf("failed to read multires displacement %d/%d %d\n", i, count, d[i].totdisp);
|
2009-11-25 14:27:50 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
static int layerWrite_mdisps(CDataFile *cdf, void *data, int count)
|
2009-11-25 14:27:50 +00:00
|
|
|
{
|
|
|
|
MDisps *d = data;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0; i < count; ++i) {
|
2009-12-10 14:26:06 +00:00
|
|
|
if(!cdf_write_data(cdf, d[i].totdisp*3*sizeof(float), d[i].disps)) {
|
2010-05-07 09:48:40 +00:00
|
|
|
printf("failed to write multires displacement %d/%d %d\n", i, count, d[i].totdisp);
|
2009-11-25 14:27:50 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2010-10-17 06:38:56 +00:00
|
|
|
static size_t layerFilesize_mdisps(CDataFile *UNUSED(cdf), void *data, int count)
|
2009-12-10 14:26:06 +00:00
|
|
|
{
|
|
|
|
MDisps *d = data;
|
|
|
|
size_t size = 0;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0; i < count; ++i)
|
|
|
|
size += d[i].totdisp*3*sizeof(float);
|
|
|
|
|
|
|
|
return size;
|
|
|
|
}
|
|
|
|
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
/* --------- */
|
|
|
|
|
2008-07-08 02:22:37 +00:00
|
|
|
static void layerDefault_mloopcol(void *data, int count)
|
|
|
|
{
|
|
|
|
static MLoopCol default_mloopcol = {255,255,255,255};
|
|
|
|
MLoopCol *mlcol = (MLoopCol*)data;
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < count; i++)
|
|
|
|
mlcol[i] = default_mloopcol;
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
2008-07-08 02:22:37 +00:00
|
|
|
}
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
2008-07-08 02:22:37 +00:00
|
|
|
static void layerInterp_mloopcol(void **sources, float *weights,
|
|
|
|
float *sub_weights, int count, void *dest)
|
|
|
|
{
|
|
|
|
MLoopCol *mc = dest;
|
|
|
|
int i;
|
|
|
|
float *sub_weight;
|
|
|
|
struct {
|
|
|
|
float a;
|
|
|
|
float r;
|
|
|
|
float g;
|
|
|
|
float b;
|
|
|
|
} col;
|
|
|
|
col.a = col.r = col.g = col.b = 0;
|
|
|
|
|
|
|
|
sub_weight = sub_weights;
|
|
|
|
for(i = 0; i < count; ++i){
|
|
|
|
float weight = weights ? weights[i] : 1;
|
|
|
|
MLoopCol *src = sources[i];
|
|
|
|
if(sub_weights){
|
|
|
|
col.a += src->a * (*sub_weight) * weight;
|
|
|
|
col.r += src->r * (*sub_weight) * weight;
|
|
|
|
col.g += src->g * (*sub_weight) * weight;
|
|
|
|
col.b += src->b * (*sub_weight) * weight;
|
|
|
|
sub_weight++;
|
|
|
|
} else {
|
|
|
|
col.a += src->a * weight;
|
|
|
|
col.r += src->r * weight;
|
|
|
|
col.g += src->g * weight;
|
|
|
|
col.b += src->b * weight;
|
|
|
|
}
|
|
|
|
}
|
2009-06-08 20:08:19 +00:00
|
|
|
|
|
|
|
/* Subdivide smooth or fractal can cause problems without clamping
|
|
|
|
* although weights should also not cause this situation */
|
|
|
|
CLAMP(col.a, 0.0f, 255.0f);
|
|
|
|
CLAMP(col.r, 0.0f, 255.0f);
|
|
|
|
CLAMP(col.g, 0.0f, 255.0f);
|
|
|
|
CLAMP(col.b, 0.0f, 255.0f);
|
|
|
|
|
2008-07-08 02:22:37 +00:00
|
|
|
mc->a = (int)col.a;
|
|
|
|
mc->r = (int)col.r;
|
|
|
|
mc->g = (int)col.g;
|
|
|
|
mc->b = (int)col.b;
|
|
|
|
}
|
|
|
|
static void layerInterp_mloopuv(void **sources, float *weights,
|
|
|
|
float *sub_weights, int count, void *dest)
|
|
|
|
{
|
|
|
|
MLoopUV *mluv = dest;
|
|
|
|
int i;
|
|
|
|
float *sub_weight;
|
|
|
|
struct {
|
|
|
|
float u;
|
|
|
|
float v;
|
|
|
|
}uv;
|
|
|
|
uv.u = uv.v = 0.0;
|
|
|
|
|
|
|
|
sub_weight = sub_weights;
|
|
|
|
for(i = 0; i < count; ++i){
|
|
|
|
float weight = weights ? weights[i] : 1;
|
|
|
|
MLoopUV *src = sources[i];
|
|
|
|
if(sub_weights){
|
|
|
|
uv.u += src->uv[0] * (*sub_weight) * weight;
|
|
|
|
uv.v += src->uv[1] * (*sub_weight) * weight;
|
|
|
|
sub_weight++;
|
|
|
|
} else {
|
|
|
|
uv.u += src->uv[0] * weight;
|
|
|
|
uv.v += src->uv[1] * weight;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
mluv->uv[0] = uv.u;
|
|
|
|
mluv->uv[1] = uv.v;
|
|
|
|
}
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
|
2006-08-28 01:12:36 +00:00
|
|
|
static void layerInterp_mcol(void **sources, float *weights,
|
2010-03-22 09:30:00 +00:00
|
|
|
float *sub_weights, int count, void *dest)
|
2006-08-28 01:12:36 +00:00
|
|
|
{
|
|
|
|
MCol *mc = dest;
|
|
|
|
int i, j, k;
|
|
|
|
struct {
|
|
|
|
float a;
|
|
|
|
float r;
|
|
|
|
float g;
|
|
|
|
float b;
|
|
|
|
} col[4];
|
2006-11-11 16:38:37 +00:00
|
|
|
float *sub_weight;
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
if(count <= 0) return;
|
|
|
|
|
|
|
|
memset(col, 0, sizeof(col));
|
2006-11-11 16:38:37 +00:00
|
|
|
|
|
|
|
sub_weight = sub_weights;
|
2006-08-28 01:12:36 +00:00
|
|
|
for(i = 0; i < count; ++i) {
|
|
|
|
float weight = weights ? weights[i] : 1;
|
|
|
|
|
|
|
|
for(j = 0; j < 4; ++j) {
|
|
|
|
if(sub_weights) {
|
|
|
|
MCol *src = sources[i];
|
|
|
|
for(k = 0; k < 4; ++k, ++sub_weight, ++src) {
|
|
|
|
col[j].a += src->a * (*sub_weight) * weight;
|
|
|
|
col[j].r += src->r * (*sub_weight) * weight;
|
|
|
|
col[j].g += src->g * (*sub_weight) * weight;
|
|
|
|
col[j].b += src->b * (*sub_weight) * weight;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
MCol *src = sources[i];
|
|
|
|
col[j].a += src[j].a * weight;
|
|
|
|
col[j].r += src[j].r * weight;
|
|
|
|
col[j].g += src[j].g * weight;
|
|
|
|
col[j].b += src[j].b * weight;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for(j = 0; j < 4; ++j) {
|
2009-06-08 20:08:19 +00:00
|
|
|
|
|
|
|
/* Subdivide smooth or fractal can cause problems without clamping
|
|
|
|
* although weights should also not cause this situation */
|
|
|
|
CLAMP(col[j].a, 0.0f, 255.0f);
|
|
|
|
CLAMP(col[j].r, 0.0f, 255.0f);
|
|
|
|
CLAMP(col[j].g, 0.0f, 255.0f);
|
|
|
|
CLAMP(col[j].b, 0.0f, 255.0f);
|
|
|
|
|
2006-08-28 01:12:36 +00:00
|
|
|
mc[j].a = (int)col[j].a;
|
|
|
|
mc[j].r = (int)col[j].r;
|
|
|
|
mc[j].g = (int)col[j].g;
|
|
|
|
mc[j].b = (int)col[j].b;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-04-10 22:12:10 +00:00
|
|
|
static void layerSwap_mcol(void *data, const int *corner_indices)
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
{
|
|
|
|
MCol *mcol = data;
|
|
|
|
MCol col[4];
|
|
|
|
int j;
|
|
|
|
|
|
|
|
for(j = 0; j < 4; ++j)
|
|
|
|
col[j] = mcol[corner_indices[j]];
|
|
|
|
|
|
|
|
memcpy(mcol, col, sizeof(col));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void layerDefault_mcol(void *data, int count)
|
2006-11-11 16:38:37 +00:00
|
|
|
{
|
|
|
|
static MCol default_mcol = {255, 255, 255, 255};
|
|
|
|
MCol *mcol = (MCol*)data;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0; i < 4*count; i++)
|
|
|
|
mcol[i] = default_mcol;
|
|
|
|
}
|
2006-11-11 16:38:37 +00:00
|
|
|
|
2008-07-08 02:22:37 +00:00
|
|
|
|
|
|
|
|
2011-02-13 10:52:18 +00:00
|
|
|
static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 0: CD_MVERT */
|
2006-12-21 13:47:27 +00:00
|
|
|
{sizeof(MVert), "MVert", 1, NULL, NULL, NULL, NULL, NULL, NULL},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 1: CD_MSTICKY */
|
2006-12-21 13:47:27 +00:00
|
|
|
{sizeof(MSticky), "MSticky", 1, NULL, NULL, NULL, layerInterp_msticky, NULL,
|
2006-12-12 21:29:09 +00:00
|
|
|
NULL},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 2: CD_MDEFORMVERT */
|
2006-12-21 13:47:27 +00:00
|
|
|
{sizeof(MDeformVert), "MDeformVert", 1, NULL, layerCopy_mdeformvert,
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
layerFree_mdeformvert, layerInterp_mdeformvert, NULL, NULL},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 3: CD_MEDGE */
|
2006-12-21 13:47:27 +00:00
|
|
|
{sizeof(MEdge), "MEdge", 1, NULL, NULL, NULL, NULL, NULL, NULL},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 4: CD_MFACE */
|
2006-12-21 13:47:27 +00:00
|
|
|
{sizeof(MFace), "MFace", 1, NULL, NULL, NULL, NULL, NULL, NULL},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 5: CD_MTFACE */
|
2006-12-21 13:47:27 +00:00
|
|
|
{sizeof(MTFace), "MTFace", 1, "UVTex", layerCopy_tface, NULL,
|
2006-12-12 21:29:09 +00:00
|
|
|
layerInterp_tface, layerSwap_tface, layerDefault_tface},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 6: CD_MCOL */
|
2006-11-11 16:38:37 +00:00
|
|
|
/* 4 MCol structs per face */
|
2006-12-21 13:47:27 +00:00
|
|
|
{sizeof(MCol)*4, "MCol", 4, "Col", NULL, NULL, layerInterp_mcol,
|
2006-12-12 21:29:09 +00:00
|
|
|
layerSwap_mcol, layerDefault_mcol},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 7: CD_ORIGINDEX */
|
2006-12-21 13:47:27 +00:00
|
|
|
{sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 8: CD_NORMAL */
|
2006-11-11 16:38:37 +00:00
|
|
|
/* 3 floats per normal vector */
|
2006-12-21 13:47:27 +00:00
|
|
|
{sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 9: CD_FLAGS */
|
2006-12-21 13:47:27 +00:00
|
|
|
{sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 10: CD_PROP_FLT */
|
2007-06-04 19:18:19 +00:00
|
|
|
{sizeof(MFloatProperty), "MFloatProperty",1,"Float",NULL,NULL,NULL,NULL},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 11: CD_PROP_INT */
|
2007-06-04 19:18:19 +00:00
|
|
|
{sizeof(MIntProperty), "MIntProperty",1,"Int",NULL,NULL,NULL,NULL},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 12: CD_PROP_STR */
|
2007-06-04 19:18:19 +00:00
|
|
|
{sizeof(MStringProperty), "MStringProperty",1,"String",NULL,NULL,NULL,NULL},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 13: CD_ORIGSPACE */
|
Particles
=========
Merge of the famous particle patch by Janne Karhu, a full rewrite
of the Blender particle system. This includes:
- Emitter, Hair and Reactor particle types.
- Newtonian, Keyed and Boids physics.
- Various particle visualisation and rendering types.
- Vertex group and texture control for various properties.
- Interpolated child particles from parents.
- Hair editing with combing, growing, cutting, .. .
- Explode modifier.
- Harmonic, Magnetic fields, and multiple falloff types.
.. and lots of other things, some more info is here:
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite
http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc
The new particle system cannot be backwards compatible. Old particle
systems are being converted to the new system, but will require
tweaking to get them looking the same as before.
Point Cache
===========
The new system to replace manual baking, based on automatic caching
on disk. This is currently used by softbodies and the particle system.
See the Cache API section on:
http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint
Documentation
=============
These new features still need good docs for the release logs, help
for this is appreciated.
2007-11-26 22:09:57 +00:00
|
|
|
{sizeof(OrigSpaceFace), "OrigSpaceFace", 1, "UVTex", layerCopy_origspace_face, NULL,
|
|
|
|
layerInterp_origspace_face, layerSwap_origspace_face, layerDefault_origspace_face},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 14: CD_ORCO */
|
2008-07-04 17:59:16 +00:00
|
|
|
{sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 15: CD_MTEXPOLY */
|
2008-07-04 17:59:16 +00:00
|
|
|
{sizeof(MTexPoly), "MTexPoly", 1, "Face Texture", NULL, NULL, NULL, NULL, NULL},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 16: CD_MLOOPUV */
|
2008-07-08 02:22:37 +00:00
|
|
|
{sizeof(MLoopUV), "MLoopUV", 1, "UV coord", NULL, NULL, layerInterp_mloopuv, NULL, NULL},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 17: CD_MLOOPCOL */
|
2008-07-29 15:48:31 +00:00
|
|
|
{sizeof(MLoopCol), "MLoopCol", 1, "Col", NULL, NULL, layerInterp_mloopcol, NULL, layerDefault_mloopcol},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 18: CD_TANGENT */
|
2011-02-14 18:18:46 +00:00
|
|
|
{sizeof(float)*4*4, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 19: CD_MDISPS */
|
2009-01-06 18:59:03 +00:00
|
|
|
{sizeof(MDisps), "MDisps", 1, NULL, layerCopy_mdisps,
|
2011-01-02 17:08:25 +00:00
|
|
|
layerFree_mdisps, layerInterp_mdisps, layerSwap_mdisps, NULL, layerRead_mdisps, layerWrite_mdisps,
|
|
|
|
layerFilesize_mdisps, layerValidate_mdisps},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 20: CD_WEIGHT_MCOL */
|
2009-04-02 14:38:40 +00:00
|
|
|
{sizeof(MCol)*4, "MCol", 4, "WeightCol", NULL, NULL, layerInterp_mcol,
|
|
|
|
layerSwap_mcol, layerDefault_mcol},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 21: CD_ID_MCOL */
|
|
|
|
{sizeof(MCol)*4, "MCol", 4, "IDCol", NULL, NULL, layerInterp_mcol,
|
2009-10-03 15:35:01 +00:00
|
|
|
layerSwap_mcol, layerDefault_mcol},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 22: CD_TEXTURE_MCOL */
|
|
|
|
{sizeof(MCol)*4, "MCol", 4, "TexturedCol", NULL, NULL, layerInterp_mcol,
|
2009-10-03 15:35:01 +00:00
|
|
|
layerSwap_mcol, layerDefault_mcol},
|
2011-09-03 08:18:43 +00:00
|
|
|
/* 23: CD_CLOTH_ORCO */
|
2010-07-30 13:02:32 +00:00
|
|
|
{sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
|
2011-09-07 15:34:04 +00:00
|
|
|
/* 24: CD_RECAST */
|
2010-07-30 13:02:32 +00:00
|
|
|
{sizeof(MRecast), "MRecast", 1,"Recast",NULL,NULL,NULL,NULL}
|
2006-11-11 16:38:37 +00:00
|
|
|
};
|
|
|
|
|
2011-02-13 10:52:18 +00:00
|
|
|
static const char *LAYERTYPENAMES[CD_NUMTYPES] = {
|
2010-05-27 08:42:59 +00:00
|
|
|
/* 0-4 */ "CDMVert", "CDMSticky", "CDMDeformVert", "CDMEdge", "CDMFace",
|
|
|
|
/* 5-9 */ "CDMTFace", "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags",
|
|
|
|
/* 10-14 */ "CDMFloatProperty", "CDMIntProperty","CDMStringProperty", "CDOrigSpace", "CDOrco",
|
|
|
|
/* 15-19 */ "CDMTexPoly", "CDMLoopUV", "CDMloopCol", "CDTangent", "CDMDisps",
|
2010-07-30 13:02:32 +00:00
|
|
|
/* 20-24 */"CDWeightMCol", "CDIDMCol", "CDTextureMCol", "CDClothOrco", "CDMRecast"
|
2010-05-27 08:42:59 +00:00
|
|
|
};
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
2006-12-05 17:42:03 +00:00
|
|
|
const CustomDataMask CD_MASK_BAREMESH =
|
|
|
|
CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE;
|
|
|
|
const CustomDataMask CD_MASK_MESH =
|
|
|
|
CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE |
|
2007-06-04 19:18:19 +00:00
|
|
|
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MCOL |
|
2010-07-30 13:02:32 +00:00
|
|
|
CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | CD_MASK_RECAST;
|
2006-12-05 17:42:03 +00:00
|
|
|
const CustomDataMask CD_MASK_EDITMESH =
|
|
|
|
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
|
2010-07-30 13:02:32 +00:00
|
|
|
CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | CD_MASK_RECAST;
|
2006-12-05 17:42:03 +00:00
|
|
|
const CustomDataMask CD_MASK_DERIVEDMESH =
|
|
|
|
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
|
2010-03-30 11:49:07 +00:00
|
|
|
CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO |
|
2010-07-30 13:02:32 +00:00
|
|
|
CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_TANGENT | CD_MASK_WEIGHT_MCOL | CD_MASK_RECAST;
|
2008-07-04 17:59:16 +00:00
|
|
|
const CustomDataMask CD_MASK_BMESH =
|
2008-07-08 02:22:37 +00:00
|
|
|
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR;
|
|
|
|
const CustomDataMask CD_MASK_FACECORNERS =
|
|
|
|
CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV |
|
|
|
|
CD_MASK_MLOOPCOL;
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
2006-11-11 16:38:37 +00:00
|
|
|
static const LayerTypeInfo *layerType_getInfo(int type)
|
|
|
|
{
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if(type < 0 || type >= CD_NUMTYPES) return NULL;
|
2006-11-11 16:38:37 +00:00
|
|
|
|
|
|
|
return &LAYERTYPEINFO[type];
|
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
static const char *layerType_getName(int type)
|
2006-08-28 01:12:36 +00:00
|
|
|
{
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if(type < 0 || type >= CD_NUMTYPES) return NULL;
|
|
|
|
|
|
|
|
return LAYERTYPENAMES[type];
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
/********************* CustomData functions *********************/
|
2006-12-12 21:29:09 +00:00
|
|
|
static void customData_update_offsets(CustomData *data);
|
2006-11-11 16:38:37 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
static CustomDataLayer *customData_add_layer__internal(CustomData *data,
|
2006-12-21 13:47:27 +00:00
|
|
|
int type, int alloctype, void *layerdata, int totelem, const char *name);
|
2006-11-11 16:38:37 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
|
2010-03-22 09:30:00 +00:00
|
|
|
CustomDataMask mask, int alloctype, int totelem)
|
2006-08-28 01:12:36 +00:00
|
|
|
{
|
2011-01-13 04:53:55 +00:00
|
|
|
/*const LayerTypeInfo *typeInfo;*/
|
2006-12-12 21:29:09 +00:00
|
|
|
CustomDataLayer *layer, *newlayer;
|
2010-03-30 12:01:17 +00:00
|
|
|
int i, type, number = 0, lasttype = -1, lastactive = 0, lastrender = 0, lastclone = 0, lastmask = 0, lastflag = 0;
|
2006-08-28 01:12:36 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
for(i = 0; i < source->totlayer; ++i) {
|
|
|
|
layer = &source->layers[i];
|
2011-01-13 04:53:55 +00:00
|
|
|
/*typeInfo = layerType_getInfo(layer->type);*/ /*UNUSED*/
|
2006-08-28 01:12:36 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
type = layer->type;
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
if (type != lasttype) {
|
|
|
|
number = 0;
|
|
|
|
lastactive = layer->active;
|
2007-05-02 00:01:23 +00:00
|
|
|
lastrender = layer->active_rnd;
|
2008-12-14 17:32:24 +00:00
|
|
|
lastclone = layer->active_clone;
|
|
|
|
lastmask = layer->active_mask;
|
2006-12-12 21:29:09 +00:00
|
|
|
lasttype = type;
|
2010-03-30 12:01:17 +00:00
|
|
|
lastflag = layer->flag;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
}
|
2006-12-12 21:29:09 +00:00
|
|
|
else
|
|
|
|
number++;
|
2006-11-11 16:38:37 +00:00
|
|
|
|
2010-03-30 12:01:17 +00:00
|
|
|
if(lastflag & CD_FLAG_NOCOPY) continue;
|
2009-06-08 20:08:19 +00:00
|
|
|
else if(!((int)mask & (int)(1 << (int)type))) continue;
|
2006-12-12 21:29:09 +00:00
|
|
|
else if(number < CustomData_number_of_layers(dest, type)) continue;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
2010-03-30 12:01:17 +00:00
|
|
|
if((alloctype == CD_ASSIGN) && (lastflag & CD_FLAG_NOFREE))
|
2006-12-12 21:29:09 +00:00
|
|
|
newlayer = customData_add_layer__internal(dest, type, CD_REFERENCE,
|
2006-12-21 13:47:27 +00:00
|
|
|
layer->data, totelem, layer->name);
|
2006-12-12 21:29:09 +00:00
|
|
|
else
|
|
|
|
newlayer = customData_add_layer__internal(dest, type, alloctype,
|
2006-12-21 13:47:27 +00:00
|
|
|
layer->data, totelem, layer->name);
|
2006-12-12 21:29:09 +00:00
|
|
|
|
2007-05-02 00:01:23 +00:00
|
|
|
if(newlayer) {
|
2006-12-12 21:29:09 +00:00
|
|
|
newlayer->active = lastactive;
|
2007-05-02 00:01:23 +00:00
|
|
|
newlayer->active_rnd = lastrender;
|
2008-12-14 17:32:24 +00:00
|
|
|
newlayer->active_clone = lastclone;
|
|
|
|
newlayer->active_mask = lastmask;
|
2010-03-30 12:01:17 +00:00
|
|
|
newlayer->flag |= lastflag & (CD_FLAG_EXTERNAL|CD_FLAG_IN_MEMORY);
|
2007-05-02 00:01:23 +00:00
|
|
|
}
|
2006-12-12 21:29:09 +00:00
|
|
|
}
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
void CustomData_copy(const struct CustomData *source, struct CustomData *dest,
|
2010-03-22 09:30:00 +00:00
|
|
|
CustomDataMask mask, int alloctype, int totelem)
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
{
|
|
|
|
memset(dest, 0, sizeof(*dest));
|
|
|
|
|
2010-03-30 12:01:17 +00:00
|
|
|
if(source->external)
|
|
|
|
dest->external= MEM_dupallocN(source->external);
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
CustomData_merge(source, dest, mask, alloctype, totelem);
|
|
|
|
}
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
static void customData_free_layer__internal(CustomDataLayer *layer, int totelem)
|
2006-08-28 01:12:36 +00:00
|
|
|
{
|
|
|
|
const LayerTypeInfo *typeInfo;
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if(!(layer->flag & CD_FLAG_NOFREE) && layer->data) {
|
|
|
|
typeInfo = layerType_getInfo(layer->type);
|
2006-08-28 01:12:36 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if(typeInfo->free)
|
|
|
|
typeInfo->free(layer->data, totelem, typeInfo->size);
|
|
|
|
|
|
|
|
if(layer->data)
|
|
|
|
MEM_freeN(layer->data);
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
}
|
2006-08-28 01:12:36 +00:00
|
|
|
|
2009-11-25 14:27:50 +00:00
|
|
|
static void CustomData_external_free(CustomData *data)
|
|
|
|
{
|
|
|
|
if(data->external) {
|
|
|
|
MEM_freeN(data->external);
|
|
|
|
data->external= NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
void CustomData_free(CustomData *data, int totelem)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0; i < data->totlayer; ++i)
|
2006-12-12 21:29:09 +00:00
|
|
|
customData_free_layer__internal(&data->layers[i], totelem);
|
2006-08-28 01:12:36 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if(data->layers)
|
2006-08-28 01:12:36 +00:00
|
|
|
MEM_freeN(data->layers);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
2009-11-25 14:27:50 +00:00
|
|
|
CustomData_external_free(data);
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
memset(data, 0, sizeof(*data));
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
static void customData_update_offsets(CustomData *data)
|
|
|
|
{
|
|
|
|
const LayerTypeInfo *typeInfo;
|
|
|
|
int i, offset = 0;
|
|
|
|
|
|
|
|
for(i = 0; i < data->totlayer; ++i) {
|
|
|
|
typeInfo = layerType_getInfo(data->layers[i].type);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
data->layers[i].offset = offset;
|
|
|
|
offset += typeInfo->size;
|
|
|
|
}
|
|
|
|
|
|
|
|
data->totsize = offset;
|
|
|
|
}
|
|
|
|
|
2006-12-21 13:47:27 +00:00
|
|
|
int CustomData_get_layer_index(const CustomData *data, int type)
|
2006-11-11 16:38:37 +00:00
|
|
|
{
|
2006-12-12 21:29:09 +00:00
|
|
|
int i;
|
2006-11-11 16:38:37 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
return i;
|
2006-11-11 16:38:37 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2010-11-17 09:45:45 +00:00
|
|
|
int CustomData_get_named_layer_index(const CustomData *data, int type, const char *name)
|
2006-12-23 23:33:03 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type && strcmp(data->layers[i].name, name)==0)
|
|
|
|
return i;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2006-12-13 00:50:02 +00:00
|
|
|
int CustomData_get_active_layer_index(const CustomData *data, int type)
|
2006-12-12 21:29:09 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
return i + data->layers[i].active;
|
2006-11-11 16:38:37 +00:00
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2007-05-02 00:01:23 +00:00
|
|
|
int CustomData_get_render_layer_index(const CustomData *data, int type)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
return i + data->layers[i].active_rnd;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2008-12-14 17:32:24 +00:00
|
|
|
int CustomData_get_clone_layer_index(const CustomData *data, int type)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
return i + data->layers[i].active_clone;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2009-12-22 10:48:13 +00:00
|
|
|
int CustomData_get_stencil_layer_index(const CustomData *data, int type)
|
2008-12-14 17:32:24 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
return i + data->layers[i].active_mask;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2007-09-18 19:39:25 +00:00
|
|
|
int CustomData_get_active_layer(const CustomData *data, int type)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
return data->layers[i].active;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int CustomData_get_render_layer(const CustomData *data, int type)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
return data->layers[i].active_rnd;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2008-12-14 17:32:24 +00:00
|
|
|
int CustomData_get_clone_layer(const CustomData *data, int type)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
return data->layers[i].active_clone;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2009-12-22 10:48:13 +00:00
|
|
|
int CustomData_get_stencil_layer(const CustomData *data, int type)
|
2008-12-14 17:32:24 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
return data->layers[i].active_mask;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
2007-09-18 19:39:25 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
void CustomData_set_layer_active(CustomData *data, int type, int n)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
data->layers[i].active = n;
|
|
|
|
}
|
|
|
|
|
2007-05-02 00:01:23 +00:00
|
|
|
void CustomData_set_layer_render(CustomData *data, int type, int n)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
data->layers[i].active_rnd = n;
|
|
|
|
}
|
|
|
|
|
2008-12-14 17:32:24 +00:00
|
|
|
void CustomData_set_layer_clone(CustomData *data, int type, int n)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
data->layers[i].active_clone = n;
|
|
|
|
}
|
|
|
|
|
2009-12-22 10:48:13 +00:00
|
|
|
void CustomData_set_layer_stencil(CustomData *data, int type, int n)
|
2008-12-14 17:32:24 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
data->layers[i].active_mask = n;
|
|
|
|
}
|
|
|
|
|
2007-09-12 02:13:35 +00:00
|
|
|
/* for using with an index from CustomData_get_active_layer_index and CustomData_get_render_layer_index */
|
|
|
|
void CustomData_set_layer_active_index(CustomData *data, int type, int n)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
data->layers[i].active = n-i;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CustomData_set_layer_render_index(CustomData *data, int type, int n)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
data->layers[i].active_rnd = n-i;
|
|
|
|
}
|
|
|
|
|
2008-12-14 17:32:24 +00:00
|
|
|
void CustomData_set_layer_clone_index(CustomData *data, int type, int n)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
data->layers[i].active_clone = n-i;
|
|
|
|
}
|
|
|
|
|
2009-12-22 10:48:13 +00:00
|
|
|
void CustomData_set_layer_stencil_index(CustomData *data, int type, int n)
|
2008-12-14 17:32:24 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
data->layers[i].active_mask = n-i;
|
|
|
|
}
|
2007-05-02 00:01:23 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
void CustomData_set_layer_flag(struct CustomData *data, int type, int flag)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i < data->totlayer; ++i)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
data->layers[i].flag |= flag;
|
|
|
|
}
|
|
|
|
|
2006-11-11 16:38:37 +00:00
|
|
|
static int customData_resize(CustomData *data, int amount)
|
2006-08-28 01:12:36 +00:00
|
|
|
{
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
CustomDataLayer *tmp = MEM_callocN(sizeof(*tmp)*(data->maxlayer + amount),
|
2010-03-22 09:30:00 +00:00
|
|
|
"CustomData->layers");
|
2006-08-28 01:12:36 +00:00
|
|
|
if(!tmp) return 0;
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
data->maxlayer += amount;
|
|
|
|
if (data->layers) {
|
|
|
|
memcpy(tmp, data->layers, sizeof(*tmp) * data->totlayer);
|
|
|
|
MEM_freeN(data->layers);
|
|
|
|
}
|
2006-08-28 01:12:36 +00:00
|
|
|
data->layers = tmp;
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
static CustomDataLayer *customData_add_layer__internal(CustomData *data,
|
2006-12-21 13:47:27 +00:00
|
|
|
int type, int alloctype, void *layerdata, int totelem, const char *name)
|
2006-08-28 01:12:36 +00:00
|
|
|
{
|
2006-12-12 21:29:09 +00:00
|
|
|
const LayerTypeInfo *typeInfo= layerType_getInfo(type);
|
|
|
|
int size = typeInfo->size * totelem, flag = 0, index = data->totlayer;
|
|
|
|
void *newlayerdata;
|
2006-08-28 01:12:36 +00:00
|
|
|
|
2007-01-06 20:16:06 +00:00
|
|
|
if (!typeInfo->defaultname && CustomData_has_layer(data, type))
|
|
|
|
return &data->layers[CustomData_get_layer_index(data, type)];
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
if((alloctype == CD_ASSIGN) || (alloctype == CD_REFERENCE)) {
|
|
|
|
newlayerdata = layerdata;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
newlayerdata = MEM_callocN(size, layerType_getName(type));
|
|
|
|
if(!newlayerdata)
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (alloctype == CD_DUPLICATE) {
|
|
|
|
if(typeInfo->copy)
|
|
|
|
typeInfo->copy(layerdata, newlayerdata, totelem);
|
|
|
|
else
|
|
|
|
memcpy(newlayerdata, layerdata, size);
|
|
|
|
}
|
|
|
|
else if (alloctype == CD_DEFAULT) {
|
|
|
|
if(typeInfo->set_default)
|
|
|
|
typeInfo->set_default((char*)newlayerdata, totelem);
|
|
|
|
}
|
|
|
|
else if (alloctype == CD_REFERENCE)
|
|
|
|
flag |= CD_FLAG_NOFREE;
|
|
|
|
|
|
|
|
if(index >= data->maxlayer) {
|
|
|
|
if(!customData_resize(data, CUSTOMDATA_GROW)) {
|
|
|
|
if(newlayerdata != layerdata)
|
|
|
|
MEM_freeN(newlayerdata);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
2006-11-11 16:38:37 +00:00
|
|
|
|
2006-12-21 13:47:27 +00:00
|
|
|
data->totlayer++;
|
|
|
|
|
2006-08-28 01:12:36 +00:00
|
|
|
/* keep layers ordered by type */
|
|
|
|
for( ; index > 0 && data->layers[index - 1].type > type; --index)
|
|
|
|
data->layers[index] = data->layers[index - 1];
|
|
|
|
|
|
|
|
data->layers[index].type = type;
|
|
|
|
data->layers[index].flag = flag;
|
2006-12-12 21:29:09 +00:00
|
|
|
data->layers[index].data = newlayerdata;
|
2010-08-23 22:16:45 +00:00
|
|
|
if(name || (name=typeInfo->defaultname)) {
|
2010-12-19 20:23:30 +00:00
|
|
|
BLI_strncpy(data->layers[index].name, name, 32);
|
2006-12-21 13:47:27 +00:00
|
|
|
CustomData_set_layer_unique_name(data, index);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
data->layers[index].name[0] = '\0';
|
|
|
|
|
2007-05-02 00:01:23 +00:00
|
|
|
if(index > 0 && data->layers[index-1].type == type) {
|
2006-12-12 21:29:09 +00:00
|
|
|
data->layers[index].active = data->layers[index-1].active;
|
2007-05-02 00:01:23 +00:00
|
|
|
data->layers[index].active_rnd = data->layers[index-1].active_rnd;
|
2008-12-14 17:32:24 +00:00
|
|
|
data->layers[index].active_clone = data->layers[index-1].active_clone;
|
|
|
|
data->layers[index].active_mask = data->layers[index-1].active_mask;
|
2007-05-02 00:01:23 +00:00
|
|
|
} else {
|
2006-12-12 21:29:09 +00:00
|
|
|
data->layers[index].active = 0;
|
2007-05-02 00:01:23 +00:00
|
|
|
data->layers[index].active_rnd = 0;
|
2008-12-14 17:32:24 +00:00
|
|
|
data->layers[index].active_clone = 0;
|
|
|
|
data->layers[index].active_mask = 0;
|
2007-05-02 00:01:23 +00:00
|
|
|
}
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
customData_update_offsets(data);
|
2006-11-11 16:38:37 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
return &data->layers[index];
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
void *CustomData_add_layer(CustomData *data, int type, int alloctype,
|
2010-03-22 09:30:00 +00:00
|
|
|
void *layerdata, int totelem)
|
2006-08-28 01:12:36 +00:00
|
|
|
{
|
2006-12-12 21:29:09 +00:00
|
|
|
CustomDataLayer *layer;
|
2006-12-21 13:47:27 +00:00
|
|
|
const LayerTypeInfo *typeInfo= layerType_getInfo(type);
|
2006-12-12 21:29:09 +00:00
|
|
|
|
|
|
|
layer = customData_add_layer__internal(data, type, alloctype, layerdata,
|
2010-03-22 09:30:00 +00:00
|
|
|
totelem, typeInfo->defaultname);
|
2006-08-28 01:12:36 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
if(layer)
|
|
|
|
return layer->data;
|
2006-08-28 01:12:36 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
return NULL;
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
|
|
|
|
2006-12-24 11:15:54 +00:00
|
|
|
/*same as above but accepts a name*/
|
|
|
|
void *CustomData_add_layer_named(CustomData *data, int type, int alloctype,
|
2010-08-23 22:16:45 +00:00
|
|
|
void *layerdata, int totelem, const char *name)
|
2006-12-24 11:15:54 +00:00
|
|
|
{
|
|
|
|
CustomDataLayer *layer;
|
|
|
|
|
|
|
|
layer = customData_add_layer__internal(data, type, alloctype, layerdata,
|
2010-03-22 09:30:00 +00:00
|
|
|
totelem, name);
|
2006-12-24 11:15:54 +00:00
|
|
|
|
|
|
|
if(layer)
|
|
|
|
return layer->data;
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-12-23 17:07:02 +00:00
|
|
|
int CustomData_free_layer(CustomData *data, int type, int totelem, int index)
|
2006-11-11 16:38:37 +00:00
|
|
|
{
|
2006-12-23 17:07:02 +00:00
|
|
|
int i;
|
|
|
|
|
2006-11-11 16:38:37 +00:00
|
|
|
if (index < 0) return 0;
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
customData_free_layer__internal(&data->layers[index], totelem);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
for (i=index+1; i < data->totlayer; ++i)
|
|
|
|
data->layers[i-1] = data->layers[i];
|
2006-11-11 16:38:37 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
data->totlayer--;
|
2006-11-11 16:38:37 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
/* if layer was last of type in array, set new active layer */
|
|
|
|
if ((index >= data->totlayer) || (data->layers[index].type != type)) {
|
|
|
|
i = CustomData_get_layer_index(data, type);
|
|
|
|
|
|
|
|
if (i >= 0)
|
2007-05-02 00:01:23 +00:00
|
|
|
for (; i < data->totlayer && data->layers[i].type == type; i++) {
|
2006-12-12 21:29:09 +00:00
|
|
|
data->layers[i].active--;
|
2007-05-02 00:01:23 +00:00
|
|
|
data->layers[i].active_rnd--;
|
2008-12-14 17:32:24 +00:00
|
|
|
data->layers[i].active_clone--;
|
|
|
|
data->layers[i].active_mask--;
|
2007-05-02 00:01:23 +00:00
|
|
|
}
|
2006-12-12 21:29:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (data->totlayer <= data->maxlayer-CUSTOMDATA_GROW)
|
2006-11-11 16:38:37 +00:00
|
|
|
customData_resize(data, -CUSTOMDATA_GROW);
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
customData_update_offsets(data);
|
2006-11-11 16:38:37 +00:00
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2006-12-23 17:07:02 +00:00
|
|
|
int CustomData_free_layer_active(CustomData *data, int type, int totelem)
|
|
|
|
{
|
|
|
|
int index = 0;
|
|
|
|
index = CustomData_get_active_layer_index(data, type);
|
|
|
|
if (index < 0) return 0;
|
|
|
|
return CustomData_free_layer(data, type, totelem, index);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
void CustomData_free_layers(CustomData *data, int type, int totelem)
|
|
|
|
{
|
|
|
|
while (CustomData_has_layer(data, type))
|
2006-12-23 17:07:02 +00:00
|
|
|
CustomData_free_layer_active(data, type, totelem);
|
2006-12-12 21:29:09 +00:00
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
int CustomData_has_layer(const CustomData *data, int type)
|
2006-11-11 16:38:37 +00:00
|
|
|
{
|
2006-12-12 21:29:09 +00:00
|
|
|
return (CustomData_get_layer_index(data, type) != -1);
|
|
|
|
}
|
|
|
|
|
|
|
|
int CustomData_number_of_layers(const CustomData *data, int type)
|
|
|
|
{
|
|
|
|
int i, number = 0;
|
|
|
|
|
|
|
|
for(i = 0; i < data->totlayer; i++)
|
|
|
|
if(data->layers[i].type == type)
|
|
|
|
number++;
|
|
|
|
|
|
|
|
return number;
|
2006-11-11 16:38:37 +00:00
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
void *CustomData_duplicate_referenced_layer(struct CustomData *data, int type)
|
|
|
|
{
|
|
|
|
CustomDataLayer *layer;
|
|
|
|
int layer_index;
|
|
|
|
|
|
|
|
/* get the layer index of the first layer of type */
|
2006-12-12 21:29:09 +00:00
|
|
|
layer_index = CustomData_get_active_layer_index(data, type);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if(layer_index < 0) return NULL;
|
|
|
|
|
|
|
|
layer = &data->layers[layer_index];
|
|
|
|
|
|
|
|
if (layer->flag & CD_FLAG_NOFREE) {
|
|
|
|
layer->data = MEM_dupallocN(layer->data);
|
|
|
|
layer->flag &= ~CD_FLAG_NOFREE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return layer->data;
|
|
|
|
}
|
|
|
|
|
2007-01-29 15:10:55 +00:00
|
|
|
void *CustomData_duplicate_referenced_layer_named(struct CustomData *data,
|
2010-11-17 09:45:45 +00:00
|
|
|
int type, const char *name)
|
2007-01-29 15:10:55 +00:00
|
|
|
{
|
|
|
|
CustomDataLayer *layer;
|
|
|
|
int layer_index;
|
|
|
|
|
|
|
|
/* get the layer index of the desired layer */
|
|
|
|
layer_index = CustomData_get_named_layer_index(data, type, name);
|
|
|
|
if(layer_index < 0) return NULL;
|
|
|
|
|
|
|
|
layer = &data->layers[layer_index];
|
|
|
|
|
|
|
|
if (layer->flag & CD_FLAG_NOFREE) {
|
|
|
|
layer->data = MEM_dupallocN(layer->data);
|
|
|
|
layer->flag &= ~CD_FLAG_NOFREE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return layer->data;
|
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
void CustomData_free_temporary(CustomData *data, int totelem)
|
|
|
|
{
|
|
|
|
CustomDataLayer *layer;
|
|
|
|
int i, j;
|
|
|
|
|
|
|
|
for(i = 0, j = 0; i < data->totlayer; ++i) {
|
|
|
|
layer = &data->layers[i];
|
|
|
|
|
|
|
|
if (i != j)
|
|
|
|
data->layers[j] = data->layers[i];
|
|
|
|
|
|
|
|
if ((layer->flag & CD_FLAG_TEMPORARY) == CD_FLAG_TEMPORARY)
|
2006-12-12 21:29:09 +00:00
|
|
|
customData_free_layer__internal(layer, totelem);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
else
|
|
|
|
j++;
|
|
|
|
}
|
|
|
|
|
|
|
|
data->totlayer = j;
|
|
|
|
|
|
|
|
if(data->totlayer <= data->maxlayer-CUSTOMDATA_GROW)
|
|
|
|
customData_resize(data, -CUSTOMDATA_GROW);
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
customData_update_offsets(data);
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
|
|
|
|
2006-12-05 17:42:03 +00:00
|
|
|
void CustomData_set_only_copy(const struct CustomData *data,
|
2010-03-22 09:30:00 +00:00
|
|
|
CustomDataMask mask)
|
2006-12-05 17:42:03 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0; i < data->totlayer; ++i)
|
2009-06-08 20:08:19 +00:00
|
|
|
if(!((int)mask & (int)(1 << (int)data->layers[i].type)))
|
2006-12-05 17:42:03 +00:00
|
|
|
data->layers[i].flag |= CD_FLAG_NOCOPY;
|
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
void CustomData_copy_data(const CustomData *source, CustomData *dest,
|
2010-03-22 09:30:00 +00:00
|
|
|
int source_index, int dest_index, int count)
|
2006-08-28 01:12:36 +00:00
|
|
|
{
|
2006-12-12 21:29:09 +00:00
|
|
|
const LayerTypeInfo *typeInfo;
|
2006-08-28 01:12:36 +00:00
|
|
|
int src_i, dest_i;
|
|
|
|
int src_offset;
|
|
|
|
int dest_offset;
|
|
|
|
|
|
|
|
/* copies a layer at a time */
|
|
|
|
dest_i = 0;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
for(src_i = 0; src_i < source->totlayer; ++src_i) {
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
/* find the first dest layer with type >= the source type
|
|
|
|
* (this should work because layers are ordered by type)
|
|
|
|
*/
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
while(dest_i < dest->totlayer
|
2010-03-22 09:30:00 +00:00
|
|
|
&& dest->layers[dest_i].type < source->layers[src_i].type)
|
2006-08-28 01:12:36 +00:00
|
|
|
++dest_i;
|
|
|
|
|
|
|
|
/* if there are no more dest layers, we're done */
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if(dest_i >= dest->totlayer) return;
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
/* if we found a matching layer, copy the data */
|
|
|
|
if(dest->layers[dest_i].type == source->layers[src_i].type) {
|
|
|
|
char *src_data = source->layers[src_i].data;
|
|
|
|
char *dest_data = dest->layers[dest_i].data;
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
typeInfo = layerType_getInfo(source->layers[src_i].type);
|
2006-08-28 01:12:36 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
src_offset = source_index * typeInfo->size;
|
|
|
|
dest_offset = dest_index * typeInfo->size;
|
2006-08-28 01:12:36 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
if(typeInfo->copy)
|
|
|
|
typeInfo->copy(src_data + src_offset,
|
2010-03-22 09:30:00 +00:00
|
|
|
dest_data + dest_offset,
|
|
|
|
count);
|
2006-08-28 01:12:36 +00:00
|
|
|
else
|
|
|
|
memcpy(dest_data + dest_offset,
|
2010-03-22 09:30:00 +00:00
|
|
|
src_data + src_offset,
|
|
|
|
count * typeInfo->size);
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
/* if there are multiple source & dest layers of the same type,
|
|
|
|
* we don't want to copy all source layers to the same dest, so
|
|
|
|
* increment dest_i
|
|
|
|
*/
|
|
|
|
++dest_i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
void CustomData_free_elem(CustomData *data, int index, int count)
|
2006-08-28 01:12:36 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
const LayerTypeInfo *typeInfo;
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
for(i = 0; i < data->totlayer; ++i) {
|
|
|
|
if(!(data->layers[i].flag & CD_FLAG_NOFREE)) {
|
2006-08-28 01:12:36 +00:00
|
|
|
typeInfo = layerType_getInfo(data->layers[i].type);
|
|
|
|
|
|
|
|
if(typeInfo->free) {
|
|
|
|
int offset = typeInfo->size * index;
|
|
|
|
|
|
|
|
typeInfo->free((char *)data->layers[i].data + offset,
|
2010-03-22 09:30:00 +00:00
|
|
|
count, typeInfo->size);
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SOURCE_BUF_SIZE 100
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
void CustomData_interp(const CustomData *source, CustomData *dest,
|
2010-03-22 09:30:00 +00:00
|
|
|
int *src_indices, float *weights, float *sub_weights,
|
|
|
|
int count, int dest_index)
|
2006-08-28 01:12:36 +00:00
|
|
|
{
|
|
|
|
int src_i, dest_i;
|
|
|
|
int dest_offset;
|
|
|
|
int j;
|
|
|
|
void *source_buf[SOURCE_BUF_SIZE];
|
|
|
|
void **sources = source_buf;
|
|
|
|
|
|
|
|
/* slow fallback in case we're interpolating a ridiculous number of
|
|
|
|
* elements
|
|
|
|
*/
|
|
|
|
if(count > SOURCE_BUF_SIZE)
|
|
|
|
sources = MEM_callocN(sizeof(*sources) * count,
|
2010-03-22 09:30:00 +00:00
|
|
|
"CustomData_interp sources");
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
/* interpolates a layer at a time */
|
2006-12-12 21:29:09 +00:00
|
|
|
dest_i = 0;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
for(src_i = 0; src_i < source->totlayer; ++src_i) {
|
2006-12-12 21:29:09 +00:00
|
|
|
const LayerTypeInfo *typeInfo= layerType_getInfo(source->layers[src_i].type);
|
|
|
|
if(!typeInfo->interp) continue;
|
2006-08-28 01:12:36 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
/* find the first dest layer with type >= the source type
|
|
|
|
* (this should work because layers are ordered by type)
|
|
|
|
*/
|
|
|
|
while(dest_i < dest->totlayer
|
2010-03-22 09:30:00 +00:00
|
|
|
&& dest->layers[dest_i].type < source->layers[src_i].type)
|
2006-12-12 21:29:09 +00:00
|
|
|
++dest_i;
|
|
|
|
|
|
|
|
/* if there are no more dest layers, we're done */
|
|
|
|
if(dest_i >= dest->totlayer) return;
|
2006-08-28 01:12:36 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
/* if we found a matching layer, copy the data */
|
|
|
|
if(dest->layers[dest_i].type == source->layers[src_i].type) {
|
|
|
|
void *src_data = source->layers[src_i].data;
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
for(j = 0; j < count; ++j)
|
|
|
|
sources[j] = (char *)src_data
|
2006-12-12 21:29:09 +00:00
|
|
|
+ typeInfo->size * src_indices[j];
|
2006-08-28 01:12:36 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
dest_offset = dest_index * typeInfo->size;
|
2006-08-28 01:12:36 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
typeInfo->interp(sources, weights, sub_weights, count,
|
|
|
|
(char *)dest->layers[dest_i].data + dest_offset);
|
|
|
|
|
|
|
|
/* if there are multiple source & dest layers of the same type,
|
|
|
|
* we don't want to copy all source layers to the same dest, so
|
|
|
|
* increment dest_i
|
|
|
|
*/
|
|
|
|
++dest_i;
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(count > SOURCE_BUF_SIZE) MEM_freeN(sources);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
}
|
|
|
|
|
2010-04-10 22:12:10 +00:00
|
|
|
void CustomData_swap(struct CustomData *data, int index, const int *corner_indices)
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
{
|
|
|
|
const LayerTypeInfo *typeInfo;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0; i < data->totlayer; ++i) {
|
|
|
|
typeInfo = layerType_getInfo(data->layers[i].type);
|
|
|
|
|
|
|
|
if(typeInfo->swap) {
|
|
|
|
int offset = typeInfo->size * index;
|
|
|
|
|
|
|
|
typeInfo->swap((char *)data->layers[i].data + offset, corner_indices);
|
|
|
|
}
|
|
|
|
}
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void *CustomData_get(const CustomData *data, int index, int type)
|
|
|
|
{
|
|
|
|
int offset;
|
|
|
|
int layer_index;
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
/* get the layer index of the active layer of type */
|
|
|
|
layer_index = CustomData_get_active_layer_index(data, type);
|
2006-08-28 01:12:36 +00:00
|
|
|
if(layer_index < 0) return NULL;
|
|
|
|
|
|
|
|
/* get the offset of the desired element */
|
|
|
|
offset = layerType_getInfo(type)->size * index;
|
|
|
|
|
|
|
|
return (char *)data->layers[layer_index].data + offset;
|
|
|
|
}
|
|
|
|
|
|
|
|
void *CustomData_get_layer(const CustomData *data, int type)
|
|
|
|
{
|
2006-12-12 21:29:09 +00:00
|
|
|
/* get the layer index of the active layer of type */
|
|
|
|
int layer_index = CustomData_get_active_layer_index(data, type);
|
2006-08-28 01:12:36 +00:00
|
|
|
if(layer_index < 0) return NULL;
|
|
|
|
|
|
|
|
return data->layers[layer_index].data;
|
|
|
|
}
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
void *CustomData_get_layer_n(const CustomData *data, int type, int n)
|
|
|
|
{
|
|
|
|
/* get the layer index of the active layer of type */
|
|
|
|
int layer_index = CustomData_get_layer_index(data, type);
|
|
|
|
if(layer_index < 0) return NULL;
|
|
|
|
|
|
|
|
return data->layers[layer_index+n].data;
|
|
|
|
}
|
|
|
|
|
2007-01-29 15:10:55 +00:00
|
|
|
void *CustomData_get_layer_named(const struct CustomData *data, int type,
|
2010-11-17 09:45:45 +00:00
|
|
|
const char *name)
|
2007-01-29 15:10:55 +00:00
|
|
|
{
|
|
|
|
int layer_index = CustomData_get_named_layer_index(data, type, name);
|
|
|
|
if(layer_index < 0) return NULL;
|
|
|
|
|
|
|
|
return data->layers[layer_index].data;
|
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
void *CustomData_set_layer(const CustomData *data, int type, void *ptr)
|
|
|
|
{
|
|
|
|
/* get the layer index of the first layer of type */
|
2006-12-12 21:29:09 +00:00
|
|
|
int layer_index = CustomData_get_active_layer_index(data, type);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
|
|
|
if(layer_index < 0) return NULL;
|
|
|
|
|
|
|
|
data->layers[layer_index].data = ptr;
|
|
|
|
|
|
|
|
return ptr;
|
|
|
|
}
|
|
|
|
|
2007-01-10 06:09:10 +00:00
|
|
|
void *CustomData_set_layer_n(const struct CustomData *data, int type, int n, void *ptr)
|
|
|
|
{
|
|
|
|
/* get the layer index of the first layer of type */
|
|
|
|
int layer_index = CustomData_get_layer_index(data, type);
|
|
|
|
if(layer_index < 0) return NULL;
|
|
|
|
|
|
|
|
data->layers[layer_index+n].data = ptr;
|
|
|
|
|
|
|
|
return ptr;
|
|
|
|
}
|
|
|
|
|
2006-08-28 01:12:36 +00:00
|
|
|
void CustomData_set(const CustomData *data, int index, int type, void *source)
|
|
|
|
{
|
|
|
|
void *dest = CustomData_get(data, index, type);
|
2006-12-12 21:29:09 +00:00
|
|
|
const LayerTypeInfo *typeInfo = layerType_getInfo(type);
|
2006-08-28 01:12:36 +00:00
|
|
|
|
|
|
|
if(!dest) return;
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
if(typeInfo->copy)
|
|
|
|
typeInfo->copy(source, dest, 1);
|
2006-08-28 01:12:36 +00:00
|
|
|
else
|
2006-12-12 21:29:09 +00:00
|
|
|
memcpy(dest, source, typeInfo->size);
|
2006-08-28 01:12:36 +00:00
|
|
|
}
|
2006-11-11 16:38:37 +00:00
|
|
|
|
|
|
|
/* EditMesh functions */
|
|
|
|
|
2006-11-11 23:23:15 +00:00
|
|
|
void CustomData_em_free_block(CustomData *data, void **block)
|
|
|
|
{
|
2010-03-22 09:30:00 +00:00
|
|
|
const LayerTypeInfo *typeInfo;
|
|
|
|
int i;
|
2006-11-11 23:23:15 +00:00
|
|
|
|
|
|
|
if(!*block) return;
|
|
|
|
|
2010-03-22 09:30:00 +00:00
|
|
|
for(i = 0; i < data->totlayer; ++i) {
|
|
|
|
if(!(data->layers[i].flag & CD_FLAG_NOFREE)) {
|
|
|
|
typeInfo = layerType_getInfo(data->layers[i].type);
|
2006-11-11 23:23:15 +00:00
|
|
|
|
2010-03-22 09:30:00 +00:00
|
|
|
if(typeInfo->free) {
|
2006-11-11 23:23:15 +00:00
|
|
|
int offset = data->layers[i].offset;
|
2010-03-22 09:30:00 +00:00
|
|
|
typeInfo->free((char*)*block + offset, 1, typeInfo->size);
|
2006-11-11 23:23:15 +00:00
|
|
|
}
|
2010-03-22 09:30:00 +00:00
|
|
|
}
|
|
|
|
}
|
2006-11-11 23:23:15 +00:00
|
|
|
|
|
|
|
MEM_freeN(*block);
|
|
|
|
*block = NULL;
|
|
|
|
}
|
|
|
|
|
2006-11-11 16:38:37 +00:00
|
|
|
static void CustomData_em_alloc_block(CustomData *data, void **block)
|
|
|
|
{
|
|
|
|
/* TODO: optimize free/alloc */
|
|
|
|
|
|
|
|
if (*block)
|
2006-11-11 23:23:15 +00:00
|
|
|
CustomData_em_free_block(data, block);
|
2006-11-11 16:38:37 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if (data->totsize > 0)
|
|
|
|
*block = MEM_callocN(data->totsize, "CustomData EM block");
|
2006-11-11 16:38:37 +00:00
|
|
|
else
|
|
|
|
*block = NULL;
|
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
void CustomData_em_copy_data(const CustomData *source, CustomData *dest,
|
2010-03-22 09:30:00 +00:00
|
|
|
void *src_block, void **dest_block)
|
2006-11-11 16:38:37 +00:00
|
|
|
{
|
2006-12-12 21:29:09 +00:00
|
|
|
const LayerTypeInfo *typeInfo;
|
2006-11-11 23:23:15 +00:00
|
|
|
int dest_i, src_i;
|
2006-11-11 16:38:37 +00:00
|
|
|
|
|
|
|
if (!*dest_block)
|
2006-11-11 23:23:15 +00:00
|
|
|
CustomData_em_alloc_block(dest, dest_block);
|
2006-11-11 16:38:37 +00:00
|
|
|
|
|
|
|
/* copies a layer at a time */
|
2006-11-11 23:23:15 +00:00
|
|
|
dest_i = 0;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
for(src_i = 0; src_i < source->totlayer; ++src_i) {
|
2006-11-11 16:38:37 +00:00
|
|
|
|
2006-11-11 23:23:15 +00:00
|
|
|
/* find the first dest layer with type >= the source type
|
|
|
|
* (this should work because layers are ordered by type)
|
|
|
|
*/
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
while(dest_i < dest->totlayer
|
2010-03-22 09:30:00 +00:00
|
|
|
&& dest->layers[dest_i].type < source->layers[src_i].type)
|
2006-11-11 23:23:15 +00:00
|
|
|
++dest_i;
|
|
|
|
|
|
|
|
/* if there are no more dest layers, we're done */
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if(dest_i >= dest->totlayer) return;
|
2006-11-11 23:23:15 +00:00
|
|
|
|
|
|
|
/* if we found a matching layer, copy the data */
|
2008-05-15 19:40:09 +00:00
|
|
|
if(dest->layers[dest_i].type == source->layers[src_i].type &&
|
|
|
|
strcmp(dest->layers[dest_i].name, source->layers[src_i].name) == 0) {
|
2006-11-11 23:23:15 +00:00
|
|
|
char *src_data = (char*)src_block + source->layers[src_i].offset;
|
|
|
|
char *dest_data = (char*)*dest_block + dest->layers[dest_i].offset;
|
2006-11-11 16:38:37 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
typeInfo = layerType_getInfo(source->layers[src_i].type);
|
2006-11-11 23:23:15 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
if(typeInfo->copy)
|
|
|
|
typeInfo->copy(src_data, dest_data, 1);
|
2006-11-11 23:23:15 +00:00
|
|
|
else
|
2006-12-12 21:29:09 +00:00
|
|
|
memcpy(dest_data, src_data, typeInfo->size);
|
2006-11-11 23:23:15 +00:00
|
|
|
|
|
|
|
/* if there are multiple source & dest layers of the same type,
|
|
|
|
* we don't want to copy all source layers to the same dest, so
|
|
|
|
* increment dest_i
|
|
|
|
*/
|
|
|
|
++dest_i;
|
|
|
|
}
|
2006-11-11 16:38:37 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-02 17:08:25 +00:00
|
|
|
void CustomData_em_validate_data(CustomData *data, void *block, int sub_elements)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < data->totlayer; i++) {
|
|
|
|
const LayerTypeInfo *typeInfo = layerType_getInfo(data->layers[i].type);
|
|
|
|
char *leayer_data = (char*)block + data->layers[i].offset;
|
|
|
|
|
|
|
|
if(typeInfo->validate)
|
|
|
|
typeInfo->validate(leayer_data, sub_elements);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-11-11 16:38:37 +00:00
|
|
|
void *CustomData_em_get(const CustomData *data, void *block, int type)
|
|
|
|
{
|
|
|
|
int layer_index;
|
|
|
|
|
|
|
|
/* get the layer index of the first layer of type */
|
2006-12-12 21:29:09 +00:00
|
|
|
layer_index = CustomData_get_active_layer_index(data, type);
|
2006-11-11 16:38:37 +00:00
|
|
|
if(layer_index < 0) return NULL;
|
|
|
|
|
|
|
|
return (char *)block + data->layers[layer_index].offset;
|
|
|
|
}
|
|
|
|
|
2007-01-10 06:09:10 +00:00
|
|
|
void *CustomData_em_get_n(const CustomData *data, void *block, int type, int n)
|
|
|
|
{
|
|
|
|
int layer_index;
|
|
|
|
|
|
|
|
/* get the layer index of the first layer of type */
|
2008-06-07 18:16:23 +00:00
|
|
|
layer_index = CustomData_get_layer_index(data, type);
|
2007-01-10 06:09:10 +00:00
|
|
|
if(layer_index < 0) return NULL;
|
|
|
|
|
|
|
|
return (char *)block + data->layers[layer_index+n].offset;
|
|
|
|
}
|
|
|
|
|
2006-11-11 16:38:37 +00:00
|
|
|
void CustomData_em_set(CustomData *data, void *block, int type, void *source)
|
|
|
|
{
|
2006-11-11 17:18:42 +00:00
|
|
|
void *dest = CustomData_em_get(data, block, type);
|
2006-12-12 21:29:09 +00:00
|
|
|
const LayerTypeInfo *typeInfo = layerType_getInfo(type);
|
2006-11-11 16:38:37 +00:00
|
|
|
|
|
|
|
if(!dest) return;
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
if(typeInfo->copy)
|
|
|
|
typeInfo->copy(source, dest, 1);
|
2006-11-11 16:38:37 +00:00
|
|
|
else
|
2006-12-12 21:29:09 +00:00
|
|
|
memcpy(dest, source, typeInfo->size);
|
2006-11-11 16:38:37 +00:00
|
|
|
}
|
|
|
|
|
2007-01-10 06:09:10 +00:00
|
|
|
void CustomData_em_set_n(CustomData *data, void *block, int type, int n, void *source)
|
|
|
|
{
|
|
|
|
void *dest = CustomData_em_get_n(data, block, type, n);
|
|
|
|
const LayerTypeInfo *typeInfo = layerType_getInfo(type);
|
|
|
|
|
|
|
|
if(!dest) return;
|
|
|
|
|
|
|
|
if(typeInfo->copy)
|
|
|
|
typeInfo->copy(source, dest, 1);
|
|
|
|
else
|
|
|
|
memcpy(dest, source, typeInfo->size);
|
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
void CustomData_em_interp(CustomData *data, void **src_blocks, float *weights,
|
2010-03-22 09:30:00 +00:00
|
|
|
float *sub_weights, int count, void *dest_block)
|
2006-11-11 16:38:37 +00:00
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
void *source_buf[SOURCE_BUF_SIZE];
|
|
|
|
void **sources = source_buf;
|
|
|
|
|
|
|
|
/* slow fallback in case we're interpolating a ridiculous number of
|
|
|
|
* elements
|
|
|
|
*/
|
|
|
|
if(count > SOURCE_BUF_SIZE)
|
|
|
|
sources = MEM_callocN(sizeof(*sources) * count,
|
2010-03-22 09:30:00 +00:00
|
|
|
"CustomData_interp sources");
|
2006-11-11 16:38:37 +00:00
|
|
|
|
|
|
|
/* interpolates a layer at a time */
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
for(i = 0; i < data->totlayer; ++i) {
|
2006-11-11 16:38:37 +00:00
|
|
|
CustomDataLayer *layer = &data->layers[i];
|
2006-12-12 21:29:09 +00:00
|
|
|
const LayerTypeInfo *typeInfo = layerType_getInfo(layer->type);
|
2006-11-11 16:38:37 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
if(typeInfo->interp) {
|
2006-11-11 16:38:37 +00:00
|
|
|
for(j = 0; j < count; ++j)
|
|
|
|
sources[j] = (char *)src_blocks[j] + layer->offset;
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
typeInfo->interp(sources, weights, sub_weights, count,
|
2010-03-22 09:30:00 +00:00
|
|
|
(char *)dest_block + layer->offset);
|
2006-11-11 16:38:37 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(count > SOURCE_BUF_SIZE) MEM_freeN(sources);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CustomData_em_set_default(CustomData *data, void **block)
|
|
|
|
{
|
2006-12-12 21:29:09 +00:00
|
|
|
const LayerTypeInfo *typeInfo;
|
2006-11-11 16:38:37 +00:00
|
|
|
int i;
|
|
|
|
|
|
|
|
if (!*block)
|
|
|
|
CustomData_em_alloc_block(data, block);
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
for(i = 0; i < data->totlayer; ++i) {
|
2006-11-11 16:38:37 +00:00
|
|
|
int offset = data->layers[i].offset;
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
typeInfo = layerType_getInfo(data->layers[i].type);
|
2006-11-11 16:38:37 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
if(typeInfo->set_default)
|
|
|
|
typeInfo->set_default((char*)*block + offset, 1);
|
2006-11-11 16:38:37 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CustomData_to_em_block(const CustomData *source, CustomData *dest,
|
2010-03-22 09:30:00 +00:00
|
|
|
int src_index, void **dest_block)
|
2006-11-11 16:38:37 +00:00
|
|
|
{
|
2006-12-12 21:29:09 +00:00
|
|
|
const LayerTypeInfo *typeInfo;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
int dest_i, src_i, src_offset;
|
2006-11-11 16:38:37 +00:00
|
|
|
|
|
|
|
if (!*dest_block)
|
|
|
|
CustomData_em_alloc_block(dest, dest_block);
|
|
|
|
|
|
|
|
/* copies a layer at a time */
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
dest_i = 0;
|
|
|
|
for(src_i = 0; src_i < source->totlayer; ++src_i) {
|
|
|
|
|
|
|
|
/* find the first dest layer with type >= the source type
|
|
|
|
* (this should work because layers are ordered by type)
|
|
|
|
*/
|
|
|
|
while(dest_i < dest->totlayer
|
2010-03-22 09:30:00 +00:00
|
|
|
&& dest->layers[dest_i].type < source->layers[src_i].type)
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
++dest_i;
|
2006-11-11 16:38:37 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
/* if there are no more dest layers, we're done */
|
|
|
|
if(dest_i >= dest->totlayer) return;
|
2006-11-11 16:38:37 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
/* if we found a matching layer, copy the data */
|
|
|
|
if(dest->layers[dest_i].type == source->layers[src_i].type) {
|
|
|
|
int offset = dest->layers[dest_i].offset;
|
|
|
|
char *src_data = source->layers[src_i].data;
|
|
|
|
char *dest_data = (char*)*dest_block + offset;
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
typeInfo = layerType_getInfo(dest->layers[dest_i].type);
|
|
|
|
src_offset = src_index * typeInfo->size;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
if(typeInfo->copy)
|
|
|
|
typeInfo->copy(src_data + src_offset, dest_data, 1);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
else
|
2006-12-12 21:29:09 +00:00
|
|
|
memcpy(dest_data, src_data + src_offset, typeInfo->size);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
|
|
|
/* if there are multiple source & dest layers of the same type,
|
|
|
|
* we don't want to copy all source layers to the same dest, so
|
|
|
|
* increment dest_i
|
|
|
|
*/
|
|
|
|
++dest_i;
|
|
|
|
}
|
2006-11-11 16:38:37 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CustomData_from_em_block(const CustomData *source, CustomData *dest,
|
2010-03-22 09:30:00 +00:00
|
|
|
void *src_block, int dest_index)
|
2006-11-11 16:38:37 +00:00
|
|
|
{
|
2006-12-12 21:29:09 +00:00
|
|
|
const LayerTypeInfo *typeInfo;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
int dest_i, src_i, dest_offset;
|
2006-11-11 16:38:37 +00:00
|
|
|
|
2008-07-04 17:59:16 +00:00
|
|
|
/* copies a layer at a time */
|
|
|
|
dest_i = 0;
|
|
|
|
for(src_i = 0; src_i < source->totlayer; ++src_i) {
|
|
|
|
|
|
|
|
/* find the first dest layer with type >= the source type
|
|
|
|
* (this should work because layers are ordered by type)
|
|
|
|
*/
|
|
|
|
while(dest_i < dest->totlayer
|
2010-03-22 09:30:00 +00:00
|
|
|
&& dest->layers[dest_i].type < source->layers[src_i].type)
|
2008-07-04 17:59:16 +00:00
|
|
|
++dest_i;
|
|
|
|
|
|
|
|
/* if there are no more dest layers, we're done */
|
|
|
|
if(dest_i >= dest->totlayer) return;
|
|
|
|
|
|
|
|
/* if we found a matching layer, copy the data */
|
|
|
|
if(dest->layers[dest_i].type == source->layers[src_i].type) {
|
|
|
|
int offset = source->layers[src_i].offset;
|
|
|
|
char *src_data = (char*)src_block + offset;
|
|
|
|
char *dest_data = dest->layers[dest_i].data;
|
|
|
|
|
|
|
|
typeInfo = layerType_getInfo(dest->layers[dest_i].type);
|
|
|
|
dest_offset = dest_index * typeInfo->size;
|
|
|
|
|
|
|
|
if(typeInfo->copy)
|
|
|
|
typeInfo->copy(src_data, dest_data + dest_offset, 1);
|
|
|
|
else
|
|
|
|
memcpy(dest_data + dest_offset, src_data, typeInfo->size);
|
|
|
|
|
|
|
|
/* if there are multiple source & dest layers of the same type,
|
|
|
|
* we don't want to copy all source layers to the same dest, so
|
|
|
|
* increment dest_i
|
|
|
|
*/
|
|
|
|
++dest_i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/*Bmesh functions*/
|
2008-07-10 00:46:19 +00:00
|
|
|
/*needed to convert to/from different face reps*/
|
2008-07-08 02:22:37 +00:00
|
|
|
void CustomData_to_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData *ldata)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i=0; i < fdata->totlayer; i++){
|
|
|
|
if(fdata->layers[i].type == CD_MTFACE){
|
|
|
|
CustomData_add_layer(pdata, CD_MTEXPOLY, CD_CALLOC, &(fdata->layers[i].name), 0);
|
|
|
|
CustomData_add_layer(ldata, CD_MLOOPUV, CD_CALLOC, &(fdata->layers[i].name), 0);
|
|
|
|
}
|
|
|
|
else if(fdata->layers[i].type == CD_MCOL)
|
|
|
|
CustomData_add_layer(ldata, CD_MLOOPCOL, CD_CALLOC, &(fdata->layers[i].name), 0);
|
|
|
|
}
|
|
|
|
}
|
2008-07-10 00:46:19 +00:00
|
|
|
void CustomData_from_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData *ldata, int total){
|
2008-07-08 02:22:37 +00:00
|
|
|
int i;
|
|
|
|
for(i=0; i < pdata->totlayer; i++){
|
|
|
|
if(pdata->layers[i].type == CD_MTEXPOLY)
|
2008-07-10 00:46:19 +00:00
|
|
|
CustomData_add_layer(fdata, CD_MTFACE, CD_CALLOC, &(pdata->layers[i].name), total);
|
2008-07-08 02:22:37 +00:00
|
|
|
}
|
|
|
|
for(i=0; i < ldata->totlayer; i++){
|
|
|
|
if(ldata->layers[i].type == CD_MLOOPCOL)
|
2008-07-10 00:46:19 +00:00
|
|
|
CustomData_add_layer(fdata, CD_MCOL, CD_CALLOC, &(ldata->layers[i].name), total);
|
2008-07-08 02:22:37 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CustomData_bmesh_init_pool(CustomData *data, int allocsize){
|
Added a new notifyer, NC_SPACE_CHANGED, to signal an editor that
replaces another so it can do updates (e.g. dopesheet editor can
sync channel selection).
Also coded a simple optimization for allocating small objects,
based on mempools. It's #ifdef'd out, you can enabled it by
defining OPTIMIZE_SMALL_BLOCKS (e.g. adding -DDOPTIMIZE_SMALL_BLOCKS to
your compiler flags).
We suffer from a great deal of performance loss from the system allocator
(vgroups, ghash, edgehash, the singly-linked list implementation in blenlib,
editmesh, and likely a great many areas I'm forgetting), and this is the
common solution for handling the many-small-objects problem. It's not
really production-ready yet (it's long-term memory consequencers need to
be profiled first, and the implementation tweaked as necassary), but for
people on systems with slow system allocators it's worth trying.
Note that since this creates a guardedalloc<->blenlib link, the build systems
need to be updated accordingly (I've already done this for scons, though I'm
not sure if the player builds).
2010-01-21 03:08:57 +00:00
|
|
|
if(data->totlayer)data->pool = BLI_mempool_create(data->totsize, allocsize, allocsize, 0);
|
2008-07-08 02:22:37 +00:00
|
|
|
}
|
|
|
|
|
2008-07-04 17:59:16 +00:00
|
|
|
void CustomData_bmesh_free_block(CustomData *data, void **block)
|
|
|
|
{
|
2010-03-22 09:30:00 +00:00
|
|
|
const LayerTypeInfo *typeInfo;
|
|
|
|
int i;
|
2008-07-04 17:59:16 +00:00
|
|
|
|
|
|
|
if(!*block) return;
|
2010-03-22 09:30:00 +00:00
|
|
|
for(i = 0; i < data->totlayer; ++i) {
|
|
|
|
if(!(data->layers[i].flag & CD_FLAG_NOFREE)) {
|
|
|
|
typeInfo = layerType_getInfo(data->layers[i].type);
|
2008-07-04 17:59:16 +00:00
|
|
|
|
2010-03-22 09:30:00 +00:00
|
|
|
if(typeInfo->free) {
|
2008-07-04 17:59:16 +00:00
|
|
|
int offset = data->layers[i].offset;
|
|
|
|
typeInfo->free((char*)*block + offset, 1, typeInfo->size);
|
|
|
|
}
|
2010-03-22 09:30:00 +00:00
|
|
|
}
|
|
|
|
}
|
2008-07-04 17:59:16 +00:00
|
|
|
|
|
|
|
BLI_mempool_free(data->pool, *block);
|
|
|
|
*block = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void CustomData_bmesh_alloc_block(CustomData *data, void **block)
|
|
|
|
{
|
|
|
|
|
|
|
|
if (*block)
|
|
|
|
CustomData_bmesh_free_block(data, block);
|
|
|
|
|
|
|
|
if (data->totsize > 0)
|
2008-07-08 02:22:37 +00:00
|
|
|
*block = BLI_mempool_calloc(data->pool);
|
2008-07-04 17:59:16 +00:00
|
|
|
else
|
|
|
|
*block = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CustomData_bmesh_copy_data(const CustomData *source, CustomData *dest,
|
2010-03-22 09:30:00 +00:00
|
|
|
void *src_block, void **dest_block)
|
2008-07-04 17:59:16 +00:00
|
|
|
{
|
|
|
|
const LayerTypeInfo *typeInfo;
|
|
|
|
int dest_i, src_i;
|
|
|
|
|
|
|
|
if (!*dest_block)
|
|
|
|
CustomData_bmesh_alloc_block(dest, dest_block);
|
|
|
|
|
|
|
|
/* copies a layer at a time */
|
|
|
|
dest_i = 0;
|
|
|
|
for(src_i = 0; src_i < source->totlayer; ++src_i) {
|
|
|
|
|
|
|
|
/* find the first dest layer with type >= the source type
|
|
|
|
* (this should work because layers are ordered by type)
|
|
|
|
*/
|
|
|
|
while(dest_i < dest->totlayer
|
2010-03-22 09:30:00 +00:00
|
|
|
&& dest->layers[dest_i].type < source->layers[src_i].type)
|
2008-07-04 17:59:16 +00:00
|
|
|
++dest_i;
|
|
|
|
|
|
|
|
/* if there are no more dest layers, we're done */
|
|
|
|
if(dest_i >= dest->totlayer) return;
|
|
|
|
|
|
|
|
/* if we found a matching layer, copy the data */
|
|
|
|
if(dest->layers[dest_i].type == source->layers[src_i].type &&
|
|
|
|
strcmp(dest->layers[dest_i].name, source->layers[src_i].name) == 0) {
|
|
|
|
char *src_data = (char*)src_block + source->layers[src_i].offset;
|
|
|
|
char *dest_data = (char*)*dest_block + dest->layers[dest_i].offset;
|
|
|
|
|
|
|
|
typeInfo = layerType_getInfo(source->layers[src_i].type);
|
|
|
|
|
|
|
|
if(typeInfo->copy)
|
|
|
|
typeInfo->copy(src_data, dest_data, 1);
|
|
|
|
else
|
|
|
|
memcpy(dest_data, src_data, typeInfo->size);
|
|
|
|
|
|
|
|
/* if there are multiple source & dest layers of the same type,
|
|
|
|
* we don't want to copy all source layers to the same dest, so
|
|
|
|
* increment dest_i
|
|
|
|
*/
|
|
|
|
++dest_i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*Bmesh Custom Data Functions. Should replace editmesh ones with these as well, due to more effecient memory alloc*/
|
|
|
|
void *CustomData_bmesh_get(const CustomData *data, void *block, int type)
|
|
|
|
{
|
|
|
|
int layer_index;
|
|
|
|
|
|
|
|
/* get the layer index of the first layer of type */
|
|
|
|
layer_index = CustomData_get_active_layer_index(data, type);
|
|
|
|
if(layer_index < 0) return NULL;
|
|
|
|
|
|
|
|
return (char *)block + data->layers[layer_index].offset;
|
|
|
|
}
|
|
|
|
|
|
|
|
void *CustomData_bmesh_get_n(const CustomData *data, void *block, int type, int n)
|
|
|
|
{
|
|
|
|
int layer_index;
|
|
|
|
|
|
|
|
/* get the layer index of the first layer of type */
|
|
|
|
layer_index = CustomData_get_layer_index(data, type);
|
|
|
|
if(layer_index < 0) return NULL;
|
|
|
|
|
|
|
|
return (char *)block + data->layers[layer_index+n].offset;
|
|
|
|
}
|
|
|
|
|
2008-07-04 22:32:06 +00:00
|
|
|
void CustomData_bmesh_set(const CustomData *data, void *block, int type, void *source)
|
2008-07-04 17:59:16 +00:00
|
|
|
{
|
|
|
|
void *dest = CustomData_bmesh_get(data, block, type);
|
|
|
|
const LayerTypeInfo *typeInfo = layerType_getInfo(type);
|
|
|
|
|
|
|
|
if(!dest) return;
|
|
|
|
|
|
|
|
if(typeInfo->copy)
|
|
|
|
typeInfo->copy(source, dest, 1);
|
|
|
|
else
|
|
|
|
memcpy(dest, source, typeInfo->size);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CustomData_bmesh_set_n(CustomData *data, void *block, int type, int n, void *source)
|
|
|
|
{
|
|
|
|
void *dest = CustomData_bmesh_get_n(data, block, type, n);
|
|
|
|
const LayerTypeInfo *typeInfo = layerType_getInfo(type);
|
|
|
|
|
|
|
|
if(!dest) return;
|
|
|
|
|
|
|
|
if(typeInfo->copy)
|
|
|
|
typeInfo->copy(source, dest, 1);
|
|
|
|
else
|
|
|
|
memcpy(dest, source, typeInfo->size);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CustomData_bmesh_interp(CustomData *data, void **src_blocks, float *weights,
|
2010-03-22 09:30:00 +00:00
|
|
|
float *sub_weights, int count, void *dest_block)
|
2008-07-04 17:59:16 +00:00
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
void *source_buf[SOURCE_BUF_SIZE];
|
|
|
|
void **sources = source_buf;
|
|
|
|
|
|
|
|
/* slow fallback in case we're interpolating a ridiculous number of
|
|
|
|
* elements
|
|
|
|
*/
|
|
|
|
if(count > SOURCE_BUF_SIZE)
|
|
|
|
sources = MEM_callocN(sizeof(*sources) * count,
|
2010-03-22 09:30:00 +00:00
|
|
|
"CustomData_interp sources");
|
2008-07-04 17:59:16 +00:00
|
|
|
|
|
|
|
/* interpolates a layer at a time */
|
|
|
|
for(i = 0; i < data->totlayer; ++i) {
|
|
|
|
CustomDataLayer *layer = &data->layers[i];
|
|
|
|
const LayerTypeInfo *typeInfo = layerType_getInfo(layer->type);
|
|
|
|
if(typeInfo->interp) {
|
|
|
|
for(j = 0; j < count; ++j)
|
|
|
|
sources[j] = (char *)src_blocks[j] + layer->offset;
|
|
|
|
|
|
|
|
typeInfo->interp(sources, weights, sub_weights, count,
|
2010-03-22 09:30:00 +00:00
|
|
|
(char *)dest_block + layer->offset);
|
2008-07-04 17:59:16 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(count > SOURCE_BUF_SIZE) MEM_freeN(sources);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CustomData_bmesh_set_default(CustomData *data, void **block)
|
|
|
|
{
|
|
|
|
const LayerTypeInfo *typeInfo;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (!*block)
|
|
|
|
CustomData_bmesh_alloc_block(data, block);
|
|
|
|
|
|
|
|
for(i = 0; i < data->totlayer; ++i) {
|
|
|
|
int offset = data->layers[i].offset;
|
|
|
|
|
|
|
|
typeInfo = layerType_getInfo(data->layers[i].type);
|
|
|
|
|
|
|
|
if(typeInfo->set_default)
|
|
|
|
typeInfo->set_default((char*)*block + offset, 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CustomData_to_bmesh_block(const CustomData *source, CustomData *dest,
|
2010-03-22 09:30:00 +00:00
|
|
|
int src_index, void **dest_block)
|
2008-07-04 17:59:16 +00:00
|
|
|
{
|
|
|
|
const LayerTypeInfo *typeInfo;
|
|
|
|
int dest_i, src_i, src_offset;
|
|
|
|
|
|
|
|
if (!*dest_block)
|
|
|
|
CustomData_bmesh_alloc_block(dest, dest_block);
|
|
|
|
|
|
|
|
/* copies a layer at a time */
|
|
|
|
dest_i = 0;
|
|
|
|
for(src_i = 0; src_i < source->totlayer; ++src_i) {
|
|
|
|
|
|
|
|
/* find the first dest layer with type >= the source type
|
|
|
|
* (this should work because layers are ordered by type)
|
|
|
|
*/
|
|
|
|
while(dest_i < dest->totlayer
|
2010-03-22 09:30:00 +00:00
|
|
|
&& dest->layers[dest_i].type < source->layers[src_i].type)
|
2008-07-04 17:59:16 +00:00
|
|
|
++dest_i;
|
|
|
|
|
|
|
|
/* if there are no more dest layers, we're done */
|
|
|
|
if(dest_i >= dest->totlayer) return;
|
|
|
|
|
|
|
|
/* if we found a matching layer, copy the data */
|
|
|
|
if(dest->layers[dest_i].type == source->layers[src_i].type) {
|
|
|
|
int offset = dest->layers[dest_i].offset;
|
|
|
|
char *src_data = source->layers[src_i].data;
|
|
|
|
char *dest_data = (char*)*dest_block + offset;
|
|
|
|
|
|
|
|
typeInfo = layerType_getInfo(dest->layers[dest_i].type);
|
|
|
|
src_offset = src_index * typeInfo->size;
|
|
|
|
|
|
|
|
if(typeInfo->copy)
|
|
|
|
typeInfo->copy(src_data + src_offset, dest_data, 1);
|
|
|
|
else
|
|
|
|
memcpy(dest_data, src_data + src_offset, typeInfo->size);
|
|
|
|
|
|
|
|
/* if there are multiple source & dest layers of the same type,
|
|
|
|
* we don't want to copy all source layers to the same dest, so
|
|
|
|
* increment dest_i
|
|
|
|
*/
|
|
|
|
++dest_i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CustomData_from_bmesh_block(const CustomData *source, CustomData *dest,
|
2010-03-22 09:30:00 +00:00
|
|
|
void *src_block, int dest_index)
|
2008-07-04 17:59:16 +00:00
|
|
|
{
|
|
|
|
const LayerTypeInfo *typeInfo;
|
|
|
|
int dest_i, src_i, dest_offset;
|
|
|
|
|
2006-11-11 16:38:37 +00:00
|
|
|
/* copies a layer at a time */
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
dest_i = 0;
|
|
|
|
for(src_i = 0; src_i < source->totlayer; ++src_i) {
|
|
|
|
|
|
|
|
/* find the first dest layer with type >= the source type
|
|
|
|
* (this should work because layers are ordered by type)
|
|
|
|
*/
|
|
|
|
while(dest_i < dest->totlayer
|
2010-03-22 09:30:00 +00:00
|
|
|
&& dest->layers[dest_i].type < source->layers[src_i].type)
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
++dest_i;
|
2006-11-11 16:38:37 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
/* if there are no more dest layers, we're done */
|
|
|
|
if(dest_i >= dest->totlayer) return;
|
2006-11-11 16:38:37 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
/* if we found a matching layer, copy the data */
|
|
|
|
if(dest->layers[dest_i].type == source->layers[src_i].type) {
|
|
|
|
int offset = source->layers[src_i].offset;
|
|
|
|
char *src_data = (char*)src_block + offset;
|
|
|
|
char *dest_data = dest->layers[dest_i].data;
|
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
typeInfo = layerType_getInfo(dest->layers[dest_i].type);
|
|
|
|
dest_offset = dest_index * typeInfo->size;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
if(typeInfo->copy)
|
|
|
|
typeInfo->copy(src_data, dest_data + dest_offset, 1);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
else
|
2006-12-12 21:29:09 +00:00
|
|
|
memcpy(dest_data + dest_offset, src_data, typeInfo->size);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
|
|
|
/* if there are multiple source & dest layers of the same type,
|
|
|
|
* we don't want to copy all source layers to the same dest, so
|
|
|
|
* increment dest_i
|
|
|
|
*/
|
|
|
|
++dest_i;
|
|
|
|
}
|
2006-11-11 16:38:37 +00:00
|
|
|
}
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
2006-11-11 16:38:37 +00:00
|
|
|
}
|
|
|
|
|
2010-12-03 17:05:21 +00:00
|
|
|
void CustomData_file_write_info(int type, const char **structname, int *structnum)
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
{
|
2006-12-12 21:29:09 +00:00
|
|
|
const LayerTypeInfo *typeInfo = layerType_getInfo(type);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
*structname = typeInfo->structname;
|
|
|
|
*structnum = typeInfo->structnum;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int CustomData_sizeof(int type)
|
|
|
|
{
|
2006-12-12 21:29:09 +00:00
|
|
|
const LayerTypeInfo *typeInfo = layerType_getInfo(type);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
|
2006-12-12 21:29:09 +00:00
|
|
|
return typeInfo->size;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
}
|
2006-12-05 17:42:03 +00:00
|
|
|
|
|
|
|
const char *CustomData_layertype_name(int type)
|
|
|
|
{
|
|
|
|
return layerType_getName(type);
|
|
|
|
}
|
2006-12-21 13:47:27 +00:00
|
|
|
|
2007-06-04 19:18:19 +00:00
|
|
|
static int CustomData_is_property_layer(int type)
|
|
|
|
{
|
|
|
|
if((type == CD_PROP_FLT) || (type == CD_PROP_INT) || (type == CD_PROP_STR))
|
|
|
|
return 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-11-01 07:19:41 +00:00
|
|
|
static int cd_layer_find_dupe(CustomData *data, const char *name, int type, int index)
|
2006-12-21 13:47:27 +00:00
|
|
|
{
|
2010-11-01 07:19:41 +00:00
|
|
|
int i;
|
2006-12-21 13:47:27 +00:00
|
|
|
/* see if there is a duplicate */
|
|
|
|
for(i=0; i<data->totlayer; i++) {
|
2010-11-01 07:19:41 +00:00
|
|
|
if(i != index) {
|
|
|
|
CustomDataLayer *layer= &data->layers[i];
|
2006-12-21 13:47:27 +00:00
|
|
|
|
2010-11-01 07:19:41 +00:00
|
|
|
if(CustomData_is_property_layer(type)) {
|
|
|
|
if(CustomData_is_property_layer(layer->type) && strcmp(layer->name, name)==0) {
|
|
|
|
return 1;
|
|
|
|
}
|
2007-06-04 19:18:19 +00:00
|
|
|
}
|
|
|
|
else{
|
2010-11-01 07:19:41 +00:00
|
|
|
if(i!=index && layer->type==type && strcmp(layer->name, name)==0) {
|
|
|
|
return 1;
|
|
|
|
}
|
2007-06-04 19:18:19 +00:00
|
|
|
}
|
2006-12-21 13:47:27 +00:00
|
|
|
}
|
|
|
|
}
|
2010-11-01 07:19:41 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2006-12-21 13:47:27 +00:00
|
|
|
|
2010-11-07 08:49:07 +00:00
|
|
|
static int customdata_unique_check(void *arg, const char *name)
|
2010-11-01 07:19:41 +00:00
|
|
|
{
|
2010-11-07 08:49:07 +00:00
|
|
|
struct {CustomData *data; int type; int index;} *data_arg= arg;
|
|
|
|
return cd_layer_find_dupe(data_arg->data, name, data_arg->type, data_arg->index);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CustomData_set_layer_unique_name(CustomData *data, int index)
|
|
|
|
{
|
2010-11-01 07:19:41 +00:00
|
|
|
CustomDataLayer *nlayer= &data->layers[index];
|
|
|
|
const LayerTypeInfo *typeInfo= layerType_getInfo(nlayer->type);
|
2006-12-21 13:47:27 +00:00
|
|
|
|
2010-11-07 08:49:07 +00:00
|
|
|
struct {CustomData *data; int type; int index;} data_arg;
|
|
|
|
data_arg.data= data;
|
|
|
|
data_arg.type= nlayer->type;
|
|
|
|
data_arg.index= index;
|
|
|
|
|
2010-11-01 07:19:41 +00:00
|
|
|
if (!typeInfo->defaultname)
|
|
|
|
return;
|
2010-11-07 08:49:07 +00:00
|
|
|
|
|
|
|
BLI_uniquename_cb(customdata_unique_check, &data_arg, typeInfo->defaultname, '.', nlayer->name, sizeof(nlayer->name));
|
2006-12-21 13:47:27 +00:00
|
|
|
}
|
|
|
|
|
2011-10-13 20:00:22 +00:00
|
|
|
void CustomData_validate_layer_name(const CustomData *data, int type, char *name, char *outname)
|
|
|
|
{
|
|
|
|
int index = -1;
|
|
|
|
|
|
|
|
/* if a layer name was given, try to find that layer */
|
|
|
|
if(name[0])
|
|
|
|
index = CustomData_get_named_layer_index(data, type, name);
|
|
|
|
|
|
|
|
if(index < 0) {
|
|
|
|
/* either no layer was specified, or the layer we want has been
|
|
|
|
* deleted, so assign the active layer to name
|
|
|
|
*/
|
|
|
|
index = CustomData_get_active_layer_index(data, type);
|
|
|
|
strcpy(outname, data->layers[index].name);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
strcpy(outname, name);
|
|
|
|
}
|
|
|
|
|
2007-01-06 20:16:06 +00:00
|
|
|
int CustomData_verify_versions(struct CustomData *data, int index)
|
|
|
|
{
|
|
|
|
const LayerTypeInfo *typeInfo;
|
|
|
|
CustomDataLayer *layer = &data->layers[index];
|
|
|
|
int i, keeplayer = 1;
|
|
|
|
|
|
|
|
if (layer->type >= CD_NUMTYPES) {
|
|
|
|
keeplayer = 0; /* unknown layer type from future version */
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
typeInfo = layerType_getInfo(layer->type);
|
|
|
|
|
|
|
|
if (!typeInfo->defaultname && (index > 0) &&
|
|
|
|
data->layers[index-1].type == layer->type)
|
|
|
|
keeplayer = 0; /* multiple layers of which we only support one */
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!keeplayer) {
|
2010-03-22 09:30:00 +00:00
|
|
|
for (i=index+1; i < data->totlayer; ++i)
|
|
|
|
data->layers[i-1] = data->layers[i];
|
2007-01-06 20:16:06 +00:00
|
|
|
data->totlayer--;
|
|
|
|
}
|
|
|
|
|
|
|
|
return keeplayer;
|
|
|
|
}
|
|
|
|
|
2009-11-25 14:27:50 +00:00
|
|
|
/****************************** External Files *******************************/
|
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
static void customdata_external_filename(char filename[FILE_MAX], ID *id, CustomDataExternal *external)
|
2009-11-25 14:27:50 +00:00
|
|
|
{
|
|
|
|
BLI_strncpy(filename, external->filename, FILE_MAX);
|
2011-10-08 11:11:54 +00:00
|
|
|
BLI_path_abs(filename, ID_BLEND_PATH(G.main, id));
|
2009-11-25 14:27:50 +00:00
|
|
|
}
|
|
|
|
|
2010-10-17 06:38:56 +00:00
|
|
|
void CustomData_external_reload(CustomData *data, ID *UNUSED(id), CustomDataMask mask, int totelem)
|
2010-06-01 19:26:35 +00:00
|
|
|
{
|
|
|
|
CustomDataLayer *layer;
|
|
|
|
const LayerTypeInfo *typeInfo;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i=0; i<data->totlayer; i++) {
|
|
|
|
layer = &data->layers[i];
|
|
|
|
typeInfo = layerType_getInfo(layer->type);
|
|
|
|
|
|
|
|
if(!(mask & (1<<layer->type)));
|
|
|
|
else if((layer->flag & CD_FLAG_EXTERNAL) && (layer->flag & CD_FLAG_IN_MEMORY)) {
|
|
|
|
if(typeInfo->free)
|
|
|
|
typeInfo->free(layer->data, totelem, typeInfo->size);
|
|
|
|
layer->flag &= ~CD_FLAG_IN_MEMORY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
void CustomData_external_read(CustomData *data, ID *id, CustomDataMask mask, int totelem)
|
2009-11-25 14:27:50 +00:00
|
|
|
{
|
|
|
|
CustomDataExternal *external= data->external;
|
|
|
|
CustomDataLayer *layer;
|
2009-12-10 14:26:06 +00:00
|
|
|
CDataFile *cdf;
|
|
|
|
CDataFileLayer *blay;
|
2009-11-25 14:27:50 +00:00
|
|
|
char filename[FILE_MAX];
|
|
|
|
const LayerTypeInfo *typeInfo;
|
|
|
|
int i, update = 0;
|
|
|
|
|
|
|
|
if(!external)
|
|
|
|
return;
|
|
|
|
|
|
|
|
for(i=0; i<data->totlayer; i++) {
|
|
|
|
layer = &data->layers[i];
|
|
|
|
typeInfo = layerType_getInfo(layer->type);
|
|
|
|
|
|
|
|
if(!(mask & (1<<layer->type)));
|
|
|
|
else if(layer->flag & CD_FLAG_IN_MEMORY);
|
|
|
|
else if((layer->flag & CD_FLAG_EXTERNAL) && typeInfo->read)
|
|
|
|
update= 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!update)
|
|
|
|
return;
|
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
customdata_external_filename(filename, id, external);
|
2009-11-25 14:27:50 +00:00
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
cdf= cdf_create(CDF_TYPE_MESH);
|
2010-01-19 15:15:48 +00:00
|
|
|
if(!cdf_read_open(cdf, filename)) {
|
|
|
|
fprintf(stderr, "Failed to read %s layer from %s.\n", layerType_getName(layer->type), filename);
|
2009-11-25 14:27:50 +00:00
|
|
|
return;
|
2010-01-19 15:15:48 +00:00
|
|
|
}
|
2009-11-25 14:27:50 +00:00
|
|
|
|
|
|
|
for(i=0; i<data->totlayer; i++) {
|
|
|
|
layer = &data->layers[i];
|
|
|
|
typeInfo = layerType_getInfo(layer->type);
|
|
|
|
|
|
|
|
if(!(mask & (1<<layer->type)));
|
|
|
|
else if(layer->flag & CD_FLAG_IN_MEMORY);
|
|
|
|
else if((layer->flag & CD_FLAG_EXTERNAL) && typeInfo->read) {
|
2009-12-10 14:26:06 +00:00
|
|
|
blay= cdf_layer_find(cdf, layer->type, layer->name);
|
2009-11-25 14:27:50 +00:00
|
|
|
|
|
|
|
if(blay) {
|
2009-12-10 14:26:06 +00:00
|
|
|
if(cdf_read_layer(cdf, blay)) {
|
|
|
|
if(typeInfo->read(cdf, layer->data, totelem));
|
2009-11-25 14:27:50 +00:00
|
|
|
else break;
|
|
|
|
layer->flag |= CD_FLAG_IN_MEMORY;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
cdf_read_close(cdf);
|
|
|
|
cdf_free(cdf);
|
2009-11-25 14:27:50 +00:00
|
|
|
}
|
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
void CustomData_external_write(CustomData *data, ID *id, CustomDataMask mask, int totelem, int free)
|
2009-11-25 14:27:50 +00:00
|
|
|
{
|
|
|
|
CustomDataExternal *external= data->external;
|
|
|
|
CustomDataLayer *layer;
|
2009-12-10 14:26:06 +00:00
|
|
|
CDataFile *cdf;
|
|
|
|
CDataFileLayer *blay;
|
2009-11-25 14:27:50 +00:00
|
|
|
const LayerTypeInfo *typeInfo;
|
|
|
|
int i, update = 0;
|
|
|
|
char filename[FILE_MAX];
|
|
|
|
|
|
|
|
if(!external)
|
|
|
|
return;
|
|
|
|
|
2010-01-19 15:15:48 +00:00
|
|
|
/* test if there is anything to write */
|
2009-11-25 14:27:50 +00:00
|
|
|
for(i=0; i<data->totlayer; i++) {
|
|
|
|
layer = &data->layers[i];
|
|
|
|
typeInfo = layerType_getInfo(layer->type);
|
|
|
|
|
|
|
|
if(!(mask & (1<<layer->type)));
|
|
|
|
else if((layer->flag & CD_FLAG_EXTERNAL) && typeInfo->write)
|
|
|
|
update= 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!update)
|
|
|
|
return;
|
|
|
|
|
2010-01-19 15:15:48 +00:00
|
|
|
/* make sure data is read before we try to write */
|
2009-12-10 14:26:06 +00:00
|
|
|
CustomData_external_read(data, id, mask, totelem);
|
2010-01-19 15:15:48 +00:00
|
|
|
customdata_external_filename(filename, id, external);
|
2009-11-25 14:27:50 +00:00
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
cdf= cdf_create(CDF_TYPE_MESH);
|
2009-11-25 14:27:50 +00:00
|
|
|
|
|
|
|
for(i=0; i<data->totlayer; i++) {
|
|
|
|
layer = &data->layers[i];
|
|
|
|
typeInfo = layerType_getInfo(layer->type);
|
|
|
|
|
2010-01-19 15:15:48 +00:00
|
|
|
if((layer->flag & CD_FLAG_EXTERNAL) && typeInfo->filesize) {
|
|
|
|
if(layer->flag & CD_FLAG_IN_MEMORY) {
|
|
|
|
cdf_layer_add(cdf, layer->type, layer->name,
|
|
|
|
typeInfo->filesize(cdf, layer->data, totelem));
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
cdf_free(cdf);
|
|
|
|
return; /* read failed for a layer! */
|
|
|
|
}
|
|
|
|
}
|
2009-11-25 14:27:50 +00:00
|
|
|
}
|
|
|
|
|
2010-01-19 15:15:48 +00:00
|
|
|
if(!cdf_write_open(cdf, filename)) {
|
|
|
|
fprintf(stderr, "Failed to open %s for writing.\n", filename);
|
2009-11-25 14:27:50 +00:00
|
|
|
return;
|
2010-01-19 15:15:48 +00:00
|
|
|
}
|
2009-11-25 14:27:50 +00:00
|
|
|
|
|
|
|
for(i=0; i<data->totlayer; i++) {
|
|
|
|
layer = &data->layers[i];
|
|
|
|
typeInfo = layerType_getInfo(layer->type);
|
|
|
|
|
|
|
|
if((layer->flag & CD_FLAG_EXTERNAL) && typeInfo->write) {
|
2009-12-10 14:26:06 +00:00
|
|
|
blay= cdf_layer_find(cdf, layer->type, layer->name);
|
2009-11-25 14:27:50 +00:00
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
if(cdf_write_layer(cdf, blay)) {
|
|
|
|
if(typeInfo->write(cdf, layer->data, totelem));
|
2009-11-25 14:27:50 +00:00
|
|
|
else break;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(i != data->totlayer) {
|
2010-01-19 15:15:48 +00:00
|
|
|
fprintf(stderr, "Failed to write data to %s.\n", filename);
|
2009-12-10 14:26:06 +00:00
|
|
|
cdf_free(cdf);
|
2009-11-25 14:27:50 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
for(i=0; i<data->totlayer; i++) {
|
|
|
|
layer = &data->layers[i];
|
|
|
|
typeInfo = layerType_getInfo(layer->type);
|
|
|
|
|
|
|
|
if((layer->flag & CD_FLAG_EXTERNAL) && typeInfo->write) {
|
|
|
|
if(free) {
|
|
|
|
if(typeInfo->free)
|
|
|
|
typeInfo->free(layer->data, totelem, typeInfo->size);
|
|
|
|
layer->flag &= ~CD_FLAG_IN_MEMORY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
cdf_write_close(cdf);
|
|
|
|
cdf_free(cdf);
|
2009-11-25 14:27:50 +00:00
|
|
|
}
|
|
|
|
|
2010-10-17 06:38:56 +00:00
|
|
|
void CustomData_external_add(CustomData *data, ID *UNUSED(id), int type, int UNUSED(totelem), const char *filename)
|
2009-11-25 14:27:50 +00:00
|
|
|
{
|
|
|
|
CustomDataExternal *external= data->external;
|
|
|
|
CustomDataLayer *layer;
|
|
|
|
int layer_index;
|
|
|
|
|
|
|
|
layer_index = CustomData_get_active_layer_index(data, type);
|
|
|
|
if(layer_index < 0) return;
|
|
|
|
|
|
|
|
layer = &data->layers[layer_index];
|
|
|
|
|
|
|
|
if(layer->flag & CD_FLAG_EXTERNAL)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if(!external) {
|
|
|
|
external= MEM_callocN(sizeof(CustomDataExternal), "CustomDataExternal");
|
|
|
|
data->external= external;
|
|
|
|
}
|
2010-05-07 09:41:26 +00:00
|
|
|
BLI_strncpy(external->filename, filename, sizeof(external->filename));
|
2009-11-25 14:27:50 +00:00
|
|
|
|
|
|
|
layer->flag |= CD_FLAG_EXTERNAL|CD_FLAG_IN_MEMORY;
|
|
|
|
}
|
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
void CustomData_external_remove(CustomData *data, ID *id, int type, int totelem)
|
2009-11-25 14:27:50 +00:00
|
|
|
{
|
|
|
|
CustomDataExternal *external= data->external;
|
|
|
|
CustomDataLayer *layer;
|
2009-12-10 14:26:06 +00:00
|
|
|
//char filename[FILE_MAX];
|
|
|
|
int layer_index; // i, remove_file;
|
2009-11-25 14:27:50 +00:00
|
|
|
|
|
|
|
layer_index = CustomData_get_active_layer_index(data, type);
|
|
|
|
if(layer_index < 0) return;
|
|
|
|
|
|
|
|
layer = &data->layers[layer_index];
|
|
|
|
|
|
|
|
if(!external)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if(layer->flag & CD_FLAG_EXTERNAL) {
|
|
|
|
if(!(layer->flag & CD_FLAG_IN_MEMORY))
|
2009-12-10 14:26:06 +00:00
|
|
|
CustomData_external_read(data, id, (1<<layer->type), totelem);
|
2009-11-25 14:27:50 +00:00
|
|
|
|
|
|
|
layer->flag &= ~CD_FLAG_EXTERNAL;
|
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
#if 0
|
2009-11-25 14:27:50 +00:00
|
|
|
remove_file= 1;
|
|
|
|
for(i=0; i<data->totlayer; i++)
|
|
|
|
if(data->layers[i].flag & CD_FLAG_EXTERNAL)
|
|
|
|
remove_file= 0;
|
|
|
|
|
|
|
|
if(remove_file) {
|
2009-12-10 14:26:06 +00:00
|
|
|
customdata_external_filename(filename, id, external);
|
|
|
|
cdf_remove(filename);
|
2009-11-25 14:27:50 +00:00
|
|
|
CustomData_external_free(data);
|
|
|
|
}
|
2009-12-10 14:26:06 +00:00
|
|
|
#endif
|
2009-11-25 14:27:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int CustomData_external_test(CustomData *data, int type)
|
|
|
|
{
|
|
|
|
CustomDataLayer *layer;
|
|
|
|
int layer_index;
|
|
|
|
|
|
|
|
layer_index = CustomData_get_active_layer_index(data, type);
|
|
|
|
if(layer_index < 0) return 0;
|
|
|
|
|
|
|
|
layer = &data->layers[layer_index];
|
|
|
|
return (layer->flag & CD_FLAG_EXTERNAL);
|
|
|
|
}
|
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
#if 0
|
|
|
|
void CustomData_external_remove_object(CustomData *data, ID *id)
|
2009-11-25 14:27:50 +00:00
|
|
|
{
|
|
|
|
CustomDataExternal *external= data->external;
|
|
|
|
char filename[FILE_MAX];
|
|
|
|
|
|
|
|
if(!external)
|
|
|
|
return;
|
|
|
|
|
2009-12-10 14:26:06 +00:00
|
|
|
customdata_external_filename(filename, id, external);
|
|
|
|
cdf_remove(filename);
|
2009-11-25 14:27:50 +00:00
|
|
|
CustomData_external_free(data);
|
|
|
|
}
|
2009-12-10 14:26:06 +00:00
|
|
|
#endif
|
2009-11-25 14:27:50 +00:00
|
|
|
|