Merged changes in the trunk up to revision 45820.

Conflicts resolved:
source/creator/creator.c
This commit is contained in:
Tamito Kajiyama 2012-04-21 00:33:36 +00:00
commit cdbfd1db38
272 changed files with 5403 additions and 3771 deletions

@ -153,7 +153,7 @@ if(UNIX AND NOT APPLE)
else()
set(PLATFORM_DEFAULT OFF)
endif()
option(WITH_OPENMP "Enable OpenMP (has to be supported by the compiler)" PLATFORM_DEFAULT)
option(WITH_OPENMP "Enable OpenMP (has to be supported by the compiler)" ${PLATFORM_DEFAULT})
unset(PLATFORM_DEFAULT)
@ -194,7 +194,14 @@ option(WITH_IMAGE_REDCODE "Enable RedCode Image Support" OFF)
option(WITH_IMAGE_FRAMESERVER "Enable image FrameServer Support for rendering" ON)
# Audio/Video format support
option(WITH_CODEC_FFMPEG "Enable FFMPeg Support (http://ffmpeg.org)" OFF)
if(MINGW)
set(PLATFORM_DEFAULT ON)
else()
set(PLATFORM_DEFAULT OFF)
endif()
option(WITH_CODEC_FFMPEG "Enable FFMPeg Support (http://ffmpeg.org)" ${PLATFORM_DEFAULT})
unset(PLATFORM_DEFAULT)
option(WITH_CODEC_SNDFILE "Enable libsndfile Support (http://www.mega-nerd.com/libsndfile)" OFF)
if(APPLE OR (WIN32 AND NOT UNIX))
option(WITH_CODEC_QUICKTIME "Enable Quicktime Support" OFF)
@ -357,6 +364,19 @@ if(WITH_GHOST_SDL OR WITH_HEADLESS)
set(WITH_GHOST_XDND OFF)
endif()
if(MINGW)
if(WITH_CODEC_QUICKTIME)
message(FATAL_ERROR "MINGW requires WITH_CODEC_QUICKTIME to be OFF "
"because it is currently unsupported, remove this "
"line if youre a developer who wants to add support.")
endif()
if((NOT WITH_CODEC_FFMPEG) AND (WITH_CYCLES OR WITH_IMAGE_OPENEXR OR WITH_IMAGE_TIFF))
message(FATAL_ERROR "MINGW has a problem with: WITH_CYCLES/WITH_IMAGE_OPENEXR/WITH_IMAGE_TIFF "
"when WITH_CODEC_FFMPEG is disabled, enable FFMPEG or disable CYCLES/EXR/TIFF.")
endif()
endif()
TEST_SSE_SUPPORT(COMPILER_SSE_FLAG COMPILER_SSE2_FLAG)

@ -251,6 +251,7 @@ if 'blenderlite' in B.targets:
target_env_defs['WITH_BF_REDCODE'] = False
target_env_defs['WITH_BF_DDS'] = False
target_env_defs['WITH_BF_CINEON'] = False
target_env_defs['WITH_BF_FRAMESERVER'] = False
target_env_defs['WITH_BF_HDR'] = False
target_env_defs['WITH_BF_ZLIB'] = False
target_env_defs['WITH_BF_SDL'] = False
@ -261,6 +262,7 @@ if 'blenderlite' in B.targets:
target_env_defs['BF_BUILDINFO'] = False
target_env_defs['WITH_BF_FLUID'] = False
target_env_defs['WITH_BF_OCEANSIM'] = False
target_env_defs['WITH_BF_SMOKE'] = False
target_env_defs['WITH_BF_DECIMATE'] = False
target_env_defs['WITH_BF_BOOLEAN'] = False
target_env_defs['WITH_BF_REMESH'] = False

@ -231,8 +231,13 @@ def project_name_get(path, fallback="Blender", prefix="Blender_"):
return fallback
import subprocess
info = subprocess.Popen(["svn", "info", path],
stdout=subprocess.PIPE).communicate()[0]
try:
info = subprocess.Popen(["svn", "info", path],
stdout=subprocess.PIPE).communicate()[0]
except:
# possibly 'svn' isnt found/installed
return fallback
# string version, we only want the URL
info = info.decode(encoding="utf-8", errors="ignore")

@ -107,6 +107,7 @@ def validate_arguments(args, bc):
'WITH_BF_FFMPEG', 'BF_FFMPEG_LIB','BF_FFMPEG_EXTRA', 'BF_FFMPEG', 'BF_FFMPEG_INC', 'BF_FFMPEG_DLL',
'WITH_BF_STATICFFMPEG', 'BF_FFMPEG_LIB_STATIC',
'WITH_BF_OGG', 'BF_OGG', 'BF_OGG_LIB',
'WITH_BF_FRAMESERVER',
'WITH_BF_JPEG', 'BF_JPEG', 'BF_JPEG_INC', 'BF_JPEG_LIB', 'BF_JPEG_LIBPATH',
'WITH_BF_OPENJPEG', 'BF_OPENJPEG', 'BF_OPENJPEG_INC', 'BF_OPENJPEG_LIB', 'BF_OPENJPEG_LIBPATH',
'WITH_BF_REDCODE', 'BF_REDCODE', 'BF_REDCODE_INC', 'BF_REDCODE_LIB', 'BF_REDCODE_LIBPATH',
@ -154,6 +155,7 @@ def validate_arguments(args, bc):
'WITH_BF_BOOLEAN',
'WITH_BF_REMESH',
'WITH_BF_OCEANSIM',
'WITH_BF_SMOKE',
'WITH_BF_CXX_GUARDEDALLOC',
'WITH_BF_JEMALLOC', 'WITH_BF_STATICJEMALLOC', 'BF_JEMALLOC', 'BF_JEMALLOC_INC', 'BF_JEMALLOC_LIBPATH', 'BF_JEMALLOC_LIB', 'BF_JEMALLOC_LIB_STATIC',
'BUILDBOT_BRANCH',
@ -264,6 +266,7 @@ def read_opts(env, cfg, args):
(BoolVariable('WITH_BF_BOOLEAN', 'Build with boolean modifier', True)),
(BoolVariable('WITH_BF_REMESH', 'Build with remesh modifier', True)),
(BoolVariable('WITH_BF_OCEANSIM', 'Build with ocean simulation', False)),
(BoolVariable('WITH_BF_SMOKE', 'Build with smoke simulation', True)),
('BF_PROFILE_FLAGS', 'Profiling compiler flags', ''),
(BoolVariable('WITH_BF_OPENAL', 'Use OpenAL if true', False)),
('BF_OPENAL', 'Base path for OpenAL', ''),
@ -311,6 +314,8 @@ def read_opts(env, cfg, args):
(BoolVariable('WITH_BF_CINEON', 'Support CINEON and DPX image formats if true', True)),
(BoolVariable('WITH_BF_HDR', 'Support HDR image formats if true', True)),
(BoolVariable('WITH_BF_FRAMESERVER', 'Support export to a frameserver', True)),
(BoolVariable('WITH_BF_FFMPEG', 'Use FFMPEG if true', False)),
('BF_FFMPEG', 'FFMPEG base path', ''),

@ -131,7 +131,7 @@ def handle_args():
dest="sphinx_theme",
type=str,
default='default',
help =
help=
# see SPHINX_THEMES below
"Sphinx theme (default='default')\n"
"Available themes\n"

@ -724,7 +724,7 @@ static void xml_read_patch(const XMLReadState& state, pugi::xml_node node)
LinearQuadPatch *bpatch = new LinearQuadPatch();
for(int i = 0; i < 4; i++)
P[i] = transform(&state.tfm, P[i]);
P[i] = transform_point(&state.tfm, P[i]);
memcpy(bpatch->hull, &P[0], sizeof(bpatch->hull));
patch = bpatch;
@ -738,7 +738,7 @@ static void xml_read_patch(const XMLReadState& state, pugi::xml_node node)
BicubicPatch *bpatch = new BicubicPatch();
for(int i = 0; i < 16; i++)
P[i] = transform(&state.tfm, P[i]);
P[i] = transform_point(&state.tfm, P[i]);
memcpy(bpatch->hull, &P[0], sizeof(bpatch->hull));
patch = bpatch;
@ -777,7 +777,7 @@ static void xml_read_light(const XMLReadState& state, pugi::xml_node node)
Light *light = new Light();
light->shader = state.shader;
xml_read_float3(&light->co, node, "P");
light->co = transform(&state.tfm, light->co);
light->co = transform_point(&state.tfm, light->co);
state.scene->lights.push_back(light);
}

@ -59,7 +59,7 @@ __device_inline void bvh_instance_push(KernelGlobals *kg, int object, const Ray
{
Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
*P = transform(&tfm, ray->P);
*P = transform_point(&tfm, ray->P);
float3 dir = transform_direction(&tfm, ray->D);
@ -351,7 +351,7 @@ __device_inline float3 bvh_triangle_refine(KernelGlobals *kg, const Intersection
if(isect->object != ~0) {
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_INVERSE_TRANSFORM);
P = transform(&tfm, P);
P = transform_point(&tfm, P);
D = transform_direction(&tfm, D*t);
D = normalize_len(D, &t);
}
@ -367,7 +367,7 @@ __device_inline float3 bvh_triangle_refine(KernelGlobals *kg, const Intersection
if(isect->object != ~0) {
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_TRANSFORM);
P = transform(&tfm, P);
P = transform_point(&tfm, P);
}
return P;

@ -39,7 +39,7 @@ __device void camera_sample_perspective(KernelGlobals *kg, float raster_x, float
{
/* create ray form raster position */
Transform rastertocamera = kernel_data.cam.rastertocamera;
float3 Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
float3 Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
ray->P = make_float3(0.0f, 0.0f, 0.0f);
ray->D = Pcamera;
@ -63,7 +63,7 @@ __device void camera_sample_perspective(KernelGlobals *kg, float raster_x, float
/* transform ray from camera to world */
Transform cameratoworld = kernel_data.cam.cameratoworld;
ray->P = transform(&cameratoworld, ray->P);
ray->P = transform_point(&cameratoworld, ray->P);
ray->D = transform_direction(&cameratoworld, ray->D);
ray->D = normalize(ray->D);
@ -93,7 +93,7 @@ __device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, floa
{
/* create ray form raster position */
Transform rastertocamera = kernel_data.cam.rastertocamera;
float3 Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
float3 Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
ray->P = Pcamera;
ray->D = make_float3(0.0f, 0.0f, 1.0f);
@ -101,7 +101,7 @@ __device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, floa
/* transform ray from camera to world */
Transform cameratoworld = kernel_data.cam.cameratoworld;
ray->P = transform(&cameratoworld, ray->P);
ray->P = transform_point(&cameratoworld, ray->P);
ray->D = transform_direction(&cameratoworld, ray->D);
ray->D = normalize(ray->D);
@ -127,7 +127,7 @@ __device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, floa
__device void camera_sample_environment(KernelGlobals *kg, float raster_x, float raster_y, Ray *ray)
{
Transform rastertocamera = kernel_data.cam.rastertocamera;
float3 Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
float3 Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
/* create ray form raster position */
ray->P = make_float3(0.0, 0.0f, 0.0f);
@ -136,7 +136,7 @@ __device void camera_sample_environment(KernelGlobals *kg, float raster_x, float
/* transform ray from camera to world */
Transform cameratoworld = kernel_data.cam.cameratoworld;
ray->P = transform(&cameratoworld, ray->P);
ray->P = transform_point(&cameratoworld, ray->P);
ray->D = transform_direction(&cameratoworld, ray->D);
ray->D = normalize(ray->D);
@ -145,10 +145,10 @@ __device void camera_sample_environment(KernelGlobals *kg, float raster_x, float
ray->dP.dx = make_float3(0.0f, 0.0f, 0.0f);
ray->dP.dy = make_float3(0.0f, 0.0f, 0.0f);
Pcamera = transform(&rastertocamera, make_float3(raster_x + 1.0f, raster_y, 0.0f));
Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x + 1.0f, raster_y, 0.0f));
ray->dD.dx = normalize(transform_direction(&cameratoworld, equirectangular_to_direction(Pcamera.x, Pcamera.y))) - ray->D;
Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y + 1.0f, 0.0f));
Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y + 1.0f, 0.0f));
ray->dD.dy = normalize(transform_direction(&cameratoworld, equirectangular_to_direction(Pcamera.x, Pcamera.y))) - ray->D;
#endif

@ -61,7 +61,7 @@ __device void mbvh_instance_push(KernelGlobals *kg, int object, MBVHRay *ray)
{
Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
ray->P = transform(&tfm, ray->origP);
ray->P = transform_point(&tfm, ray->origP);
float3 dir = ray->origD;

@ -42,7 +42,7 @@ __device_inline Transform object_fetch_transform(KernelGlobals *kg, int object,
__device_inline void object_position_transform(KernelGlobals *kg, int object, float3 *P)
{
Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
*P = transform(&tfm, *P);
*P = transform_point(&tfm, *P);
}
__device_inline void object_normal_transform(KernelGlobals *kg, int object, float3 *N)

@ -53,7 +53,7 @@ __device_inline void kernel_write_data_passes(KernelGlobals *kg, __global float
if(sample == 0) {
if(flag & PASS_DEPTH) {
Transform tfm = kernel_data.cam.worldtocamera;
float depth = len(transform(&tfm, sd->P));
float depth = len(transform_point(&tfm, sd->P));
kernel_write_pass_float(buffer + kernel_data.film.pass_depth, sample, depth);
}

@ -147,14 +147,14 @@ __device_inline float path_state_terminate_probability(KernelGlobals *kg, PathSt
__device_inline bool shadow_blocked(KernelGlobals *kg, PathState *state, Ray *ray, float3 *shadow)
{
*shadow = make_float3(1.0f, 1.0f, 1.0f);
if(ray->t == 0.0f)
return false;
Intersection isect;
bool result = scene_intersect(kg, ray, PATH_RAY_SHADOW_OPAQUE, &isect);
*shadow = make_float3(1.0f, 1.0f, 1.0f);
#ifdef __TRANSPARENT_SHADOWS__
if(result && kernel_data.integrator.transparent_shadows) {
/* transparent shadows work in such a way to try to minimize overhead

@ -50,7 +50,7 @@ __device_inline void qbvh_instance_push(KernelGlobals *kg, int object, const Ray
{
Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
*P = transform(&tfm, ray->P);
*P = transform_point(&tfm, ray->P);
float3 dir = transform_direction(&tfm, ray->D);
@ -384,7 +384,7 @@ __device_inline float3 bvh_triangle_refine(KernelGlobals *kg, const Intersection
if(isect->object != ~0) {
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_INVERSE_TRANSFORM);
P = transform(&tfm, P);
P = transform_point(&tfm, P);
D = transform_direction(&tfm, D*t);
D = normalize_len(D, &t);
}
@ -400,7 +400,7 @@ __device_inline float3 bvh_triangle_refine(KernelGlobals *kg, const Intersection
if(isect->object != ~0) {
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_TRANSFORM);
P = transform(&tfm, P);
P = transform_point(&tfm, P);
}
return P;

@ -25,7 +25,7 @@ __device void svm_node_camera(KernelGlobals *kg, ShaderData *sd, float *stack, u
float3 vector;
Transform tfm = kernel_data.cam.worldtocamera;
vector = transform(&tfm, sd->P);
vector = transform_point(&tfm, sd->P);
zdepth = vector.z;
distance = len(vector);

@ -30,7 +30,7 @@ __device void svm_node_mapping(KernelGlobals *kg, ShaderData *sd, float *stack,
tfm.z = read_node_float(kg, offset);
tfm.w = read_node_float(kg, offset);
float3 r = transform(&tfm, v);
float3 r = transform_point(&tfm, v);
stack_store_float3(stack, out_offset, r);
}

@ -34,7 +34,7 @@ __device void svm_node_tex_coord(KernelGlobals *kg, ShaderData *sd, float *stack
case NODE_TEXCO_OBJECT: {
if(sd->object != ~0) {
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
data = transform(&tfm, sd->P);
data = transform_point(&tfm, sd->P);
}
else
data = sd->P;
@ -44,18 +44,18 @@ __device void svm_node_tex_coord(KernelGlobals *kg, ShaderData *sd, float *stack
Transform tfm = kernel_data.cam.worldtocamera;
if(sd->object != ~0)
data = transform(&tfm, sd->P);
data = transform_point(&tfm, sd->P);
else
data = transform(&tfm, sd->P + svm_background_offset(kg));
data = transform_point(&tfm, sd->P + svm_background_offset(kg));
break;
}
case NODE_TEXCO_WINDOW: {
Transform tfm = kernel_data.cam.worldtondc;
if(sd->object != ~0)
data = transform(&tfm, sd->P);
data = transform_perspective(&tfm, sd->P);
else
data = transform(&tfm, sd->P + svm_background_offset(kg));
data = transform_perspective(&tfm, sd->P + svm_background_offset(kg));
break;
}
case NODE_TEXCO_REFLECTION: {
@ -79,7 +79,7 @@ __device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, floa
case NODE_TEXCO_OBJECT: {
if(sd->object != ~0) {
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
data = transform(&tfm, sd->P + sd->dP.dx);
data = transform_point(&tfm, sd->P + sd->dP.dx);
}
else
data = sd->P + sd->dP.dx;
@ -89,18 +89,18 @@ __device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, floa
Transform tfm = kernel_data.cam.worldtocamera;
if(sd->object != ~0)
data = transform(&tfm, sd->P + sd->dP.dx);
data = transform_point(&tfm, sd->P + sd->dP.dx);
else
data = transform(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg));
data = transform_point(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg));
break;
}
case NODE_TEXCO_WINDOW: {
Transform tfm = kernel_data.cam.worldtondc;
if(sd->object != ~0)
data = transform(&tfm, sd->P + sd->dP.dx);
data = transform_perspective(&tfm, sd->P + sd->dP.dx);
else
data = transform(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg));
data = transform_perspective(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg));
break;
}
case NODE_TEXCO_REFLECTION: {
@ -127,7 +127,7 @@ __device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, floa
case NODE_TEXCO_OBJECT: {
if(sd->object != ~0) {
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
data = transform(&tfm, sd->P + sd->dP.dy);
data = transform_point(&tfm, sd->P + sd->dP.dy);
}
else
data = sd->P + sd->dP.dy;
@ -137,18 +137,18 @@ __device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, floa
Transform tfm = kernel_data.cam.worldtocamera;
if(sd->object != ~0)
data = transform(&tfm, sd->P + sd->dP.dy);
data = transform_point(&tfm, sd->P + sd->dP.dy);
else
data = transform(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg));
data = transform_point(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg));
break;
}
case NODE_TEXCO_WINDOW: {
Transform tfm = kernel_data.cam.worldtondc;
if(sd->object != ~0)
data = transform(&tfm, sd->P + sd->dP.dy);
data = transform_perspective(&tfm, sd->P + sd->dP.dy);
else
data = transform(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg));
data = transform_perspective(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg));
break;
}
case NODE_TEXCO_REFLECTION: {

@ -119,7 +119,7 @@ void RenderBuffers::reset(Device *device, BufferParams& params_)
for(x=0; x<width; x++)
for(y=0; y<height; y++)
init_state[x + y*width] = hash_int_2d(x, y);
init_state[x + y*width] = hash_int_2d(params.full_x+x, params.full_y+y);
device->mem_alloc(rng_state, MEM_READ_WRITE);
device->mem_copy_to(rng_state);

@ -107,10 +107,10 @@ void Camera::update()
dy = transform_direction(&rastertocamera, make_float3(0, 1, 0));
}
else if(type == CAMERA_PERSPECTIVE) {
dx = transform(&rastertocamera, make_float3(1, 0, 0)) -
transform(&rastertocamera, make_float3(0, 0, 0));
dy = transform(&rastertocamera, make_float3(0, 1, 0)) -
transform(&rastertocamera, make_float3(0, 0, 0));
dx = transform_perspective(&rastertocamera, make_float3(1, 0, 0)) -
transform_perspective(&rastertocamera, make_float3(0, 0, 0));
dy = transform_perspective(&rastertocamera, make_float3(0, 1, 0)) -
transform_perspective(&rastertocamera, make_float3(0, 0, 0));
}
else {
dx = make_float3(0, 0, 0);

@ -125,7 +125,6 @@ void Pass::add(PassType type, vector<Pass>& passes)
break;
case PASS_AO:
pass.components = 4;
pass.exposure = true;
break;
case PASS_SHADOW:
pass.components = 4;

@ -213,9 +213,9 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen
offset++;
Mesh::Triangle t = mesh->triangles[i];
float3 p1 = transform(&tfm, mesh->verts[t.v[0]]);
float3 p2 = transform(&tfm, mesh->verts[t.v[1]]);
float3 p3 = transform(&tfm, mesh->verts[t.v[2]]);
float3 p1 = transform_point(&tfm, mesh->verts[t.v[0]]);
float3 p2 = transform_point(&tfm, mesh->verts[t.v[1]]);
float3 p3 = transform_point(&tfm, mesh->verts[t.v[2]]);
totarea += triangle_area(p1, p2, p3);
}

@ -54,7 +54,7 @@ void Object::apply_transform()
return;
for(size_t i = 0; i < mesh->verts.size(); i++)
mesh->verts[i] = transform(&tfm, mesh->verts[i]);
mesh->verts[i] = transform_point(&tfm, mesh->verts[i]);
Attribute *attr_fN = mesh->attributes.find(Attribute::STD_FACE_NORMAL);
Attribute *attr_vN = mesh->attributes.find(Attribute::STD_VERTEX_NORMAL);
@ -159,9 +159,9 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene
}
else {
foreach(Mesh::Triangle& t, mesh->triangles) {
float3 p1 = transform(&tfm, mesh->verts[t.v[0]]);
float3 p2 = transform(&tfm, mesh->verts[t.v[1]]);
float3 p3 = transform(&tfm, mesh->verts[t.v[2]]);
float3 p1 = transform_point(&tfm, mesh->verts[t.v[0]]);
float3 p2 = transform_point(&tfm, mesh->verts[t.v[1]]);
float3 p3 = transform_point(&tfm, mesh->verts[t.v[2]]);
surface_area += triangle_area(p1, p2, p3);
}

@ -141,7 +141,7 @@ float3 QuadDice::eval_projected(SubPatch& sub, float u, float v)
sub.patch->eval(&P, NULL, NULL, uv.x, uv.y);
if(camera)
P = transform(&camera->worldtoraster, P);
P = transform_perspective(&camera->worldtoraster, P);
return P;
}

@ -57,7 +57,7 @@ float3 DiagSplit::project(Patch *patch, float2 uv)
patch->eval(&P, NULL, NULL, uv.x, uv.y);
if(camera)
P = transform(&camera->worldtoraster, P);
P = transform_perspective(&camera->worldtoraster, P);
return P;
}

@ -76,8 +76,8 @@ public:
bool valid(void) const
{
return (min.x <= max.x) && (min.y <= max.y) && (min.z <= max.z) &&
!(isnan(min.x) || isnan(min.y) || isnan(min.z)) &&
!(isnan(max.x) || isnan(max.y) || isnan(max.z));
(isfinite(min.x) && isfinite(min.y) && isfinite(min.z)) &&
(isfinite(max.x) && isfinite(max.y) && isfinite(max.z));
}
BoundBox transformed(const Transform *tfm)
@ -91,7 +91,7 @@ public:
p.y = (i & 2)? min.y: max.y;
p.z = (i & 4)? min.z: max.z;
result.grow(transform(tfm, p));
result.grow(transform_point(tfm, p));
}
return result;

@ -37,7 +37,7 @@ typedef struct Transform {
#endif
} Transform;
__device_inline float3 transform(const Transform *t, const float3 a)
__device_inline float3 transform_perspective(const Transform *t, const float3 a)
{
float4 b = make_float4(a.x, a.y, a.z, 1.0f);
float3 c = make_float3(dot(t->x, b), dot(t->y, b), dot(t->z, b));
@ -46,6 +46,14 @@ __device_inline float3 transform(const Transform *t, const float3 a)
return (w != 0.0f)? c/w: make_float3(0.0f, 0.0f, 0.0f);
}
__device_inline float3 transform_point(const Transform *t, const float3 a)
{
float4 b = make_float4(a.x, a.y, a.z, 1.0f);
float3 c = make_float3(dot(t->x, b), dot(t->y, b), dot(t->z, b));
return c;
}
__device_inline float3 transform_direction(const Transform *t, const float3 a)
{
float4 b = make_float4(a.x, a.y, a.z, 0.0f);

@ -30,6 +30,7 @@
#define GRID_DIMENSION 20
#if defined(_WIN32) && !defined(__MINGW32__)
#define isnan(n) _isnan(n)
#define LONG __int64
#else
#include <stdint.h>

@ -26,6 +26,11 @@
#include "octree.h"
#include <cstdio>
#include <float.h>
#if defined(_WIN32) && !defined(__MINGW32__)
#define isnan(n) _isnan(n)
#endif
void veccopy(float dst[3], const float src[3])
{
@ -113,6 +118,15 @@ public:
curface++;
}
/* remove triangle if it contains invalid coords */
for(int i = 0; i < 3; i++) {
const float *co = t->vt[i];
if(isnan(co[0]) || isnan(co[1]) || isnan(co[2])) {
delete t;
return getNextTriangle();
}
}
return t;
}

@ -1453,7 +1453,9 @@ void LbmFsgrSolver::initMovingObstacles(bool staticInit) {
//errMsg("GEOACTT"," obj "<<obj->getName()<<" a:"<<active<<","<<wasActive<<" s"<<sourceTime<<" t"<<targetTime <<" v"<<mObjectSpeeds[OId] );
// skip inactive in/out flows
if(ntype==CFInvalid){ errMsg("LbmFsgrSolver::initMovingObstacles","Invalid obj type "<<obj->getGeoInitType()); continue; }
if((!active) && (otype&(CFMbndOutflow|CFMbndInflow)) ) continue;
/* DG: only inflows/outlfows could be activated/deactivated, test new code that everything can be activated
if((!active) && (otype&(CFMbndOutflow|CFMbndInflow)) ) continue; */
if((!active) /* && (otype&(CFMbndOutflow|CFMbndInflow)) */ ) continue;
// copied from recalculateObjectSpeeds
mObjectSpeeds[OId] = vec2L(mpParam->calculateLattVelocityFromRw( vec2P( (*mpGiObjects)[OId]->getInitialVelocity(mSimulationTime) )));

@ -28,7 +28,7 @@ remove_strict_flags()
# remove debug flag here since this is not a blender maintained library
# and debug gives a lot of prints on UV unwrapping. developers can enable if they need to.
remove_cc_flag("-DDEBUG")
add_definitions(-UDEBUG)
# quiet compiler warnings about undefined defines

@ -2,11 +2,12 @@
Name=Blender
GenericName=3D modeller
GenericName[es]=modelador 3D
GenericName[de]=3D Modellierer
GenericName[de]=3D-Modellierer
GenericName[fr]=modeleur 3D
GenericName[ru]=Редактор 3D-моделей
Comment=3D modeling, animation, rendering and post-production
Comment[es]=modelado 3D, animación, renderizado y post-producción
Comment[de]=3D-Modellierung, Animation, Rendering und Nachbearbeitung
Exec=blender
Icon=blender
Terminal=false

@ -0,0 +1,3 @@
import bpy
bpy.context.fluid.settings.viscosity_base = 2.0
bpy.context.fluid.settings.viscosity_exponent = 3

@ -0,0 +1,3 @@
import bpy
bpy.context.fluid.settings.viscosity_base = 5.0
bpy.context.fluid.settings.viscosity_exponent = 5

@ -0,0 +1,3 @@
import bpy
bpy.context.fluid.settings.viscosity_base = 1.0
bpy.context.fluid.settings.viscosity_exponent = 6

@ -23,15 +23,19 @@ from bpy.types import Operator
from bpy.props import StringProperty
def _lang_module_get(sc):
return __import__("console_" + sc.language)
class ConsoleExec(Operator):
'''Execute the current console line as a python expression'''
"""Execute the current console line as a python expression"""
bl_idname = "console.execute"
bl_label = "Console Execute"
def execute(self, context):
sc = context.space_data
module = __import__("console_" + sc.language)
module = _lang_module_get(sc)
execute = getattr(module, "execute", None)
if execute:
@ -50,7 +54,7 @@ class ConsoleAutocomplete(Operator):
def execute(self, context):
sc = context.space_data
module = __import__("console_" + sc.language)
module = _lang_module_get(sc)
autocomplete = getattr(module, "autocomplete", None)
if autocomplete:
@ -62,7 +66,7 @@ class ConsoleAutocomplete(Operator):
class ConsoleBanner(Operator):
'''Print a message when the terminal initializes'''
"""Print a message when the terminal initializes"""
bl_idname = "console.banner"
bl_label = "Console Banner"
@ -73,7 +77,7 @@ class ConsoleBanner(Operator):
if not sc.language:
sc.language = 'python'
module = __import__("console_" + sc.language)
module = _lang_module_get(sc)
banner = getattr(module, "banner", None)
if banner:
@ -85,7 +89,7 @@ class ConsoleBanner(Operator):
class ConsoleLanguage(Operator):
'''Set the current language for this console'''
"""Set the current language for this console"""
bl_idname = "console.language"
bl_label = "Console Language"

@ -100,7 +100,7 @@ class MeshMirrorUV(Operator):
vidxs[i] = tuple(sorted(l.vertex_index
for l in loops[lstart:lend]))
# As we have no poly.center yet...
pcents[i] = tuple(map(lambda x : x / p.loop_total,
pcents[i] = tuple(map(lambda x: x / p.loop_total,
map(sum, zip(*(verts[idx].co
for idx in vidxs[i])))))
# Preparing next step finding matching polys.

@ -295,6 +295,24 @@ class AddPresetCloth(AddPresetBase, Operator):
preset_subdir = "cloth"
class AddPresetFluid(AddPresetBase, Operator):
'''Add a Fluid Preset'''
bl_idname = "fluid.preset_add"
bl_label = "Add Fluid Preset"
preset_menu = "FLUID_MT_presets"
preset_defines = [
"fluid = bpy.context.fluid"
]
preset_values = [
"fluid.settings.viscosity_base",
"fluid.settings.viscosity_exponent",
]
preset_subdir = "fluid"
class AddPresetSunSky(AddPresetBase, Operator):
'''Add a Sky & Atmosphere Preset'''
bl_idname = "lamp.sunsky_preset_add"

@ -89,7 +89,7 @@ class prettyface(object):
else: # blender face
uv_layer = data.id_data.uv_loop_layers.active.data
self.uv = [uv_layer[i].uv for i in data.loops]
self.uv = [uv_layer[i].uv for i in data.loop_indices]
# cos = [v.co for v in data]
cos = [data.id_data.vertices[v].co for v in data.vertices] # XXX25
@ -245,7 +245,7 @@ def lightmap_uvpack(meshes,
print("\tWarning, less then 4 faces, skipping")
continue
pretty_faces = [prettyface(f) for f in face_sel if len(f.vertices) == 4]
pretty_faces = [prettyface(f) for f in face_sel if f.loop_total == 4]
# Do we have any triangles?
if len(pretty_faces) != len(face_sel):
@ -269,7 +269,7 @@ def lightmap_uvpack(meshes,
return f, lens, lens_order
tri_lengths = [trylens(f) for f in face_sel if len(f.vertices) == 3]
tri_lengths = [trylens(f) for f in face_sel if f.loop_total == 3]
del trylens
def trilensdiff(t1, t2):
@ -549,7 +549,16 @@ class LightMapPack(Operator):
'''Follow UVs from active quads along continuous face loops'''
bl_idname = "uv.lightmap_pack"
bl_label = "Lightmap Pack"
bl_options = {'REGISTER', 'UNDO'}
# Disable REGISTER flag for now because this operator might create new
# images. This leads to non-proper operator redo because current undo
# stack is local for edit mode and can not remove images created by this
# oprtator.
# Proper solution would be to make undo stack aware of such things,
# but for now just disable redo. Keep undo here so unwanted changes to uv
# coords might be undone.
# This fixes infinite image creation reported there [#30968] (sergey)
bl_options = {'UNDO'}
PREF_CONTEXT = bpy.props.EnumProperty(
name="Selection",

@ -1195,7 +1195,7 @@ class WM_OT_copy_prev_settings(Operator):
class WM_OT_blenderplayer_start(Operator):
'''Launch the blender-player with the current blend-file'''
bl_idname = "wm.blenderplayer_start"
bl_label = "Start"
bl_label = "Start Game In Player"
def execute(self, context):
import os
@ -1212,6 +1212,10 @@ class WM_OT_blenderplayer_start(Operator):
if sys.platform == "darwin":
player_path = os.path.join(blender_bin_dir, "../../../blenderplayer.app/Contents/MacOS/blenderplayer")
if not os.path.exists(player_path):
self.report({'ERROR'}, "Player path: %r not found" % player_path)
return {'CANCELLED'}
filepath = os.path.join(bpy.app.tempdir, "game.blend")
bpy.ops.wm.save_as_mainfile(filepath=filepath, check_existing=False, copy=True)
subprocess.call([player_path, filepath])

@ -166,7 +166,12 @@ class PHYSICS_PT_game_physics(PhysicsButtonsPanel, Panel):
subsub.active = game.use_anisotropic_friction
subsub.prop(game, "friction_coefficients", text="", slider=True)
elif physics_type in {'SENSOR', 'INVISIBLE', 'NO_COLLISION', 'OCCLUDE'}:
elif physics_type == 'SENSOR':
col = layout.column()
col.prop(game, "use_actor", text="Detect Actors")
col.prop(ob, "hide_render", text="Invisible")
elif physics_type in {'INVISIBLE', 'NO_COLLISION', 'OCCLUDE'}:
layout.prop(ob, "hide_render", text="Invisible")
elif physics_type == 'NAVMESH':

@ -1185,7 +1185,7 @@ class PARTICLE_PT_vertexgroups(ParticleButtonsPanel, Panel):
psys = context.particle_system
split = layout.split(percentage=0.85)
col = split.column()
col.label(text="Vertex Group:")
col.prop_search(psys, "vertex_group_density", ob, "vertex_groups", text="Density")
@ -1195,7 +1195,7 @@ class PARTICLE_PT_vertexgroups(ParticleButtonsPanel, Panel):
col.prop_search(psys, "vertex_group_roughness_1", ob, "vertex_groups", text="Roughness 1")
col.prop_search(psys, "vertex_group_roughness_2", ob, "vertex_groups", text="Roughness 2")
col.prop_search(psys, "vertex_group_roughness_end", ob, "vertex_groups", text="Roughness End")
col = split.column()
col.label(text="Negate:")
col.alignment = 'RIGHT'
@ -1206,7 +1206,7 @@ class PARTICLE_PT_vertexgroups(ParticleButtonsPanel, Panel):
col.prop(psys, "invert_vertex_group_roughness_1", text="")
col.prop(psys, "invert_vertex_group_roughness_2", text="")
col.prop(psys, "invert_vertex_group_roughness_end", text="")
# Commented out vertex groups don't work and are still waiting for better implementation
# row = layout.row()
# row.prop_search(psys, "vertex_group_velocity", ob, "vertex_groups", text="Velocity")

@ -31,9 +31,6 @@ def cloth_panel_enabled(md):
class CLOTH_MT_presets(Menu):
'''
Creates the menu items by scanning scripts/templates
'''
bl_label = "Cloth Presets"
preset_subdir = "cloth"
preset_operator = "script.execute_preset"

@ -18,7 +18,14 @@
# <pep8 compliant>
import bpy
from bpy.types import Panel
from bpy.types import Panel, Menu
class FLUID_MT_presets(Menu):
bl_label = "Fluid Presets"
preset_subdir = "fluid"
preset_operator = "script.execute_preset"
draw = Menu.draw_preset
class PhysicButtonsPanel():
@ -222,16 +229,14 @@ class PHYSICS_PT_domain_gravity(PhysicButtonsPanel, Panel):
col = split.column()
col.label(text="Viscosity Presets:")
sub = col.column(align=True)
sub.prop(fluid, "viscosity_preset", text="")
sub = col.row(align=True)
sub.menu("FLUID_MT_presets", text=bpy.types.FLUID_MT_presets.bl_label)
sub.operator("fluid.preset_add", text="", icon='ZOOMIN')
sub.operator("fluid.preset_add", text="", icon='ZOOMOUT').remove_active = True
if fluid.viscosity_preset == 'MANUAL':
sub.prop(fluid, "viscosity_base", text="Base")
sub.prop(fluid, "viscosity_exponent", text="Exponent", slider=True)
else:
# just for padding to prevent jumping around
sub.separator()
sub.separator()
subsub = col.column(align=True)
subsub.prop(fluid, "viscosity_base", text="Base")
subsub.prop(fluid, "viscosity_exponent", text="Exponent", slider=True)
col.label(text="Optimization:")
col.prop(fluid, "grid_levels", slider=True)

@ -1680,7 +1680,7 @@ class VIEW3D_MT_edit_mesh_vertices(Menu):
layout.operator("mesh.merge")
layout.operator("mesh.rip_move")
layout.operator("mesh.split")
layout.operator("mesh.separate")
layout.operator_menu_enum("mesh.separate", "type")
layout.operator("mesh.vert_connect")
layout.operator("mesh.vert_slide")

@ -142,6 +142,14 @@ class VIEW3D_PT_tools_meshedit(View3DPanel, Panel):
col.operator("mesh.spin")
col.operator("mesh.screw")
row = col.row(align=True)
props = row.operator("mesh.knife_tool", text="Knife")
props.use_occlude_geometry = True
props.only_select = False
props = row.operator("mesh.knife_tool", text="Select")
props.use_occlude_geometry = False
props.only_select = True
col = layout.column(align=True)
col.label(text="Remove:")
col.menu("VIEW3D_MT_edit_mesh_delete")

@ -3,7 +3,7 @@ import bpy
def write_some_data(context, filepath, use_some_setting):
print("running write_some_data...")
f = open(filepath, 'w')
f = open(filepath, 'w', encoding='utf-8')
f.write("Hello World %s" % use_some_setting)
f.close()
@ -14,11 +14,12 @@ def write_some_data(context, filepath, use_some_setting):
# invoke() function which calls the file selector.
from bpy_extras.io_utils import ExportHelper
from bpy.props import StringProperty, BoolProperty, EnumProperty
from bpy.types import Operator
class ExportSomeData(bpy.types.Operator, ExportHelper):
'''This appears in the tooltip of the operator and in the generated docs.'''
bl_idname = "export.some_data" # this is important since its how bpy.ops.export.some_data is constructed
class ExportSomeData(Operator, ExportHelper):
'''This appears in the tooltip of the operator and in the generated docs'''
bl_idname = "export_test.some_data" # important since its how bpy.ops.import_test.some_data is constructed
bl_label = "Export Some Data"
# ExportHelper mixin class uses this
@ -45,10 +46,6 @@ class ExportSomeData(bpy.types.Operator, ExportHelper):
default='OPT_A',
)
@classmethod
def poll(cls, context):
return context.active_object is not None
def execute(self, context):
return write_some_data(context, self.filepath, self.use_setting)
@ -72,4 +69,4 @@ if __name__ == "__main__":
register()
# test call
bpy.ops.export.some_data('INVOKE_DEFAULT')
bpy.ops.export_test.some_data('INVOKE_DEFAULT')

@ -0,0 +1,75 @@
import bpy
def read_some_data(context, filepath, use_some_setting):
print("running read_some_data...")
f = open(filepath, 'r', encoding='utf-8')
data = f.read()
f.close()
# would normally load the data here
print(data)
return {'FINISHED'}
# ImportHelper is a helper class, defines filename and
# invoke() function which calls the file selector.
from bpy_extras.io_utils import ImportHelper
from bpy.props import StringProperty, BoolProperty, EnumProperty
from bpy.types import Operator
class ImportSomeData(Operator, ImportHelper):
'''This appears in the tooltip of the operator and in the generated docs'''
bl_idname = "import_test.some_data" # important since its how bpy.ops.import_test.some_data is constructed
bl_label = "Import Some Data"
# ImportHelper mixin class uses this
filename_ext = ".txt"
filter_glob = StringProperty(
default="*.txt",
options={'HIDDEN'},
)
# List of operator properties, the attributes will be assigned
# to the class instance from the operator settings before calling.
use_setting = BoolProperty(
name="Example Boolean",
description="Example Tooltip",
default=True,
)
type = EnumProperty(
name="Example Enum",
description="Choose between two items",
items=(('OPT_A', "First Option", "Description one"),
('OPT_B', "Second Option", "Description two")),
default='OPT_A',
)
def execute(self, context):
return read_some_data(context, self.filepath, self.use_setting)
# Only needed if you want to add into a dynamic menu
def menu_func_import(self, context):
self.layout.operator(ImportSomeData.bl_idname, text="Text Import Operator")
def register():
bpy.utils.register_class(ImportSomeData)
bpy.types.INFO_MT_file_import.append(menu_func_import)
def unregister():
bpy.utils.unregister_class(ImportSomeData)
bpy.types.INFO_MT_file_import.remove(menu_func_import)
if __name__ == "__main__":
register()
# test call
bpy.ops.import_test.some_data('INVOKE_DEFAULT')

@ -43,7 +43,9 @@
#include "MEM_guardedalloc.h"
#include "MEM_sys_types.h"
#include "BLI_winstuff.h"
#ifdef WIN32
# include "BLI_winstuff.h"
#endif
#include "AVI_avi.h"
#include "avi_intern.h"

@ -34,12 +34,13 @@
* \ingroup avi
*/
#include "AVI_avi.h"
#include "avi_intern.h"
#include "endian.h"
#include "BLI_winstuff.h"
#ifdef WIN32
# include "BLI_winstuff.h"
#endif
/* avi_set_compress_options gets its own file... now don't WE feel important? */

@ -67,6 +67,7 @@ const char *BLF_translate_do_tooltip(const char *contex, const char *msgid);
/* The "translation-marker" macro. */
#define N_(msgid) msgid
#define CTX_N_(context, msgid) msgid
/* Those macros should be used everywhere in UI code. */
#ifdef WITH_INTERNATIONAL
/* #define _(msgid) BLF_gettext(msgid) */
@ -82,4 +83,18 @@ const char *BLF_translate_do_tooltip(const char *contex, const char *msgid);
#define CTX_TIP_(context, msgid) msgid
#endif
/******************************************************************************
* All i18n contexts must be defined here.
* This is a nice way to be sure not to use a context twice for different
* things, and limit the number of existing contexts!
*/
/* Default, void context. Just in case... */
#define BLF_I18NCONTEXT_DEFAULT ""
/* Default context for operator names/labels. */
#define BLF_I18NCONTEXT_OPERATOR_DEFAULT "Operator"
#endif /* __BLF_TRANSLATION_H__ */

@ -279,8 +279,8 @@ void blf_font_buffer(FontBLF *font, const char *str)
if (font->b_fbuf) {
int yb = yb_start;
for (y = (chy >= 0 ? 0:-chy); y < height_clip; y++) {
for (x = (chx >= 0 ? 0:-chx); x < width_clip; x++) {
for (y = ((chy >= 0) ? 0 : -chy); y < height_clip; y++) {
for (x = ((chx >= 0) ? 0 : -chx); x < width_clip; x++) {
a = *(g->bitmap + x + (yb * g->pitch)) / 255.0f;
if (a > 0.0f) {

@ -42,7 +42,7 @@ extern "C" {
* and keep comment above the defines.
* Use STRINGIFY() rather than defining with quotes */
#define BLENDER_VERSION 262
#define BLENDER_SUBVERSION 3
#define BLENDER_SUBVERSION 4
#define BLENDER_MINVERSION 250
#define BLENDER_MINSUBVERSION 0
@ -51,7 +51,7 @@ extern "C" {
/* can be left blank, otherwise a,b,c... etc with no quotes */
#define BLENDER_VERSION_CHAR
/* alpha/beta/rc/release, docs use this */
#define BLENDER_VERSION_CYCLE beta
#define BLENDER_VERSION_CYCLE rc
extern char versionstr[]; /* from blender.c */

@ -212,8 +212,11 @@ void CTX_data_list_add(bContextDataResult *result, void *data);
ListBase ctx_data_list; \
CollectionPointerLink *ctx_link; \
CTX_data_##member(C, &ctx_data_list); \
for(ctx_link=ctx_data_list.first; ctx_link; ctx_link=ctx_link->next) {\
Type instance= ctx_link->ptr.data;
for (ctx_link = ctx_data_list.first; \
ctx_link; \
ctx_link = ctx_link->next) \
{ \
Type instance = ctx_link->ptr.data;
#define CTX_DATA_END \
} \

@ -99,7 +99,7 @@ void multiresModifier_prepare_join(struct Scene *scene, struct Object *ob, struc
int multires_mdisp_corners(struct MDisps *s);
/* update multires data after topology changing */
void multires_topology_changed(struct Scene *scene, struct Object *ob);
void multires_topology_changed(struct Mesh *me);
/**** interpolation stuff ****/
void old_mdisps_bilinear(float out[3], float (*disps)[3], const int st, float u, float v);

@ -69,14 +69,14 @@ void seq_array(struct Editing *ed, struct Sequence ***seqarray, int *tot, int us
#define SEQP_BEGIN(ed, _seq) \
{ \
SeqIterator iter; \
for(seq_begin(ed, &iter, 1); iter.valid; seq_next(&iter)) { \
_seq= iter.seq;
for (seq_begin(ed, &iter, 1); iter.valid; seq_next(&iter)) { \
_seq = iter.seq;
#define SEQ_BEGIN(ed, _seq) \
{ \
SeqIterator iter; \
for(seq_begin(ed, &iter, 0); iter.valid; seq_next(&iter)) { \
_seq= iter.seq;
for (seq_begin(ed, &iter, 0); iter.valid; seq_next(&iter)) { \
_seq = iter.seq;
#define SEQ_END \
} \
@ -138,12 +138,10 @@ struct SeqEffectHandle {
int (*early_out)(struct Sequence *seq, float facf0, float facf1);
/* stores the y-range of the effect IPO */
void (*store_icu_yrange)(struct Sequence * seq,
short adrcode, float *ymin, float *ymax);
void (*store_icu_yrange)(struct Sequence * seq, short adrcode, float *ymin, float *ymax);
/* stores the default facf0 and facf1 if no IPO is present */
void (*get_default_fac)(struct Sequence *seq, float cfra,
float * facf0, float * facf1);
void (*get_default_fac)(struct Sequence *seq, float cfra, float * facf0, float * facf1);
/* execute the effect
* sequence effects are only required to either support

@ -23,8 +23,11 @@ incs += ' ' + env['BF_ZLIB_INC']
defs = [ 'GLEW_STATIC' ]
defs.append('WITH_SMOKE') # TODO, make optional
defs.append('WITH_FRAMESERVER') # TODO, make optional
if env['WITH_BF_SMOKE']:
defs.append('WITH_SMOKE')
if env['WITH_BF_FRAMESERVER']:
defs.append('WITH_FRAMESERVER')
if env['WITH_BF_PYTHON']:
incs += ' ../python'

@ -1753,18 +1753,6 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
add_orco_dm(ob, NULL, *deform_r, NULL, CD_ORCO);
}
#ifdef WITH_GAMEENGINE
/* NavMesh - this is a hack but saves having a NavMesh modifier */
if ((ob->gameflag & OB_NAVMESH) && (finaldm->type == DM_TYPE_CDDM)) {
DerivedMesh *tdm;
tdm= navmesh_dm_createNavMeshForVisualization(finaldm);
if (finaldm != tdm) {
finaldm->release(finaldm);
finaldm= tdm;
}
}
#endif /* WITH_GAMEENGINE */
{
/* calculating normals can re-calculate tessfaces in some cases */
#if 0
@ -1820,6 +1808,18 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
}
}
#ifdef WITH_GAMEENGINE
/* NavMesh - this is a hack but saves having a NavMesh modifier */
if ((ob->gameflag & OB_NAVMESH) && (finaldm->type == DM_TYPE_CDDM)) {
DerivedMesh *tdm;
tdm= navmesh_dm_createNavMeshForVisualization(finaldm);
if (finaldm != tdm) {
finaldm->release(finaldm);
finaldm= tdm;
}
}
#endif /* WITH_GAMEENGINE */
*final_r = finaldm;
if (orcodm)
@ -2757,7 +2757,7 @@ void DM_vertex_attributes_from_gpu(DerivedMesh *dm, GPUVertexAttribs *gattribs,
fdata = tfdata = dm->getTessFaceDataLayout(dm);
/* calc auto bump scale if necessary */
if (dm->auto_bump_scale<=0.0f)
if (dm->auto_bump_scale <= 0.0f)
DM_calc_auto_bump_scale(dm);
/* add a tangent layer if necessary */
@ -2769,58 +2769,76 @@ void DM_vertex_attributes_from_gpu(DerivedMesh *dm, GPUVertexAttribs *gattribs,
for (b = 0; b < gattribs->totlayer; b++) {
if (gattribs->layer[b].type == CD_MTFACE) {
/* uv coordinates */
if (gattribs->layer[b].name[0])
layer = CustomData_get_named_layer_index(tfdata, CD_MTFACE,
gattribs->layer[b].name);
else
layer = CustomData_get_active_layer_index(tfdata, CD_MTFACE);
if(dm->type == DM_TYPE_EDITBMESH) {
/* exception .. */
CustomData *ldata = dm->getLoopDataLayout(dm);
if (layer != -1) {
a = attribs->tottface++;
attribs->tface[a].array = tfdata->layers[layer].data;
attribs->tface[a].emOffset = tfdata->layers[layer].offset;
attribs->tface[a].glIndex = gattribs->layer[b].glindex;
attribs->tface[a].glTexco = gattribs->layer[b].gltexco;
}
/* BMESH_TODO - BMESH ONLY, may need to get this working?, otherwise remove */
#if 0
else {
int player;
CustomData *pdata = dm->getPolyDataLayout(dm);
if (gattribs->layer[b].name[0])
player = CustomData_get_named_layer_index(pdata, CD_MTEXPOLY,
layer = CustomData_get_named_layer_index(ldata, CD_MLOOPUV,
gattribs->layer[b].name);
else
player = CustomData_get_active_layer_index(pdata, CD_MTEXPOLY);
if (player != -1) {
layer = CustomData_get_active_layer_index(ldata, CD_MLOOPUV);
if (layer != -1) {
a = attribs->tottface++;
attribs->tface[a].array = NULL;
attribs->tface[a].emOffset = pdata->layers[layer].offset;
attribs->tface[a].array = tfdata->layers[layer].data;
attribs->tface[a].emOffset = tfdata->layers[layer].offset;
attribs->tface[a].glIndex = gattribs->layer[b].glindex;
attribs->tface[a].glTexco = gattribs->layer[b].gltexco;
}
}
else {
if (gattribs->layer[b].name[0])
layer = CustomData_get_named_layer_index(tfdata, CD_MTFACE,
gattribs->layer[b].name);
else
layer = CustomData_get_active_layer_index(tfdata, CD_MTFACE);
if (layer != -1) {
a = attribs->tottface++;
attribs->tface[a].array = tfdata->layers[layer].data;
attribs->tface[a].emOffset = tfdata->layers[layer].offset;
attribs->tface[a].glIndex = gattribs->layer[b].glindex;
attribs->tface[a].glTexco = gattribs->layer[b].gltexco;
}
}
#endif
}
else if (gattribs->layer[b].type == CD_MCOL) {
/* vertex colors */
if (gattribs->layer[b].name[0])
layer = CustomData_get_named_layer_index(tfdata, CD_MCOL,
gattribs->layer[b].name);
else
layer = CustomData_get_active_layer_index(tfdata, CD_MCOL);
if(dm->type == DM_TYPE_EDITBMESH) {
/* exception .. */
CustomData *ldata = dm->getLoopDataLayout(dm);
if (layer != -1) {
a = attribs->totmcol++;
if (gattribs->layer[b].name[0])
layer = CustomData_get_named_layer_index(ldata, CD_MLOOPCOL,
gattribs->layer[b].name);
else
layer = CustomData_get_active_layer_index(ldata, CD_MLOOPCOL);
attribs->mcol[a].array = tfdata->layers[layer].data;
attribs->mcol[a].emOffset = tfdata->layers[layer].offset;
attribs->mcol[a].glIndex = gattribs->layer[b].glindex;
if (layer != -1) {
a = attribs->totmcol++;
attribs->mcol[a].array = tfdata->layers[layer].data;
attribs->mcol[a].emOffset = tfdata->layers[layer].offset;
attribs->mcol[a].glIndex = gattribs->layer[b].glindex;
}
}
else {
/* vertex colors */
if (gattribs->layer[b].name[0])
layer = CustomData_get_named_layer_index(tfdata, CD_MCOL,
gattribs->layer[b].name);
else
layer = CustomData_get_active_layer_index(tfdata, CD_MCOL);
if (layer != -1) {
a = attribs->totmcol++;
attribs->mcol[a].array = tfdata->layers[layer].data;
attribs->mcol[a].emOffset = tfdata->layers[layer].offset;
attribs->mcol[a].glIndex = gattribs->layer[b].glindex;
}
}
}
else if (gattribs->layer[b].type == CD_TANGENT) {
@ -2898,7 +2916,7 @@ static void navmesh_drawColored(DerivedMesh *dm)
int a, glmode;
MVert *mvert = (MVert *)CustomData_get_layer(&dm->vertData, CD_MVERT);
MFace *mface = (MFace *)CustomData_get_layer(&dm->faceData, CD_MFACE);
int *polygonIdx = (int *)CustomData_get_layer(&dm->faceData, CD_RECAST);
int *polygonIdx = (int *)CustomData_get_layer(&dm->polyData, CD_RECAST);
float col[3];
if (!polygonIdx)
@ -2980,14 +2998,14 @@ static DerivedMesh *navmesh_dm_createNavMeshForVisualization(DerivedMesh *dm)
int res;
result = CDDM_copy(dm);
if (!CustomData_has_layer(&result->faceData, CD_RECAST)) {
int *sourceRecastData = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST);
if (!CustomData_has_layer(&result->polyData, CD_RECAST)) {
int *sourceRecastData = (int*)CustomData_get_layer(&dm->polyData, CD_RECAST);
if (sourceRecastData) {
CustomData_add_layer_named(&result->faceData, CD_RECAST, CD_DUPLICATE,
CustomData_add_layer_named(&result->polyData, CD_RECAST, CD_DUPLICATE,
sourceRecastData, maxFaces, "recastData");
}
}
recastData = (int*)CustomData_get_layer(&result->faceData, CD_RECAST);
recastData = (int*)CustomData_get_layer(&result->polyData, CD_RECAST);
/* note: This is not good design! - really should not be doing this */
result->drawFacesTex = navmesh_DM_drawFacesTex;

@ -1407,17 +1407,16 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
if (part->ren_as==PART_DRAW_GR && psys->part->draw & PART_DRAW_WHOLE_GR) {
for (go= part->dup_group->gobject.first, b=0; go; go= go->next, b++) {
/* group dupli offset, should apply after everything else */
if (!is_zero_v3(part->dup_group->dupli_ofs)) {
copy_m4_m4(tmat, oblist[b]->obmat);
sub_v3_v3v3(tmat[3], tmat[3], part->dup_group->dupli_ofs);
mult_m4_m4m4(tmat, pamat, tmat);
}
else {
mult_m4_m4m4(tmat, pamat, oblist[b]->obmat);
}
copy_m4_m4(tmat, oblist[b]->obmat);
/* apply particle scale */
mul_mat3_m4_fl(tmat, size*scale);
mul_v3_fl(tmat[3], size*scale);
/* group dupli offset, should apply after everything else */
if (!is_zero_v3(part->dup_group->dupli_ofs))
sub_v3_v3v3(tmat[3], tmat[3], part->dup_group->dupli_ofs);
/* individual particle transform */
mult_m4_m4m4(tmat, pamat, tmat);
if (par_space_mat)
mult_m4_m4m4(mat, par_space_mat, tmat);
else

@ -572,7 +572,7 @@ BVHTree* bvhtree_from_mesh_faces(BVHTreeFromMesh *data, DerivedMesh *mesh, float
insert = 0;
}
else {
BM_ITER(v, &iter, em->bm, BM_VERTS_OF_FACE, f) {
BM_ITER_ELEM (v, &iter, f, BM_VERTS_OF_FACE) {
if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
/* Don't insert triangles tessellated from faces that have
* any selected verts.*/

@ -1929,7 +1929,7 @@ DerivedMesh *CDDM_from_BMEditMesh(BMEditMesh *em, Mesh *UNUSED(me), int use_mdis
mp->loopstart = j;
mp->mat_nr = efa->mat_nr;
BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
mloop->v = BM_elem_index_get(l->v);
mloop->e = BM_elem_index_get(l->e);
CustomData_from_bmesh_block(&bm->ldata, &dm->loopData, l->head.data, j);
@ -1989,13 +1989,6 @@ static DerivedMesh *cddm_copy_ex(DerivedMesh *source, int faces_from_tessfaces)
cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
/* any callers that need tessface data can calculate it - campbell */
#if 0
/* BMESH_TODO: Find out why this is necessary (or else find a way to remove
* it). If it is necessary, add a comment explaining why. */
CDDM_recalc_tessellation((DerivedMesh *)cddm);
#endif
return dm;
}

@ -1099,7 +1099,7 @@ const CustomDataMask CD_MASK_DERIVEDMESH =
CD_MASK_ORIGINDEX | CD_MASK_POLYINDEX;
const CustomDataMask CD_MASK_BMESH = CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY |
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT |
CD_MASK_PROP_STR | CD_MASK_SHAPEKEY | CD_MASK_SHAPE_KEYINDEX | CD_MASK_MDISPS | CD_MASK_CREASE | CD_MASK_BWEIGHT;
CD_MASK_PROP_STR | CD_MASK_SHAPEKEY | CD_MASK_SHAPE_KEYINDEX | CD_MASK_MDISPS | CD_MASK_CREASE | CD_MASK_BWEIGHT | CD_MASK_RECAST;
const CustomDataMask CD_MASK_FACECORNERS =
CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV |
CD_MASK_MLOOPCOL;
@ -2191,7 +2191,7 @@ void CustomData_bmesh_merge(CustomData *source, CustomData *dest,
if (t != BM_LOOPS_OF_FACE) {
/*ensure all current elements follow new customdata layout*/
BM_ITER(h, &iter, bm, t, NULL) {
BM_ITER_MESH (h, &iter, bm, t) {
tmp = NULL;
CustomData_bmesh_copy_data(&destold, dest, h->data, &tmp);
CustomData_bmesh_free_block(&destold, &h->data);
@ -2204,8 +2204,8 @@ void CustomData_bmesh_merge(CustomData *source, CustomData *dest,
BMIter liter;
/*ensure all current elements follow new customdata layout*/
BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
tmp = NULL;
CustomData_bmesh_copy_data(&destold, dest, l->head.data, &tmp);
CustomData_bmesh_free_block(&destold, &l->head.data);

@ -34,7 +34,10 @@
#include "MEM_guardedalloc.h"
#include "BLI_winstuff.h"
#ifdef WIN32
# include "BLI_winstuff.h"
#endif
#include "BLI_utildefines.h"
#include "BLI_listbase.h"
#include "BLI_ghash.h"

@ -416,6 +416,7 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase, i
void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
{
ScanFillContext sf_ctx;
ScanFillVert *eve, *v1, *vlast;
ScanFillFace *efa;
DispList *dlnew=NULL, *dl;
@ -431,7 +432,7 @@ void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
totvert= 0;
nextcol= 0;
BLI_begin_edgefill();
BLI_begin_edgefill(&sf_ctx);
dl= dispbase->first;
while (dl) {
@ -448,18 +449,18 @@ void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
while (a--) {
vlast= eve;
eve= BLI_addfillvert(f1);
eve = BLI_addfillvert(&sf_ctx, f1);
totvert++;
if (vlast==NULL) v1= eve;
else {
BLI_addfilledge(vlast, eve);
BLI_addfilledge(&sf_ctx, vlast, eve);
}
f1+=3;
}
if (eve!=NULL && v1!=NULL) {
BLI_addfilledge(eve, v1);
BLI_addfilledge(&sf_ctx, eve, v1);
}
}
else if (colnr<dl->col) {
@ -472,7 +473,7 @@ void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
dl= dl->next;
}
if (totvert && (tot= BLI_edgefill(0))) { // XXX (obedit && obedit->actcol)?(obedit->actcol-1):0)) {
if (totvert && (tot= BLI_edgefill(&sf_ctx, FALSE))) { // XXX (obedit && obedit->actcol)?(obedit->actcol-1):0)) {
if (tot) {
dlnew= MEM_callocN(sizeof(DispList), "filldisplist");
dlnew->type= DL_INDEX3;
@ -486,7 +487,7 @@ void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
/* vert data */
f1= dlnew->verts;
totvert= 0;
eve= fillvertbase.first;
eve= sf_ctx.fillvertbase.first;
while (eve) {
copy_v3_v3(f1, eve->co);
f1+= 3;
@ -499,7 +500,7 @@ void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
}
/* index data */
efa= fillfacebase.first;
efa = sf_ctx.fillfacebase.first;
index= dlnew->index;
while (efa) {
index[0]= (intptr_t)efa->v1->tmp.l;
@ -517,7 +518,7 @@ void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
BLI_addhead(to, dlnew);
}
BLI_end_edgefill();
BLI_end_edgefill(&sf_ctx);
if (nextcol) {
/* stay at current char but fill polys with next material */

@ -120,6 +120,8 @@ static void BMEdit_RecalcTessellation_intern(BMEditMesh *tm)
BMLoop *l;
int i = 0, j;
ScanFillContext sf_ctx;
#if 0
/* note, we could be clever and re-use this array but would need to ensure
* its realloced at some point, for now just free it */
@ -195,18 +197,18 @@ static void BMEdit_RecalcTessellation_intern(BMEditMesh *tm)
ScanFillFace *efa;
int totfilltri;
BLI_begin_edgefill();
BLI_begin_edgefill(&sf_ctx);
/*scanfill time*/
l = BM_iter_new(&liter, bm, BM_LOOPS_OF_FACE, f);
for (j=0; l; l=BM_iter_step(&liter), j++) {
/*mark order*/
BM_elem_index_set(l, j); /* set_loop */
v = BLI_addfillvert(l->v->co);
v = BLI_addfillvert(&sf_ctx, l->v->co);
v->tmp.p = l;
if (lastv) {
/* e = */ BLI_addfilledge(lastv, v);
/* e = */ BLI_addfilledge(&sf_ctx, lastv, v);
}
lastv = v;
@ -214,12 +216,12 @@ static void BMEdit_RecalcTessellation_intern(BMEditMesh *tm)
}
/*complete the loop*/
BLI_addfilledge(firstv, v);
BLI_addfilledge(&sf_ctx, firstv, v);
totfilltri = BLI_edgefill(2);
totfilltri = BLI_edgefill_ex(&sf_ctx, FALSE, f->no);
BLI_array_growitems(looptris, totfilltri);
for (efa = fillfacebase.first; efa; efa=efa->next) {
for (efa = sf_ctx.fillfacebase.first; efa; efa=efa->next) {
BMLoop *l1= efa->v1->tmp.p;
BMLoop *l2= efa->v2->tmp.p;
BMLoop *l3= efa->v3->tmp.p;
@ -234,7 +236,7 @@ static void BMEdit_RecalcTessellation_intern(BMEditMesh *tm)
i += 1;
}
BLI_end_edgefill();
BLI_end_edgefill(&sf_ctx);
}
}
@ -491,7 +493,7 @@ static void emDM_drawUVEdges(DerivedMesh *dm)
BMIter iter;
glBegin(GL_LINES);
BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
BMIter liter;
BMLoop *l;
MLoopUV *lastluv = NULL, *firstluv = NULL;
@ -499,7 +501,7 @@ static void emDM_drawUVEdges(DerivedMesh *dm)
if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN))
continue;
BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (luv) {
@ -1318,6 +1320,8 @@ static void emDM_getVert(DerivedMesh *dm, int index, MVert *vert_r)
ev = BM_vert_at_index(bmdm->tc->bm, index); /* warning, does list loop, _not_ ideal */
bmvert_to_mvert(bmdm->tc->bm, ev, vert_r);
if(bmdm->vertexCos)
copy_v3_v3(vert_r->co, bmdm->vertexCos[index]);
}
static void emDM_getEdge(DerivedMesh *dm, int index, MEdge *edge_r)
@ -1376,13 +1380,18 @@ static void emDM_getTessFace(DerivedMesh *dm, int index, MFace *face_r)
static void emDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
{
BMesh *bm = ((EditDerivedBMesh *)dm)->tc->bm;
EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
BMesh *bm = bmdm->tc->bm;
BMVert *ev;
BMIter iter;
int i;
ev = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, NULL);
for ( ; ev; ev = BM_iter_step(&iter), ++vert_r) {
copy_v3_v3(vert_r->co, ev->co);
for (i = 0 ; ev; ev = BM_iter_step(&iter), ++vert_r, ++i) {
if (bmdm->vertexCos)
copy_v3_v3(vert_r->co, bmdm->vertexCos[i]);
else
copy_v3_v3(vert_r->co, ev->co);
normal_float_to_short_v3(vert_r->no, ev->no);
@ -1459,8 +1468,8 @@ static void emDM_copyLoopArray(DerivedMesh *dm, MLoop *loop_r)
BM_mesh_elem_index_ensure(bm, BM_VERT | BM_EDGE);
BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
loop_r->v = BM_elem_index_get(l->v);
loop_r->e = BM_elem_index_get(l->e);
loop_r++;
@ -1477,7 +1486,7 @@ static void emDM_copyPolyArray(DerivedMesh *dm, MPoly *poly_r)
int i;
i = 0;
BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
poly_r->flag = BM_face_flag_to_mflag(f);
poly_r->loopstart = i;
poly_r->totloop = f->len;
@ -1492,35 +1501,49 @@ static void *emDM_getTessFaceDataArray(DerivedMesh *dm, int type)
{
EditDerivedBMesh *bmdm= (EditDerivedBMesh*) dm;
BMesh *bm= bmdm->tc->bm;
BMFace *efa;
char *data, *bmdata;
void *datalayer;
int index /*, offset*/ /*UNUSED */, size, i;
datalayer = DM_get_tessface_data_layer(dm, type);
if (datalayer)
return datalayer;
/* layers are store per face for editmesh, we convert to a tbmporary
/* layers are store per face for editmesh, we convert to a temporary
* data layer array in the derivedmesh when these are requested */
if (type == CD_MTFACE || type == CD_MCOL) {
index = CustomData_get_layer_index(&bm->pdata, type);
const int type_from = (type == CD_MTFACE) ? CD_MTEXPOLY : CD_MLOOPCOL;
int index;
char *data, *bmdata;
index = CustomData_get_layer_index(&bm->pdata, type_from);
if (index != -1) {
/* offset = bm->pdata.layers[index].offset; */ /* UNUSED */
size = CustomData_sizeof(type);
const int size = CustomData_sizeof(type);
int i, j;
DM_add_tessface_layer(dm, type, CD_CALLOC, NULL);
index = CustomData_get_layer_index(&dm->faceData, type);
dm->faceData.layers[index].flag |= CD_FLAG_TEMPORARY;
data = datalayer = DM_get_tessface_data_layer(dm, type);
for (i=0; i<bmdm->tc->tottri; i++, data+=size) {
efa = bmdm->tc->looptris[i][0]->f;
/* BMESH_TODO: need to still add tface data,
* derived from the loops.*/
bmdata = CustomData_bmesh_get(&bm->pdata, efa->head.data, type);
memcpy(data, bmdata, size);
if (type == CD_MTFACE) {
for (i = 0; i < bmdm->tc->tottri; i++, data += size) {
BMFace *efa = bmdm->tc->looptris[i][0]->f;
bmdata = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
ME_MTEXFACE_CPY(((MTFace *)data), ((MTexPoly *)bmdata));
for (j = 0; j < 3; j++) {
bmdata = CustomData_bmesh_get(&bm->ldata, bmdm->tc->looptris[i][j]->head.data, CD_MLOOPUV);
copy_v2_v2(((MTFace *)data)->uv[j], ((MLoopUV *)bmdata)->uv);
}
}
}
else {
for (i = 0; i < bmdm->tc->tottri; i++, data += size) {
for (j = 0; j < 3; j++) {
bmdata = CustomData_bmesh_get(&bm->ldata, bmdm->tc->looptris[i][j]->head.data, CD_MLOOPCOL);
MESH_MLOOPCOL_TO_MCOL(((MLoopCol *)bmdata), (((MCol *)data) + j));
}
}
}
}
}
@ -1536,7 +1559,7 @@ static void emDM_getVertCos(DerivedMesh *dm, float (*cos_r)[3])
int i;
i= 0;
BM_ITER(eve, &iter, emdm->tc->bm, BM_VERTS_OF_MESH, NULL) {
BM_ITER_MESH (eve, &iter, emdm->tc->bm, BM_VERTS_OF_MESH) {
if (emdm->vertexCos) {
copy_v3_v3(cos_r[i], emdm->vertexCos[i]);
}
@ -1612,8 +1635,6 @@ DerivedMesh *getEditDerivedBMesh(
DM_init((DerivedMesh*)bmdm, DM_TYPE_EDITBMESH, em->bm->totvert,
em->bm->totedge, em->tottri, em->bm->totloop, em->bm->totface);
CustomData_from_bmeshpoly(&bmdm->dm.faceData, &em->bm->pdata, &em->bm->ldata, 0);
bmdm->dm.getVertCos = emDM_getVertCos;
bmdm->dm.getMinMax = emDM_getMinMax;
@ -1688,7 +1709,7 @@ DerivedMesh *getEditDerivedBMesh(
bmdm->polyNos = MEM_mallocN(sizeof(*bmdm->polyNos)*bm->totface, "bmdm_pno");
i = 0;
BM_ITER(efa, &fiter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER_MESH (efa, &fiter, bm, BM_FACES_OF_MESH) {
BM_elem_index_set(efa, i); /* set_inline */
BM_face_normal_update_vcos(bm, efa, bmdm->polyNos[i], (float const (*)[3])vertexCos);
i++;
@ -1698,7 +1719,7 @@ DerivedMesh *getEditDerivedBMesh(
eve=BM_iter_new(&viter, bm, BM_VERTS_OF_MESH, NULL);
for (i=0; eve; eve=BM_iter_step(&viter), i++) {
float *no = bmdm->vertexNos[i];
BM_ITER(efa, &fiter, bm, BM_FACES_OF_VERT, eve) {
BM_ITER_ELEM (efa, &fiter, eve, BM_FACES_OF_VERT) {
add_v3_v3(no, bmdm->polyNos[BM_elem_index_get(efa)]);
}

@ -520,7 +520,7 @@ static char *key_block_get_data(Key *key, KeyBlock *actkb, KeyBlock *kb, char **
a = 0;
co = MEM_callocN(sizeof(float) * 3 * me->edit_btmesh->bm->totvert, "key_block_get_data");
BM_ITER(eve, &iter, me->edit_btmesh->bm, BM_VERTS_OF_MESH, NULL) {
BM_ITER_MESH (eve, &iter, me->edit_btmesh->bm, BM_VERTS_OF_MESH) {
copy_v3_v3(co[a], eve->co);
a++;
}

@ -2354,7 +2354,6 @@ int mesh_recalcTessellation(CustomData *fdata,
* we can skip copying here */
const int do_face_nor_cpy)
{
/* use this to avoid locking pthread for _every_ polygon
* and calling the fill function */
@ -2368,6 +2367,7 @@ int mesh_recalcTessellation(CustomData *fdata,
MLoop *ml, *mloop;
MFace *mface = NULL, *mf;
BLI_array_declare(mface);
ScanFillContext sf_ctx;
ScanFillVert *v, *lastv, *firstv;
ScanFillFace *f;
int *mface_orig_index = NULL;
@ -2461,24 +2461,24 @@ int mesh_recalcTessellation(CustomData *fdata,
ml = mloop + mp->loopstart;
BLI_begin_edgefill();
BLI_begin_edgefill(&sf_ctx);
firstv = NULL;
lastv = NULL;
for (j=0; j<mp->totloop; j++, ml++) {
v = BLI_addfillvert(mvert[ml->v].co);
v = BLI_addfillvert(&sf_ctx, mvert[ml->v].co);
v->keyindex = mp->loopstart + j;
if (lastv)
BLI_addfilledge(lastv, v);
BLI_addfilledge(&sf_ctx, lastv, v);
if (!firstv)
firstv = v;
lastv = v;
}
BLI_addfilledge(lastv, firstv);
BLI_addfilledge(&sf_ctx, lastv, firstv);
totfilltri = BLI_edgefill(2);
totfilltri = BLI_edgefill(&sf_ctx, FALSE);
if (totfilltri) {
BLI_array_growitems(mface_to_poly_map, totfilltri);
BLI_array_growitems(mface, totfilltri);
@ -2486,7 +2486,7 @@ int mesh_recalcTessellation(CustomData *fdata,
BLI_array_growitems(mface_orig_index, totfilltri);
}
for (f = fillfacebase.first; f; f = f->next, mf++) {
for (f = sf_ctx.fillfacebase.first; f; f = f->next, mf++) {
mface_to_poly_map[mface_index] = poly_index;
mf= &mface[mface_index];
@ -2511,7 +2511,7 @@ int mesh_recalcTessellation(CustomData *fdata,
}
}
BLI_end_edgefill();
BLI_end_edgefill(&sf_ctx);
}
}

@ -63,7 +63,7 @@ typedef struct SortPoly {
/* TODO check there is not some standard define of this somewhere! */
static int int_cmp(const void *v1, const void *v2)
{
return *(int*)v1 > *(int*)v2 ? 1 : *(int*)v1 < *(int*)v2 ? -1 : 0;
return *(int *)v1 > *(int *)v2 ? 1 : *(int *)v1 < *(int *)v2 ? -1 : 0;
}
static int search_poly_cmp(const void *v1, const void *v2)
@ -103,11 +103,11 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
MDeformVert *dverts, /* assume totvert length */
const short do_verbose, const short do_fixes)
{
# define REMOVE_EDGE_TAG(_me) { _me->v2 = _me->v1; do_edge_free = TRUE; }
# define IS_REMOVED_EDGE(_me) (_me->v2 == _me->v1)
# define REMOVE_EDGE_TAG(_me) { _me->v2 = _me->v1; do_edge_free = TRUE; }
# define IS_REMOVED_EDGE(_me) (_me->v2 == _me->v1)
# define REMOVE_LOOP_TAG(_ml) { _ml->e = INVALID_LOOP_EDGE_MARKER; do_polyloop_free = TRUE; }
# define REMOVE_POLY_TAG(_mp) { _mp->totloop *= -1; do_polyloop_free = TRUE; }
# define REMOVE_LOOP_TAG(_ml) { _ml->e = INVALID_LOOP_EDGE_MARKER; do_polyloop_free = TRUE; }
# define REMOVE_POLY_TAG(_mp) { _mp->totloop *= -1; do_polyloop_free = TRUE; }
MVert *mv = mverts;
MEdge *me;
@ -116,13 +116,13 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
unsigned int i, j;
int *v;
short do_edge_free= FALSE;
short do_polyloop_free= FALSE; /* This regroups loops and polys! */
short do_edge_free = FALSE;
short do_polyloop_free = FALSE; /* This regroups loops and polys! */
short verts_fixed= FALSE;
short vert_weights_fixed= FALSE;
short verts_fixed = FALSE;
short vert_weights_fixed = FALSE;
int do_edge_recalc= FALSE;
int do_edge_recalc = FALSE;
EdgeHash *edge_hash = BLI_edgehash_new();
@ -136,53 +136,53 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
do_edge_recalc = do_fixes;
}
for (i=1; i<totvert; i++, mv++) {
for (i = 1; i < totvert; i++, mv++) {
int j;
int fix_normal= TRUE;
int fix_normal = TRUE;
for (j=0; j<3; j++) {
for (j = 0; j < 3; j++) {
if (!finite(mv->co[j])) {
PRINT(" vertex %u: has invalid coordinate\n", i);
if (do_fixes) {
zero_v3(mv->co);
verts_fixed= TRUE;
verts_fixed = TRUE;
}
}
if (mv->no[j]!=0)
fix_normal= FALSE;
if (mv->no[j] != 0)
fix_normal = FALSE;
}
if (fix_normal) {
PRINT(" vertex %u: has zero normal, assuming Z-up normal\n", i);
if (do_fixes) {
mv->no[2]= SHRT_MAX;
verts_fixed= TRUE;
mv->no[2] = SHRT_MAX;
verts_fixed = TRUE;
}
}
}
for (i=0, me= medges; i<totedge; i++, me++) {
int remove= FALSE;
for (i = 0, me = medges; i < totedge; i++, me++) {
int remove = FALSE;
if (me->v1 == me->v2) {
PRINT(" edge %u: has matching verts, both %u\n", i, me->v1);
remove= do_fixes;
remove = do_fixes;
}
if (me->v1 >= totvert) {
PRINT(" edge %u: v1 index out of range, %u\n", i, me->v1);
remove= do_fixes;
remove = do_fixes;
}
if (me->v2 >= totvert) {
PRINT(" edge %u: v2 index out of range, %u\n", i, me->v2);
remove= do_fixes;
remove = do_fixes;
}
if (BLI_edgehash_haskey(edge_hash, me->v1, me->v2)) {
PRINT(" edge %u: is a duplicate of %d\n", i,
GET_INT_FROM_POINTER(BLI_edgehash_lookup(edge_hash, me->v1, me->v2)));
remove= do_fixes;
remove = do_fixes;
}
if (remove == FALSE) {
@ -281,7 +281,7 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
int prev_e = ml->e;
ml->e = GET_INT_FROM_POINTER(BLI_edgehash_lookup(edge_hash, v1, v2));
PRINT(" poly %u has invalid edge reference (%u), fixed using edge %u\n",
sp->index, prev_e, ml->e);
sp->index, prev_e, ml->e);
}
else {
PRINT(" poly %u has invalid edge reference (%u)\n", sp->index, ml->e);
@ -471,24 +471,24 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
/* fix deform verts */
if (dverts) {
MDeformVert *dv;
for (i=0, dv= dverts; i<totvert; i++, dv++) {
for (i = 0, dv = dverts; i < totvert; i++, dv++) {
MDeformWeight *dw;
unsigned int j;
for (j=0, dw= dv->dw; j < dv->totweight; j++, dw++) {
for (j = 0, dw = dv->dw; j < dv->totweight; j++, dw++) {
/* note, greater then max defgroups is accounted for in our code, but not < 0 */
if (!finite(dw->weight)) {
PRINT(" vertex deform %u, group %d has weight: %f\n", i, dw->def_nr, dw->weight);
if (do_fixes) {
dw->weight= 0.0f;
vert_weights_fixed= TRUE;
dw->weight = 0.0f;
vert_weights_fixed = TRUE;
}
}
else if (dw->weight < 0.0f || dw->weight > 1.0f) {
PRINT(" vertex deform %u, group %d has weight: %f\n", i, dw->def_nr, dw->weight);
if (do_fixes) {
CLAMP(dw->weight, 0.0f, 1.0f);
vert_weights_fixed= TRUE;
vert_weights_fixed = TRUE;
}
}
@ -500,9 +500,9 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
/* re-allocated, the new values compensate for stepping
* within the for loop and may not be valid */
j--;
dw= dv->dw + j;
dw = dv->dw + j;
vert_weights_fixed= TRUE;
vert_weights_fixed = TRUE;
}
else { /* all freed */
break;
@ -515,10 +515,10 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
PRINT("BKE_mesh_validate: finished\n\n");
# undef REMOVE_EDGE_TAG
# undef IS_REMOVED_EDGE
# undef REMOVE_LOOP_TAG
# undef REMOVE_POLY_TAG
# undef REMOVE_EDGE_TAG
# undef IS_REMOVED_EDGE
# undef REMOVE_LOOP_TAG
# undef REMOVE_POLY_TAG
if (mesh) {
if (do_polyloop_free) {
@ -539,20 +539,20 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
static int mesh_validate_customdata(CustomData *data, short do_verbose, const short do_fixes)
{
int i= 0, has_fixes= 0;
int i = 0, has_fixes = 0;
while (i<data->totlayer) {
CustomDataLayer *layer= &data->layers[i];
CustomDataMask mask= CD_TYPE_AS_MASK(layer->type);
int ok= 1;
while (i < data->totlayer) {
CustomDataLayer *layer = &data->layers[i];
CustomDataMask mask = CD_TYPE_AS_MASK(layer->type);
int ok = 1;
if ((mask&CD_MASK_MESH)==0) {
if ((mask & CD_MASK_MESH) == 0) {
PRINT("CustomDataLayer type %d which isn't in CD_MASK_MESH is stored in Mehs structure\n", layer->type);
if (do_fixes) {
CustomData_free_layer(data, layer->type, 0, i);
ok= 0;
has_fixes= 1;
ok = 0;
has_fixes = 1;
}
}
@ -569,32 +569,32 @@ static int BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata
CustomData *ldata, CustomData *pdata,
short do_verbose, const short do_fixes)
{
int vfixed= 0, efixed= 0, lfixed = 0, pfixed = 0;
int vfixed = 0, efixed = 0, lfixed = 0, pfixed = 0;
vfixed= mesh_validate_customdata(vdata, do_verbose, do_fixes);
efixed= mesh_validate_customdata(edata, do_verbose, do_fixes);
lfixed= mesh_validate_customdata(ldata, do_verbose, do_fixes);
pfixed= mesh_validate_customdata(pdata, do_verbose, do_fixes);
vfixed = mesh_validate_customdata(vdata, do_verbose, do_fixes);
efixed = mesh_validate_customdata(edata, do_verbose, do_fixes);
lfixed = mesh_validate_customdata(ldata, do_verbose, do_fixes);
pfixed = mesh_validate_customdata(pdata, do_verbose, do_fixes);
return vfixed || efixed || lfixed || pfixed;
}
int BKE_mesh_validate(Mesh *me, int do_verbose)
{
int layers_fixed= 0, arrays_fixed= 0;
int layers_fixed = 0, arrays_fixed = 0;
if (do_verbose) {
printf("MESH: %s\n", me->id.name+2);
printf("MESH: %s\n", me->id.name + 2);
}
layers_fixed= BKE_mesh_validate_all_customdata(&me->vdata, &me->edata, &me->ldata, &me->pdata, do_verbose, TRUE);
arrays_fixed= BKE_mesh_validate_arrays(me,
me->mvert, me->totvert,
me->medge, me->totedge,
me->mloop, me->totloop,
me->mpoly, me->totpoly,
me->dvert,
do_verbose, TRUE);
layers_fixed = BKE_mesh_validate_all_customdata(&me->vdata, &me->edata, &me->ldata, &me->pdata, do_verbose, TRUE);
arrays_fixed = BKE_mesh_validate_arrays(me,
me->mvert, me->totvert,
me->medge, me->totedge,
me->mloop, me->totloop,
me->mpoly, me->totpoly,
me->dvert,
do_verbose, TRUE);
if (layers_fixed || arrays_fixed) {
DAG_id_tag_update(&me->id, OB_RECALC_DATA);
@ -624,26 +624,26 @@ void BKE_mesh_calc_edges(Mesh *mesh, int update)
int i, totedge, totpoly = mesh->totpoly;
int med_index;
if (mesh->totedge==0)
update= 0;
if (mesh->totedge == 0)
update = FALSE;
if (update) {
/* assume existing edges are valid
* useful when adding more faces and generating edges from them */
med= mesh->medge;
for (i= 0; i<mesh->totedge; i++, med++)
med = mesh->medge;
for (i = 0; i < mesh->totedge; i++, med++)
BLI_edgehash_insert(eh, med->v1, med->v2, med);
}
/* mesh loops (bmesh only) */
for (i=0; i < totpoly; i++, mp++) {
MLoop *l= &mesh->mloop[mp->loopstart];
int j, l_prev= (l + (mp->totloop-1))->v;
for (j=0; j < mp->totloop; j++, l++) {
for (i = 0; i < totpoly; i++, mp++) {
MLoop *l = &mesh->mloop[mp->loopstart];
int j, l_prev = (l + (mp->totloop - 1))->v;
for (j = 0; j < mp->totloop; j++, l++) {
if (!BLI_edgehash_haskey(eh, l_prev, l->v)) {
BLI_edgehash_insert(eh, l_prev, l->v, NULL);
}
l_prev= l->v;
l_prev = l->v;
}
}
@ -656,14 +656,14 @@ void BKE_mesh_calc_edges(Mesh *mesh, int update)
ehi = BLI_edgehashIterator_new(eh);
med = CustomData_get_layer(&edata, CD_MEDGE);
for (i = 0; !BLI_edgehashIterator_isDone(ehi);
BLI_edgehashIterator_step(ehi), ++i, ++med) {
BLI_edgehashIterator_step(ehi), ++i, ++med) {
if (update && (med_orig=BLI_edgehashIterator_getValue(ehi))) {
*med= *med_orig; /* copy from the original */
if (update && (med_orig = BLI_edgehashIterator_getValue(ehi))) {
*med = *med_orig; /* copy from the original */
}
else {
BLI_edgehashIterator_getKey(ehi, &med->v1, &med->v2);
med->flag = ME_EDGEDRAW|ME_EDGERENDER|SELECT; /* select for newly created meshes which are selected [#25595] */
med->flag = ME_EDGEDRAW | ME_EDGERENDER | SELECT; /* select for newly created meshes which are selected [#25595] */
}
/* store the new edge index in the hash value */
@ -674,16 +674,16 @@ void BKE_mesh_calc_edges(Mesh *mesh, int update)
if (mesh->totpoly) {
/* second pass, iterate through all loops again and assign
* the newly created edges to them. */
MPoly *mp= mesh->mpoly;
for (i=0; i < mesh->totpoly; i++, mp++) {
MLoop *l= &mesh->mloop[mp->loopstart];
MLoop *l_prev= (l + (mp->totloop-1));
MPoly *mp = mesh->mpoly;
for (i = 0; i < mesh->totpoly; i++, mp++) {
MLoop *l = &mesh->mloop[mp->loopstart];
MLoop *l_prev = (l + (mp->totloop - 1));
int j;
for (j=0; j < mp->totloop; j++, l++) {
for (j = 0; j < mp->totloop; j++, l++) {
/* lookup hashed edge index */
med_index = GET_INT_FROM_POINTER(BLI_edgehash_lookup(eh, l_prev->v, l->v));
l_prev->e = med_index;
l_prev= l;
l_prev = l;
}
}
}

@ -2166,58 +2166,38 @@ void multiresModifier_prepare_join(Scene *scene, Object *ob, Object *to_ob)
}
/* update multires data after topology changing */
#if 0 // BMESH_TODO
void multires_topology_changed(Scene *scene, Object *ob)
void multires_topology_changed(Mesh *me)
{
Mesh *me= (Mesh*)ob->data;
MDisps *mdisp= NULL, *cur= NULL;
int i, grid= 0, corners;
MultiresModifierData *mmd= get_multires_modifier(scene, ob, 1);
MDisps *mdisp = NULL, *cur = NULL;
int i, grid = 0;
if (mmd)
multires_set_tot_mdisps(me, mmd->totlvl);
CustomData_external_read(&me->ldata, &me->id, CD_MASK_MDISPS, me->totface);
mdisp = CustomData_get_layer(&me->ldata, CD_MDISPS);
CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
mdisp= CustomData_get_layer(&me->fdata, CD_MDISPS);
if (!mdisp)
return;
if (!mdisp) return;
cur= mdisp;
for (i = 0; i < me->totface; i++, cur++) {
if (mdisp->totdisp) {
corners= multires_mdisp_corners(mdisp);
grid= mdisp->totdisp / corners;
cur = mdisp;
for (i = 0; i < me->totloop; i++, cur++) {
if (cur->totdisp) {
grid = mdisp->totdisp;
break;
}
}
for (i = 0; i < me->totface; i++, mdisp++) {
int nvert= me->mface[i].v4 ? 4 : 3;
for (i = 0; i < me->totloop; i++, mdisp++) {
/* allocate memory for mdisp, the whole disp layer would be erased otherwise */
if (!mdisp->totdisp || !mdisp->disps) {
if (grid) {
mdisp->totdisp= nvert*grid;
mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology");
mdisp->totdisp = grid;
mdisp->disps = MEM_callocN(3 * mdisp->totdisp * sizeof(float), "mdisp topology");
}
continue;
}
corners= multires_mdisp_corners(mdisp);
if (corners!=nvert) {
mdisp->totdisp= (mdisp->totdisp/corners)*nvert;
if (mdisp->disps)
MEM_freeN(mdisp->disps);
mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology");
}
}
}
#endif // BMESH_TODO
/***************** Multires interpolation stuff *****************/

@ -166,7 +166,7 @@ int buildRawVertIndicesData(DerivedMesh* dm, int *nverts_r, float **verts_r,
}
//carefully, recast data is just reference to data in derived mesh
*recastData = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST);
*recastData = (int*)CustomData_get_layer(&dm->polyData, CD_RECAST);
*nverts_r = nverts;
*verts_r = verts;

@ -1367,7 +1367,7 @@ void nodeSetActive(bNodeTree *ntree, bNode *node)
int nodeSocketIsHidden(bNodeSocket *sock)
{
return ((sock->flag & (SOCK_HIDDEN | SOCK_AUTO_HIDDEN | SOCK_UNAVAIL)) != 0);
return ((sock->flag & (SOCK_HIDDEN | SOCK_UNAVAIL)) != 0);
}
void nodeSocketSetType(bNodeSocket *sock, int type)
@ -1616,6 +1616,7 @@ int nodeUpdateID(bNodeTree *ntree, ID *id)
for (node= ntree->nodes.first; node; node= node->next) {
if (node->id==id) {
change = TRUE;
node->update |= NODE_UPDATE_ID;
ntreetype->update_node(ntree, node);
/* clear update flag */
node->update = 0;
@ -1626,6 +1627,7 @@ int nodeUpdateID(bNodeTree *ntree, ID *id)
for (node= ntree->nodes.first; node; node= node->next) {
if (node->id==id) {
change = TRUE;
node->update |= NODE_UPDATE_ID;
if (node->typeinfo->updatefunc)
node->typeinfo->updatefunc(ntree, node);
/* clear update flag */

@ -1780,7 +1780,7 @@ static void give_parvert(Object *par, int nr, float vec[3])
BMVert *eve;
BMIter iter;
BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
int *keyindex = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_SHAPE_KEYINDEX);
if (keyindex && *keyindex==nr) {

@ -125,6 +125,12 @@ Scene *copy_scene(Scene *sce, int type)
lb= scen->r.layers;
scen->r= sce->r;
scen->r.layers= lb;
scen->unit= sce->unit;
scen->physics_settings= sce->physics_settings;
scen->gm= sce->gm;
scen->audio= sce->audio;
MEM_freeN(scen->toolsettings);
}
else {
scen= copy_libblock(&sce->id);
@ -139,37 +145,9 @@ Scene *copy_scene(Scene *sce, int type)
scen->ed= NULL;
scen->theDag= NULL;
scen->obedit= NULL;
scen->toolsettings= MEM_dupallocN(sce->toolsettings);
scen->stats= NULL;
scen->fps_info= NULL;
ts= scen->toolsettings;
if (ts) {
if (ts->vpaint) {
ts->vpaint= MEM_dupallocN(ts->vpaint);
ts->vpaint->paintcursor= NULL;
ts->vpaint->vpaint_prev= NULL;
ts->vpaint->wpaint_prev= NULL;
copy_paint(&ts->vpaint->paint, &ts->vpaint->paint);
}
if (ts->wpaint) {
ts->wpaint= MEM_dupallocN(ts->wpaint);
ts->wpaint->paintcursor= NULL;
ts->wpaint->vpaint_prev= NULL;
ts->wpaint->wpaint_prev= NULL;
copy_paint(&ts->wpaint->paint, &ts->wpaint->paint);
}
if (ts->sculpt) {
ts->sculpt= MEM_dupallocN(ts->sculpt);
copy_paint(&ts->sculpt->paint, &ts->sculpt->paint);
}
copy_paint(&ts->imapaint.paint, &ts->imapaint.paint);
ts->imapaint.paintcursor= NULL;
ts->particle.paintcursor= NULL;
}
BLI_duplicatelist(&(scen->markers), &(sce->markers));
BLI_duplicatelist(&(scen->transform_spaces), &(sce->transform_spaces));
BLI_duplicatelist(&(scen->r.layers), &(sce->r.layers));
@ -190,6 +168,35 @@ Scene *copy_scene(Scene *sce, int type)
base= base->next;
}
}
/* tool settings */
scen->toolsettings= MEM_dupallocN(sce->toolsettings);
ts= scen->toolsettings;
if (ts) {
if (ts->vpaint) {
ts->vpaint= MEM_dupallocN(ts->vpaint);
ts->vpaint->paintcursor= NULL;
ts->vpaint->vpaint_prev= NULL;
ts->vpaint->wpaint_prev= NULL;
copy_paint(&ts->vpaint->paint, &ts->vpaint->paint);
}
if (ts->wpaint) {
ts->wpaint= MEM_dupallocN(ts->wpaint);
ts->wpaint->paintcursor= NULL;
ts->wpaint->vpaint_prev= NULL;
ts->wpaint->wpaint_prev= NULL;
copy_paint(&ts->wpaint->paint, &ts->wpaint->paint);
}
if (ts->sculpt) {
ts->sculpt= MEM_dupallocN(ts->sculpt);
copy_paint(&ts->sculpt->paint, &ts->sculpt->paint);
}
copy_paint(&ts->imapaint.paint, &ts->imapaint.paint);
ts->imapaint.paintcursor= NULL;
ts->particle.paintcursor= NULL;
}
/* make a private copy of the avicodecdata */
if (sce->r.avicodecdata) {

@ -30,7 +30,9 @@
* \ingroup bke
*/
#include "BLI_winstuff.h"
#ifdef WIN32
# include "BLI_winstuff.h"
#endif
#include <string.h>
#include <stdio.h>

@ -2560,6 +2560,8 @@ void txt_delete_char(Text *text)
txt_combine_lines(text, text->curl, text->curl->next);
txt_pop_sel(text);
}
else
return;
}
else { /* Just deleting a char */
size_t c_len = 0;

@ -34,7 +34,10 @@
#include "BLI_math.h"
#include "BLI_string.h"
#include "BLI_string_utf8.h"
#include "BLI_winstuff.h"
#ifdef WIN32
# include "BLI_winstuff.h"
#endif
#define TEMP_STR_SIZE 256
@ -128,7 +131,7 @@ static struct bUnitDef buImperialLenDef[] = {
{"mile", "miles", "mi", "m", "Miles", UN_SC_MI, 0.0, B_UNIT_DEF_NONE},
{"furlong", "furlongs", "fur", NULL, "Furlongs",UN_SC_FUR, 0.0, B_UNIT_DEF_SUPPRESS},
{"chain", "chains", "ch", NULL, "Chains", UN_SC_CH, 0.0, B_UNIT_DEF_SUPPRESS},
{"yard", "yards", "yd", NULL, "Yards", UN_SC_YD, 0.0, B_UNIT_DEF_NONE},
{"yard", "yards", "yd", NULL, "Yards", UN_SC_YD, 0.0, B_UNIT_DEF_SUPPRESS},
{"foot", "feet", "'", "ft", "Feet", UN_SC_FT, 0.0, B_UNIT_DEF_NONE}, /* base unit */
{"inch", "inches", "\"", "in", "Inches", UN_SC_IN, 0.0, B_UNIT_DEF_NONE},
{"thou", "thou", "thou", "mil", "Thou", UN_SC_MIL, 0.0, B_UNIT_DEF_NONE}, /* plural for thou has no 's' */

@ -124,6 +124,8 @@ MINLINE float dot_v3v3(const float a[3], const float b[3]);
MINLINE float cross_v2v2(const float a[2], const float b[2]);
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3]);
MINLINE void add_newell_cross_v3_v3v3(float n[3], const float v_prev[3], const float v_curr[3]);
MINLINE void star_m3_v3(float rmat[3][3],float a[3]);
/*********************************** Length **********************************/

@ -35,29 +35,42 @@
* \brief Filling meshes.
*/
/**
* \attention Defined in scanfill.c
*/
extern struct ListBase fillvertbase;
extern struct ListBase filledgebase;
extern struct ListBase fillfacebase;
struct ScanFillVert;
#ifdef __cplusplus
extern "C" {
#endif
typedef struct ScanFillContext
{
ListBase fillvertbase;
ListBase filledgebase;
ListBase fillfacebase;
/* simple optimization for allocating thousands of small memory blocks
* only to be used within loops, and not by one function at a time
* free in the end, with argument '-1'
*/
#define MEM_ELEM_BLOCKSIZE 16384
struct mem_elements *melem__cur;
int melem__offs; /* the current free address */
ListBase melem__lb;
/* private */
struct ScanFillVertLink *_scdata;
} ScanFillContext;
/* note; changing this also might affect the undo copy in editmesh.c */
typedef struct ScanFillVert
{
struct ScanFillVert *next, *prev;
union {
struct ScanFillVert *v;
void *p;
intptr_t l;
void *p;
intptr_t l;
} tmp;
float co[3]; /*vertex location */
float co[3]; /* vertex location */
float xy[2]; /* 2D copy of vertex location (using dominant axis) */
int keyindex; /* original index #, for restoring key information */
short poly_nr;
unsigned char f, h;
@ -78,16 +91,14 @@ typedef struct ScanFillFace
} ScanFillFace;
/* scanfill.c: used in displist only... */
struct ScanFillVert *BLI_addfillvert(const float vec[3]);
struct ScanFillEdge *BLI_addfilledge(struct ScanFillVert *v1, struct ScanFillVert *v2);
struct ScanFillVert *BLI_addfillvert(ScanFillContext *sf_ctx, const float vec[3]);
struct ScanFillEdge *BLI_addfilledge(ScanFillContext *sf_ctx, struct ScanFillVert *v1, struct ScanFillVert *v2);
/* Optionally set ScanFillEdge f to this to mark original boundary edges.
* Only needed if there are internal diagonal edges passed to BLI_edgefill. */
#define FILLBOUNDARY 1
int BLI_begin_edgefill(void);
int BLI_edgefill(short mat_nr);
void BLI_end_edgefill(void);
int BLI_begin_edgefill(ScanFillContext *sf_ctx);
int BLI_edgefill(ScanFillContext *sf_ctx, const short do_quad_tri_speedup);
int BLI_edgefill_ex(ScanFillContext *sf_ctx, const short do_quad_tri_speedup,
const float nor_proj[3]);
void BLI_end_edgefill(ScanFillContext *sf_ctx);
/* These callbacks are needed to make the lib finction properly */
@ -109,8 +120,6 @@ void BLI_setErrorCallBack(void (*f)(const char*));
*/
void BLI_setInterruptCallBack(int (*f)(void));
void BLI_scanfill_free(void);
#ifdef __cplusplus
}
#endif

@ -76,7 +76,6 @@ int BLI_system_thread_count(void); /* gets the number of threads the system can
#define LOCK_OPENGL 5
#define LOCK_NODES 6
#define LOCK_MOVIECLIP 7
#define LOCK_SCANFILL 8
void BLI_lock_thread(int type);
void BLI_unlock_thread(int type);

@ -33,28 +33,30 @@
* \brief Compatibility-like things for windows.
*/
#ifdef _WIN32
#ifndef FREE_WINDOWS
#pragma warning(once: 4761 4305 4244 4018)
#else
#ifdef WINVER
#undef WINVER
#ifndef _WIN32
# error "This include is for Windows only!"
#endif
#ifndef FREE_WINDOWS
# pragma warning(once: 4761 4305 4244 4018)
#else
# ifdef WINVER
# undef WINVER
# endif
/* Some stuff requires WINVER 0x500, but mingw's default is 0x400 */
#define WINVER 0x0501
# define WINVER 0x0501
#endif
#define WIN32_LEAN_AND_MEAN
#ifndef WIN32_SKIP_HKEY_PROTECTION
#undef HKEY
#define HKEY WIN32_HKEY // prevent competing definitions
#include <windows.h>
#undef HKEY
# undef HKEY
# define HKEY WIN32_HKEY // prevent competing definitions
# include <windows.h>
# undef HKEY
#else
#include <windows.h>
# include <windows.h>
#endif
#undef near
@ -83,10 +85,10 @@ extern "C" {
#define MAXPATHLEN MAX_PATH
#ifndef S_ISREG
#define S_ISREG(x) (((x)&_S_IFREG) == _S_IFREG)
# define S_ISREG(x) (((x)&_S_IFREG) == _S_IFREG)
#endif
#ifndef S_ISDIR
#define S_ISDIR(x) (((x)&_S_IFDIR) == _S_IFDIR)
# define S_ISDIR(x) (((x)&_S_IFDIR) == _S_IFDIR)
#endif
/* defines for using ISO C++ conformant names */
@ -98,21 +100,21 @@ typedef unsigned int mode_t;
/* use functions that take a 64 bit offset for files larger than 4GB */
#ifndef FREE_WINDOWS
#include <stdio.h>
#define fseek(stream, offset, origin) _fseeki64(stream, offset, origin)
#define ftell(stream) _ftelli64(stream)
#define lseek(fd, offset, origin) _lseeki64(fd, offset, origin)
#define tell(fd) _telli64(fd)
# include <stdio.h>
# define fseek(stream, offset, origin) _fseeki64(stream, offset, origin)
# define ftell(stream) _ftelli64(stream)
# define lseek(fd, offset, origin) _lseeki64(fd, offset, origin)
# define tell(fd) _telli64(fd)
#endif
/* mingw using _SSIZE_T_ to declare ssize_t type */
#ifndef _SSIZE_T_
#define _SSIZE_T_
# define _SSIZE_T_
/* python uses HAVE_SSIZE_T */
#ifndef HAVE_SSIZE_T
#define HAVE_SSIZE_T 1
# ifndef HAVE_SSIZE_T
# define HAVE_SSIZE_T 1
typedef long ssize_t;
#endif
# endif
#endif
struct dirent {
@ -148,7 +150,5 @@ int BLI_getInstallationDir(char *str);
}
#endif
#endif /* _WIN32 */
#endif /* __BLI_WINSTUFF_H__ */

@ -43,16 +43,16 @@
#ifdef WIN32
#include <io.h>
#include "BLI_winstuff.h"
#include "BLI_callbacks.h"
#include "utf_winfunc.h"
#include "utfconv.h"
# include "BLI_winstuff.h"
# include "BLI_callbacks.h"
# include "utf_winfunc.h"
# include "utfconv.h"
#else
#include <unistd.h> // for read close
#include <sys/param.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/stat.h>
# include <unistd.h> // for read close
# include <sys/param.h>
# include <dirent.h>
# include <unistd.h>
# include <sys/stat.h>
#endif
#include "MEM_guardedalloc.h"

@ -92,7 +92,7 @@ MINLINE float saasinf(float fac)
MINLINE float sasqrtf(float fac)
{
if (fac <= 0.0f) return 0.0f;
return (float)sqrtf(fac);
return sqrtf(fac);
}
MINLINE float interpf(float target, float origin, float fac)

@ -480,6 +480,17 @@ MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
r[2] = a[0] * b[1] - a[1] * b[0];
}
/* Newell's Method */
/* excuse this fairly spesific function,
* its used for polygon normals all over the place
* could use a better name */
MINLINE void add_newell_cross_v3_v3v3(float n[3], const float v_prev[3], const float v_curr[3])
{
n[0] += (v_prev[1] - v_curr[1]) * (v_prev[2] + v_curr[2]);
n[1] += (v_prev[2] - v_curr[2]) * (v_prev[0] + v_curr[0]);
n[2] += (v_prev[0] - v_curr[0]) * (v_prev[1] + v_curr[1]);
}
MINLINE void star_m3_v3(float rmat[][3], float a[3])
{
rmat[0][0] = rmat[1][1] = rmat[2][2] = 0.0;
@ -505,7 +516,7 @@ MINLINE float len_squared_v3(const float v[3])
MINLINE float len_v2(const float v[2])
{
return (float)sqrtf(v[0] * v[0] + v[1] * v[1]);
return sqrtf(v[0] * v[0] + v[1] * v[1]);
}
MINLINE float len_v2v2(const float v1[2], const float v2[2])
@ -514,7 +525,7 @@ MINLINE float len_v2v2(const float v1[2], const float v2[2])
x = v1[0] - v2[0];
y = v1[1] - v2[1];
return (float)sqrtf(x * x + y * y);
return sqrtf(x * x + y * y);
}
MINLINE float len_v3(const float a[3])

@ -119,6 +119,8 @@ void rng_shuffleArray(RNG *rng, void *data, int elemSize, int numElems)
temp = malloc(elemSize);
/* XXX Shouldnt it rather be "while (i--) {" ?
* Else we have no guaranty first (0) element has a chance to be shuffled... --mont29 */
while (--i) {
int j = rng_getInt(rng)%numElems;
if (i!=j) {

File diff suppressed because it is too large Load Diff

@ -68,20 +68,17 @@
#include <fcntl.h>
#include <string.h> /* strcpy etc.. */
#ifndef WIN32
#include <sys/ioctl.h>
#include <unistd.h> /* */
#include <pwd.h>
#endif
#ifdef WIN32
#include <io.h>
#include <direct.h>
#include "BLI_winstuff.h"
#include "utfconv.h"
# include <io.h>
# include <direct.h>
# include "BLI_winstuff.h"
# include "utfconv.h"
#else
# include <sys/ioctl.h>
# include <unistd.h>
# include <pwd.h>
#endif
/* lib includes */
#include "MEM_guardedalloc.h"
@ -554,6 +551,7 @@ void BLI_file_free_lines(LinkNode *lines)
BLI_linklist_free(lines, (void(*)(void*)) MEM_freeN);
}
/** is file1 older then file2 */
int BLI_file_older(const char *file1, const char *file2)
{
#ifdef WIN32

@ -115,7 +115,6 @@ static pthread_mutex_t _rcache_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t _opengl_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t _nodes_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t _movieclip_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t _scanfill_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_t mainid;
static int thread_levels= 0; /* threads can be invoked inside threads */
@ -354,8 +353,6 @@ void BLI_lock_thread(int type)
pthread_mutex_lock(&_nodes_lock);
else if (type==LOCK_MOVIECLIP)
pthread_mutex_lock(&_movieclip_lock);
else if (type == LOCK_SCANFILL)
pthread_mutex_lock(&_scanfill_lock);
}
void BLI_unlock_thread(int type)
@ -376,8 +373,6 @@ void BLI_unlock_thread(int type)
pthread_mutex_unlock(&_nodes_lock);
else if (type==LOCK_MOVIECLIP)
pthread_mutex_unlock(&_movieclip_lock);
else if (type == LOCK_SCANFILL)
pthread_mutex_unlock(&_scanfill_lock);
}
/* Mutex Locks */

@ -47,7 +47,7 @@ typedef struct MemFile {
} MemFile;
/* actually only used writefile.c */
extern void add_memfilechunk(MemFile *compare, MemFile *current, char *buf, unsigned int size);
extern void add_memfilechunk(MemFile *compare, MemFile *current, const char *buf, unsigned int size);
/* exports */
extern void BLO_free_memfile(MemFile *memfile);

@ -37,7 +37,7 @@ struct MemFile;
struct Main;
struct ReportList;
extern int BLO_write_file(struct Main *mainvar, const char *filepath, int write_flags, struct ReportList *reports, int *thumb);
extern int BLO_write_file(struct Main *mainvar, const char *filepath, int write_flags, struct ReportList *reports, const int *thumb);
extern int BLO_write_file_mem(struct Main *mainvar, struct MemFile *compare, struct MemFile *current, int write_flags);
#define BLEN_THUMB_SIZE 128

@ -64,8 +64,8 @@
#include "BLO_sys_types.h" // needed for intptr_t
#ifdef _WIN32
#include "BLI_winstuff.h"
#ifdef WIN32
# include "BLI_winstuff.h"
#endif
/* local prototypes --------------------- */

@ -42,11 +42,11 @@
#include <stdarg.h> /* for va_start/end */
#ifndef WIN32
#include <unistd.h> // for read close
# include <unistd.h> // for read close
#else
#include <io.h> // for open close read
#include "winsock2.h"
#include "BLI_winstuff.h"
# include <io.h> // for open close read
# include "winsock2.h"
# include "BLI_winstuff.h"
#endif
/* allow readfile to use deprecated functionality */
@ -7861,32 +7861,6 @@ static void do_versions_nodetree_socket_use_flags_2_62(bNodeTree *ntree)
}
}
/* set the SOCK_AUTO_HIDDEN flag on collapsed nodes */
static void do_versions_nodetree_socket_auto_hidden_flags_2_62(bNodeTree *ntree)
{
bNode *node;
bNodeSocket *sock;
for (node=ntree->nodes.first; node; node=node->next) {
if (node->flag & NODE_HIDDEN) {
for (sock=node->inputs.first; sock; sock=sock->next) {
if (sock->link==NULL)
sock->flag |= SOCK_AUTO_HIDDEN;
}
for (sock=node->outputs.first; sock; sock= sock->next) {
if (nodeCountSocketLinks(ntree, sock)==0)
sock->flag |= SOCK_AUTO_HIDDEN;
}
}
else {
for (sock=node->inputs.first; sock; sock= sock->next)
sock->flag &= ~SOCK_AUTO_HIDDEN;
for (sock=node->outputs.first; sock; sock= sock->next)
sock->flag &= ~SOCK_AUTO_HIDDEN;
}
}
}
static void do_versions_nodetree_multi_file_output_format_2_62_1(Scene *sce, bNodeTree *ntree)
{
bNode *node;
@ -13309,38 +13283,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
}
{
/* set the SOCK_AUTO_HIDDEN flag on collapsed nodes */
Scene *sce;
Material *mat;
Tex *tex;
Lamp *lamp;
World *world;
bNodeTree *ntree;
for (sce=main->scene.first; sce; sce=sce->id.next)
if (sce->nodetree)
do_versions_nodetree_socket_auto_hidden_flags_2_62(sce->nodetree);
for (mat=main->mat.first; mat; mat=mat->id.next)
if (mat->nodetree)
do_versions_nodetree_socket_auto_hidden_flags_2_62(mat->nodetree);
for (tex=main->tex.first; tex; tex=tex->id.next)
if (tex->nodetree)
do_versions_nodetree_socket_auto_hidden_flags_2_62(tex->nodetree);
for (lamp=main->lamp.first; lamp; lamp=lamp->id.next)
if (lamp->nodetree)
do_versions_nodetree_socket_auto_hidden_flags_2_62(lamp->nodetree);
for (world=main->world.first; world; world=world->id.next)
if (world->nodetree)
do_versions_nodetree_socket_auto_hidden_flags_2_62(world->nodetree);
for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next)
do_versions_nodetree_socket_auto_hidden_flags_2_62(ntree);
}
}
if (main->versionfile < 261 || (main->versionfile == 261 && main->subversionfile < 2))
@ -13512,6 +13454,30 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
if (main->versionfile < 262 || (main->versionfile == 262 && main->subversionfile < 4))
{
/* Read Viscosity presets from older files */
Object *ob;
for (ob = main->object.first; ob; ob = ob->id.next) {
ModifierData *md;
for (md = ob->modifiers.first; md; md = md->next) {
if (md->type == eModifierType_Fluidsim) {
FluidsimModifierData *fmd = (FluidsimModifierData *)md;
if(fmd->fss->viscosityMode == 3) {
fmd->fss->viscosityValue = 5.0;
fmd->fss->viscosityExponent = 5;
}
else if(fmd->fss->viscosityMode == 4) {
fmd->fss->viscosityValue = 2.0;
fmd->fss->viscosityExponent = 3;
}
}
}
}
}
{
/* Default for old files is to save particle rotations to pointcache */

@ -39,10 +39,10 @@
#include <errno.h>
#ifdef WIN32
#include <io.h> // read, open
#include "BLI_winstuff.h"
# include <io.h> // read, open
# include "BLI_winstuff.h"
#else // ! WIN32
#include <unistd.h> // read
# include <unistd.h> // read
#endif
#include "BLO_readfile.h"

@ -85,9 +85,11 @@ void BLO_merge_memfile(MemFile *first, MemFile *second)
BLO_free_memfile(first);
}
static int my_memcmp(int *mem1, int *mem2, int len)
static int my_memcmp(const int *mem1, const int *mem2, const int len)
{
register int a= len, *mema= mem1, *memb= mem2;
register int a = len;
register const int *mema = mem1;
register const int *memb = mem2;
while (a--) {
if ( *mema != *memb) return 1;
@ -97,7 +99,7 @@ static int my_memcmp(int *mem1, int *mem2, int len)
return 0;
}
void add_memfilechunk(MemFile *compare, MemFile *current, char *buf, unsigned int size)
void add_memfilechunk(MemFile *compare, MemFile *current, const char *buf, unsigned int size)
{
static MemFileChunk *compchunk=NULL;
MemFileChunk *curchunk;
@ -121,7 +123,7 @@ void add_memfilechunk(MemFile *compare, MemFile *current, char *buf, unsigned in
/* we compare compchunk with buf */
if (compchunk) {
if (compchunk->size == curchunk->size) {
if ( my_memcmp((int *)compchunk->buf, (int *)buf, size/4)==0) {
if (my_memcmp((int *)compchunk->buf, (const int *)buf, size / 4) == 0) {
curchunk->buf= compchunk->buf;
curchunk->ident= 1;
}

@ -81,12 +81,12 @@ Any case: direct data is ALWAYS after the lib block
#include "zlib.h"
#ifndef WIN32
#include <unistd.h>
# include <unistd.h>
#else
#include "winsock2.h"
#include <io.h>
#include <process.h> // for getpid
#include "BLI_winstuff.h"
# include "winsock2.h"
# include <io.h>
# include <process.h> // for getpid
# include "BLI_winstuff.h"
#endif
/* allow writefile to use deprecated functionality (for forward compatibility code) */
@ -205,7 +205,7 @@ static WriteData *writedata_new(int file)
return wd;
}
static void writedata_do_write(WriteData *wd, void *mem, int memlen)
static void writedata_do_write(WriteData *wd, const void *mem, int memlen)
{
if ((wd == NULL) || wd->error || (mem == NULL) || memlen < 1) return;
if (wd->error) return;
@ -240,7 +240,7 @@ static void writedata_free(WriteData *wd)
#define MYWRITE_FLUSH NULL
static void mywrite( WriteData *wd, void *adr, int len)
static void mywrite( WriteData *wd, const void *adr, int len)
{
if (wd->error) return;
@ -266,7 +266,7 @@ static void mywrite( WriteData *wd, void *adr, int len)
do {
int writelen= MIN2(len, MYWRITE_MAX_CHUNK);
writedata_do_write(wd, adr, writelen);
adr = (char*)adr + writelen;
adr = (const char *)adr + writelen;
len -= writelen;
} while (len > 0);
@ -355,22 +355,22 @@ static void writestruct(WriteData *wd, int filecode, const char *structname, int
mywrite(wd, adr, bh.len);
}
static void writedata(WriteData *wd, int filecode, int len, void *adr) /* do not use for structs */
static void writedata(WriteData *wd, int filecode, int len, const void *adr) /* do not use for structs */
{
BHead bh;
if (adr==NULL) return;
if (len==0) return;
len+= 3;
len-= ( len % 4);
len += 3;
len -= (len % 4);
/* init BHead */
bh.code= filecode;
bh.old= adr;
bh.nr= 1;
bh.SDNAnr= 0;
bh.len= len;
bh.code = filecode;
bh.old = (void *)adr; /* this is safe to cast from const */
bh.nr = 1;
bh.SDNAnr = 0;
bh.len = len;
mywrite(wd, &bh, sizeof(BHead));
if (len) mywrite(wd, adr, len);
@ -2976,7 +2976,7 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar)
* second are an RGBA image (unsigned char)
* note, this uses 'TEST' since new types will segfault on file load for older blender versions.
*/
static void write_thumb(WriteData *wd, int *img)
static void write_thumb(WriteData *wd, const int *img)
{
if (img)
writedata(wd, TEST, (2 + img[0] * img[1]) * sizeof(int), img);
@ -2984,7 +2984,7 @@ static void write_thumb(WriteData *wd, int *img)
/* if MemFile * there's filesave to memory */
static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFile *current,
int write_user_block, int write_flags, int *thumb)
int write_user_block, int write_flags, const int *thumb)
{
BHead bhead;
ListBase mainlist;
@ -3093,7 +3093,7 @@ static int do_history(const char *name, ReportList *reports)
}
/* return: success (1) */
int BLO_write_file(Main *mainvar, const char *filepath, int write_flags, ReportList *reports, int *thumb)
int BLO_write_file(Main *mainvar, const char *filepath, int write_flags, ReportList *reports, const int *thumb)
{
char userfilename[FILE_MAX];
char tempname[FILE_MAX+1];

@ -202,7 +202,7 @@ extern "C" {
#include "DNA_customdata_types.h" /* BMesh struct in bmesh_class.h uses */
#include <stdlib.h>
// #include "BLI_utildefines.h"
#include <stdio.h>
#include "bmesh_class.h"

@ -495,7 +495,7 @@ void BMO_remove_tagged_faces(BMesh *bm, const short oflag)
BMFace *f;
BMIter iter;
BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
if (BMO_elem_flag_test(bm, f, oflag)) {
BM_face_kill(bm, f);
}
@ -507,7 +507,7 @@ void BMO_remove_tagged_edges(BMesh *bm, const short oflag)
BMEdge *e;
BMIter iter;
BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (BMO_elem_flag_test(bm, e, oflag)) {
BM_edge_kill(bm, e);
}
@ -519,7 +519,7 @@ void BMO_remove_tagged_verts(BMesh *bm, const short oflag)
BMVert *v;
BMIter iter;
BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test(bm, v, oflag)) {
BM_vert_kill(bm, v);
}
@ -545,14 +545,14 @@ static void bmo_remove_tagged_context_verts(BMesh *bm, const short oflag)
BMIter iter;
BMIter itersub;
BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test(bm, v, oflag)) {
/* Visit edge */
BM_ITER(e, &itersub, bm, BM_EDGES_OF_VERT, v) {
BM_ITER_ELEM (e, &itersub, v, BM_EDGES_OF_VERT) {
BMO_elem_flag_enable(bm, e, oflag);
}
/* Visit face */
BM_ITER(f, &itersub, bm, BM_FACES_OF_VERT, v) {
BM_ITER_ELEM (f, &itersub, v, BM_FACES_OF_VERT) {
BMO_elem_flag_enable(bm, f, oflag);
}
}
@ -571,9 +571,9 @@ static void bmo_remove_tagged_context_edges(BMesh *bm, const short oflag)
BMIter iter;
BMIter itersub;
BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (BMO_elem_flag_test(bm, e, oflag)) {
BM_ITER(f, &itersub, bm, BM_FACES_OF_EDGE, e) {
BM_ITER_ELEM (f, &itersub, e, BM_FACES_OF_EDGE) {
BMO_elem_flag_enable(bm, f, oflag);
}
}
@ -610,7 +610,7 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
case DEL_EDGES:
{
/* flush down to vert */
BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
if (BMO_elem_flag_test(bm, e, oflag)) {
BMO_elem_flag_enable(bm, e->v1, oflag);
BMO_elem_flag_enable(bm, e->v2, oflag);
@ -618,7 +618,7 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
}
bmo_remove_tagged_context_edges(bm, oflag);
/* remove loose vertice */
BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test(bm, v, oflag) && (!(v->e)))
BMO_elem_flag_enable(bm, v, DEL_WIREVERT);
}
@ -649,7 +649,7 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
case DEL_FACES:
{
/* go through and mark all edges and all verts of all faces for delet */
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
if (BMO_elem_flag_test(bm, f, oflag)) {
for (e = BM_iter_new(&eiter, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&eiter))
BMO_elem_flag_enable(bm, e, oflag);
@ -658,7 +658,7 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
}
}
/* now go through and mark all remaining faces all edges for keeping */
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
if (!BMO_elem_flag_test(bm, f, oflag)) {
for (e = BM_iter_new(&eiter, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&eiter)) {
BMO_elem_flag_disable(bm, e, oflag);
@ -669,7 +669,7 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
}
}
/* also mark all the vertices of remaining edges for keeping */
BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
if (!BMO_elem_flag_test(bm, e, oflag)) {
BMO_elem_flag_disable(bm, e->v1, oflag);
BMO_elem_flag_disable(bm, e->v2, oflag);
@ -687,13 +687,13 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
case DEL_ALL:
{
/* does this option even belong in here? */
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
BMO_elem_flag_enable(bm, f, oflag);
}
BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
BMO_elem_flag_enable(bm, e, oflag);
}
BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
BMO_elem_flag_enable(bm, v, oflag);
}

@ -80,7 +80,7 @@ BMVert *BM_vert_create(BMesh *bm, const float co[3], const BMVert *example)
BM_elem_attrs_copy(bm, bm, example, v);
}
BM_CHECK_ELEMENT(bm, v);
BM_CHECK_ELEMENT(v);
return v;
}
@ -122,7 +122,7 @@ BMEdge *BM_edge_create(BMesh *bm, BMVert *v1, BMVert *v2, const BMEdge *example,
if (example)
BM_elem_attrs_copy(bm, bm, example, e);
BM_CHECK_ELEMENT(bm, e);
BM_CHECK_ELEMENT(e);
return e;
}
@ -314,12 +314,12 @@ BMFace *BM_face_create(BMesh *bm, BMVert **verts, BMEdge **edges, const int len,
f->len = len;
BM_CHECK_ELEMENT(bm, f);
BM_CHECK_ELEMENT(f);
return f;
}
int bmesh_elem_check(BMesh *UNUSED(bm), void *element, const char htype)
int bmesh_elem_check(void *element, const char htype)
{
BMHeader *head = element;
int err = 0;
@ -555,7 +555,7 @@ void BM_face_kill(BMesh *bm, BMFace *f)
BMLoopList *ls, *ls_next;
#endif
BM_CHECK_ELEMENT(bm, f);
BM_CHECK_ELEMENT(f);
#ifdef USE_BMESH_HOLES
for (ls = f->loops.first; ls; ls = ls_next)
@ -658,9 +658,9 @@ static int bm_loop_length(BMLoop *l)
*/
static int bm_loop_reverse_loop(BMesh *bm, BMFace *f
#ifdef USE_BMESH_HOLES
, BMLoopList *lst
, BMLoopList *lst
#endif
)
)
{
#ifdef USE_BMESH_HOLES
@ -733,15 +733,15 @@ static int bm_loop_reverse_loop(BMesh *bm, BMFace *f
/* validate radia */
for (i = 0, l_iter = l_first; i < len; i++, l_iter = l_iter->next) {
BM_CHECK_ELEMENT(bm, l_iter);
BM_CHECK_ELEMENT(bm, l_iter->e);
BM_CHECK_ELEMENT(bm, l_iter->v);
BM_CHECK_ELEMENT(bm, l_iter->f);
BM_CHECK_ELEMENT(l_iter);
BM_CHECK_ELEMENT(l_iter->e);
BM_CHECK_ELEMENT(l_iter->v);
BM_CHECK_ELEMENT(l_iter->f);
}
BLI_array_free(edar);
BM_CHECK_ELEMENT(bm, f);
BM_CHECK_ELEMENT(f);
return 1;
}
@ -755,7 +755,7 @@ int bmesh_loop_reverse(BMesh *bm, BMFace *f)
#endif
}
static void bm_elements_systag_enable(BMesh *UNUSED(bm), void *veles, int tot, int flag)
static void bm_elements_systag_enable(void *veles, int tot, int flag)
{
BMHeader **eles = veles;
int i;
@ -765,7 +765,7 @@ static void bm_elements_systag_enable(BMesh *UNUSED(bm), void *veles, int tot, i
}
}
static void bm_elements_systag_disable(BMesh *UNUSED(bm), void *veles, int tot, int flag)
static void bm_elements_systag_disable(void *veles, int tot, int flag)
{
BMHeader **eles = veles;
int i;
@ -775,7 +775,7 @@ static void bm_elements_systag_disable(BMesh *UNUSED(bm), void *veles, int tot,
}
}
#define FACE_MARK (1 << 10)
#define FACE_MARK (1 << 10)
static int count_flagged_radial(BMesh *bm, BMLoop *l, int flag)
{
@ -814,8 +814,7 @@ static int UNUSED_FUNCTION(count_flagged_disk)(BMVert *v, int flag)
do {
i += BM_ELEM_API_FLAG_TEST(e, flag) ? 1 : 0;
e = bmesh_disk_edge_next(e, v);
} while (e != v->e);
} while ((e = bmesh_disk_edge_next(e, v)) != v->e);
return i;
}
@ -893,7 +892,7 @@ BMFace *BM_faces_join(BMesh *bm, BMFace **faces, int totface, const short do_del
if (totface == 1)
return faces[0];
bm_elements_systag_enable(bm, faces, totface, _FLAG_JF);
bm_elements_systag_enable(faces, totface, _FLAG_JF);
for (i = 0; i < totface; i++) {
f = faces[i];
@ -1012,7 +1011,7 @@ BMFace *BM_faces_join(BMesh *bm, BMFace **faces, int totface, const short do_del
} while ((l_iter = l_iter->next) != l_first);
}
bm_elements_systag_disable(bm, faces, totface, _FLAG_JF);
bm_elements_systag_disable(faces, totface, _FLAG_JF);
BM_ELEM_API_FLAG_DISABLE(newf, _FLAG_JF);
/* handle multi-res data */
@ -1046,11 +1045,11 @@ BMFace *BM_faces_join(BMesh *bm, BMFace **faces, int totface, const short do_del
BLI_array_free(deledges);
BLI_array_free(delverts);
BM_CHECK_ELEMENT(bm, newf);
BM_CHECK_ELEMENT(newf);
return newf;
error:
bm_elements_systag_disable(bm, faces, totface, _FLAG_JF);
bm_elements_systag_disable(faces, totface, _FLAG_JF);
BLI_array_free(edges);
BLI_array_free(deledges);
BLI_array_free(delverts);
@ -1092,13 +1091,13 @@ static BMFace *bm_face_create__sfme(BMesh *bm, BMFace *UNUSED(example))
* \par Examples:
*
* Before: After:
* ---------- ----------
* +--------+ +--------+
* | | | |
* | | | f1 |
* v1 f1 v2 v1======v2
* | | | f2 |
* | | | |
* ---------- ----------
* +--------+ +--------+
*
* \note the input vertices can be part of the same edge. This will
* result in a two edged face. This is desirable for advanced construction
@ -1174,17 +1173,17 @@ BMFace *bmesh_sfme(BMesh *bm, BMFace *f, BMVert *v1, BMVert *v2,
l_iter = l_first = f1loop;
first_loop_f1 = 0;
do {
if(l_iter == f->l_first)
if (l_iter == f->l_first)
first_loop_f1 = 1;
} while ((l_iter = l_iter->next) != l_first);
if(first_loop_f1) {
if (first_loop_f1) {
/* original first loop was in f1, find a suitable first loop for f2
which is as similar as possible to f1. the order matters for tools
such as duplifaces. */
if(f->l_first->prev == f1loop)
if (f->l_first->prev == f1loop)
f2->l_first = f2loop->prev;
else if(f->l_first->next == f1loop)
else if (f->l_first->next == f1loop)
f2->l_first = f2loop->next;
else
f2->l_first = f2loop;
@ -1193,9 +1192,9 @@ BMFace *bmesh_sfme(BMesh *bm, BMFace *f, BMVert *v1, BMVert *v2,
/* original first loop was in f2, further do same as above */
f2->l_first = f->l_first;
if(f->l_first->prev == f2loop)
if (f->l_first->prev == f2loop)
f->l_first = f1loop->prev;
else if(f->l_first->next == f2loop)
else if (f->l_first->next == f2loop)
f->l_first = f1loop->next;
else
f->l_first = f1loop;
@ -1243,9 +1242,9 @@ BMFace *bmesh_sfme(BMesh *bm, BMFace *f, BMVert *v1, BMVert *v2,
}
#endif
BM_CHECK_ELEMENT(bm, e);
BM_CHECK_ELEMENT(bm, f);
BM_CHECK_ELEMENT(bm, f2);
BM_CHECK_ELEMENT(e);
BM_CHECK_ELEMENT(f);
BM_CHECK_ELEMENT(f2);
return f2;
}
@ -1391,10 +1390,10 @@ BMVert *bmesh_semv(BMesh *bm, BMVert *tv, BMEdge *e, BMEdge **r_e)
BMESH_ASSERT(l->e != l->next->e);
/* verify loop cycle for kloop-> */
BM_CHECK_ELEMENT(bm, l);
BM_CHECK_ELEMENT(bm, l->v);
BM_CHECK_ELEMENT(bm, l->e);
BM_CHECK_ELEMENT(bm, l->f);
BM_CHECK_ELEMENT(l);
BM_CHECK_ELEMENT(l->v);
BM_CHECK_ELEMENT(l->e);
BM_CHECK_ELEMENT(l->f);
}
/* verify loop->v and loop->next->v pointers for ne */
for (i = 0, l = ne->l; i < radlen; i++, l = l->radial_next) {
@ -1406,18 +1405,18 @@ BMVert *bmesh_semv(BMesh *bm, BMVert *tv, BMEdge *e, BMEdge **r_e)
BMESH_ASSERT(l->v != l->next->v);
BMESH_ASSERT(l->e != l->next->e);
BM_CHECK_ELEMENT(bm, l);
BM_CHECK_ELEMENT(bm, l->v);
BM_CHECK_ELEMENT(bm, l->e);
BM_CHECK_ELEMENT(bm, l->f);
BM_CHECK_ELEMENT(l);
BM_CHECK_ELEMENT(l->v);
BM_CHECK_ELEMENT(l->e);
BM_CHECK_ELEMENT(l->f);
}
}
BM_CHECK_ELEMENT(bm, ne);
BM_CHECK_ELEMENT(bm, nv);
BM_CHECK_ELEMENT(bm, ov);
BM_CHECK_ELEMENT(bm, e);
BM_CHECK_ELEMENT(bm, tv);
BM_CHECK_ELEMENT(ne);
BM_CHECK_ELEMENT(nv);
BM_CHECK_ELEMENT(ov);
BM_CHECK_ELEMENT(e);
BM_CHECK_ELEMENT(tv);
if (r_e) *r_e = ne;
return nv;
@ -1561,10 +1560,10 @@ BMEdge *bmesh_jekv(BMesh *bm, BMEdge *ke, BMVert *kv, const short check_edge_dou
edok = bmesh_loop_validate(l->f);
BMESH_ASSERT(edok != FALSE);
BM_CHECK_ELEMENT(bm, l);
BM_CHECK_ELEMENT(bm, l->v);
BM_CHECK_ELEMENT(bm, l->e);
BM_CHECK_ELEMENT(bm, l->f);
BM_CHECK_ELEMENT(l);
BM_CHECK_ELEMENT(l->v);
BM_CHECK_ELEMENT(l->e);
BM_CHECK_ELEMENT(l->f);
}
if (check_edge_double) {
@ -1574,9 +1573,9 @@ BMEdge *bmesh_jekv(BMesh *bm, BMEdge *ke, BMVert *kv, const short check_edge_dou
}
}
BM_CHECK_ELEMENT(bm, ov);
BM_CHECK_ELEMENT(bm, tv);
BM_CHECK_ELEMENT(bm, oe);
BM_CHECK_ELEMENT(ov);
BM_CHECK_ELEMENT(tv);
BM_CHECK_ELEMENT(oe);
return oe;
}
@ -1594,13 +1593,13 @@ BMEdge *bmesh_jekv(BMesh *bm, BMEdge *ke, BMVert *kv, const short check_edge_dou
* \par Examples:
*
* A B
* ---------- ----------
* +--------+ +--------+
* | | | |
* | f1 | | f1 |
* v1========v2 = Ok! v1==V2==v3 == Wrong!
* | f2 | | f2 |
* | | | |
* ---------- ----------
* +--------+ +--------+
*
* In the example A, faces \a f1 and \a f2 are joined by a single edge,
* and the euler can safely be used.
@ -1617,36 +1616,25 @@ BMEdge *bmesh_jekv(BMesh *bm, BMEdge *ke, BMVert *kv, const short check_edge_dou
BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e)
{
BMLoop *l_iter, *f1loop = NULL, *f2loop = NULL;
int newlen = 0, i, f1len = 0, f2len = 0, radlen = 0, edok, shared;
BMIter iter;
int newlen = 0, i, f1len = 0, f2len = 0, edok;
/* can't join a face to itsel */
/* can't join a face to itself */
if (f1 == f2) {
return NULL;
}
/* validate that edge is 2-manifold edge */
if (!BM_edge_is_manifold(e)) {
return NULL;
}
/* verify that e is in both f1 and f2 */
f1len = f1->len;
f2len = f2->len;
BM_ITER(l_iter, &iter, bm, BM_LOOPS_OF_FACE, f1) {
if (l_iter->e == e) {
f1loop = l_iter;
break;
}
}
BM_ITER(l_iter, &iter, bm, BM_LOOPS_OF_FACE, f2) {
if (l_iter->e == e) {
f2loop = l_iter;
break;
}
}
if (!(f1loop && f2loop)) {
return NULL;
}
/* validate that edge is 2-manifold edg */
radlen = bmesh_radial_length(f1loop);
if (radlen != 2) {
if (!((f1loop = BM_face_edge_share_loop(f1, e)) &&
(f2loop = BM_face_edge_share_loop(f2, e))))
{
return NULL;
}
@ -1657,37 +1645,36 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e)
/* validate that for each face, each vertex has another edge in its disk cycle that is
* not e, and not shared. */
if ( bmesh_radial_face_find(f1loop->next->e, f2) ||
bmesh_radial_face_find(f1loop->prev->e, f2) ||
bmesh_radial_face_find(f2loop->next->e, f1) ||
bmesh_radial_face_find(f2loop->prev->e, f1) )
if (bmesh_radial_face_find(f1loop->next->e, f2) ||
bmesh_radial_face_find(f1loop->prev->e, f2) ||
bmesh_radial_face_find(f2loop->next->e, f1) ||
bmesh_radial_face_find(f2loop->prev->e, f1) )
{
return NULL;
}
/* validate only one shared edg */
shared = BM_face_share_edge_count(f1, f2);
if (shared > 1) {
/* validate only one shared edge */
if (BM_face_share_edge_count(f1, f2) > 1) {
return NULL;
}
/* validate no internal join */
for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f1); i < f1len; i++, l_iter = l_iter->next) {
BM_elem_flag_disable(l_iter->v, BM_ELEM_TAG);
BM_elem_flag_disable(l_iter->v, BM_ELEM_INTERNAL_TAG);
}
for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f2); i < f2len; i++, l_iter = l_iter->next) {
BM_elem_flag_disable(l_iter->v, BM_ELEM_TAG);
BM_elem_flag_disable(l_iter->v, BM_ELEM_INTERNAL_TAG);
}
for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f1); i < f1len; i++, l_iter = l_iter->next) {
if (l_iter != f1loop) {
BM_elem_flag_enable(l_iter->v, BM_ELEM_TAG);
BM_elem_flag_enable(l_iter->v, BM_ELEM_INTERNAL_TAG);
}
}
for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f2); i < f2len; i++, l_iter = l_iter->next) {
if (l_iter != f2loop) {
/* as soon as a duplicate is found, bail out */
if (BM_elem_flag_test(l_iter->v, BM_ELEM_TAG)) {
if (BM_elem_flag_test(l_iter->v, BM_ELEM_INTERNAL_TAG)) {
return NULL;
}
}
@ -1707,7 +1694,7 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e)
/* increase length of f1 */
f1->len += (f2->len - 2);
/* make sure each loop points to the proper fac */
/* make sure each loop points to the proper face */
newlen = f1->len;
for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f1); i < newlen; i++, l_iter = l_iter->next)
l_iter->f = f1;
@ -1730,7 +1717,7 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e)
/* account for both above */
bm->elem_index_dirty |= BM_EDGE | BM_FACE;
BM_CHECK_ELEMENT(bm, f1);
BM_CHECK_ELEMENT(f1);
/* validate the new loop cycle */
edok = bmesh_loop_validate(f1);
@ -1758,7 +1745,7 @@ int BM_vert_splice(BMesh *bm, BMVert *v, BMVert *vtarget)
}
/* retarget all the loops of v to vtarget */
BM_ITER(l, &liter, bm, BM_LOOPS_OF_VERT, v) {
BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
l->v = vtarget;
}
@ -1769,8 +1756,8 @@ int BM_vert_splice(BMesh *bm, BMVert *v, BMVert *vtarget)
bmesh_disk_edge_append(e, vtarget);
}
BM_CHECK_ELEMENT(bm, v);
BM_CHECK_ELEMENT(bm, vtarget);
BM_CHECK_ELEMENT(v);
BM_CHECK_ELEMENT(vtarget);
/* v is unused now, and can be killed */
BM_vert_kill(bm, v);
@ -1804,7 +1791,7 @@ int bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len)
visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, __func__);
maxindex = 0;
BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, v) {
BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
if (BLI_ghash_haskey(visithash, e)) {
continue;
}
@ -1817,7 +1804,7 @@ int bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len)
while ((e = BLI_array_pop(stack))) {
BLI_ghash_insert(visithash, e, SET_INT_IN_POINTER(maxindex));
BM_ITER(l, &liter, bm, BM_LOOPS_OF_EDGE, e) {
BM_ITER_ELEM (l, &liter, e, BM_LOOPS_OF_EDGE) {
nl = (l->v == v) ? l->prev : l->next;
if (!BLI_ghash_haskey(visithash, nl->e)) {
BLI_array_append(stack, nl->e);
@ -1837,7 +1824,7 @@ int bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len)
/* Replace v with the new verts in each group */
#if 0
BM_ITER(l, &liter, bm, BM_LOOPS_OF_VERT, v) {
BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
/* call first since its faster then a hash lookup */
if (l->v != v) {
continue;
@ -1863,20 +1850,21 @@ int bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len)
* bad practice but save alloc'ing a new array - note, the comment above is useful, keep it
* if you are tidying up code - campbell */
BLI_array_empty(stack);
BM_ITER(l, &liter, bm, BM_LOOPS_OF_VERT, v) {
if ((l->v == v) && (i = GET_INT_FROM_POINTER(BLI_ghash_lookup(visithash, l->e)))) {
BM_elem_index_set(l, i); /* would be nice to assign vert here but cant, so assign the vert index */
BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
if (l->v == v) {
BLI_array_append(stack, (BMEdge *)l);
}
}
while ((l = (BMLoop *)(BLI_array_pop(stack)))) {
l->v = verts[BM_elem_index_get(l)];
if ((i = GET_INT_FROM_POINTER(BLI_ghash_lookup(visithash, l->e)))) {
l->v = verts[i];
}
}
#endif
BLI_array_free(stack);
BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, v) {
BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
i = GET_INT_FROM_POINTER(BLI_ghash_lookup(visithash, e));
if (i == 0) {
continue;
@ -1891,7 +1879,7 @@ int bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len)
BLI_ghash_free(visithash, NULL, NULL);
for (i = 0; i < maxindex; i++) {
BM_CHECK_ELEMENT(bm, verts[i]);
BM_CHECK_ELEMENT(verts[i]);
}
if (r_vout_len != NULL) {
@ -1954,8 +1942,8 @@ int BM_edge_splice(BMesh *bm, BMEdge *e, BMEdge *etarget)
BLI_assert(bmesh_radial_length(e->l) == 0);
BM_CHECK_ELEMENT(bm, e);
BM_CHECK_ELEMENT(bm, etarget);
BM_CHECK_ELEMENT(e);
BM_CHECK_ELEMENT(etarget);
/* removes from disks too */
BM_edge_kill(bm, e);
@ -2000,8 +1988,8 @@ int bmesh_edge_separate(BMesh *bm, BMEdge *e, BMLoop *l_sep)
BLI_assert(bmesh_radial_length(e->l) == radlen - 1);
BLI_assert(bmesh_radial_length(ne->l) == 1);
BM_CHECK_ELEMENT(bm, ne);
BM_CHECK_ELEMENT(bm, e);
BM_CHECK_ELEMENT(ne);
BM_CHECK_ELEMENT(e);
return TRUE;
}

@ -327,16 +327,16 @@ static void mdisp_axis_from_quad(float v1[3], float v2[3], float UNUSED(v3[3]),
/* tl is loop to project onto, l is loop whose internal displacement, co, is being
* projected. x and y are location in loop's mdisps grid of point co. */
static int mdisp_in_mdispquad(BMesh *bm, BMLoop *l, BMLoop *tl, float p[3], float *x, float *y,
static int mdisp_in_mdispquad(BMLoop *l, BMLoop *tl, float p[3], float *x, float *y,
int res, float axis_x[3], float axis_y[3])
{
float v1[3], v2[3], c[3], v3[3], v4[3], e1[3], e2[3];
float eps = FLT_EPSILON * 4000;
if (len_v3(l->v->no) == 0.0f)
BM_vert_normal_update_all(bm, l->v);
BM_vert_normal_update_all(l->v);
if (len_v3(tl->v->no) == 0.0f)
BM_vert_normal_update_all(bm, tl->v);
BM_vert_normal_update_all(tl->v);
compute_mdisp_quad(tl, v1, v2, v3, v4, e1, e2);
@ -466,7 +466,7 @@ static void bm_loop_interp_mdisps(BMesh *bm, BMLoop *target, BMFace *source)
md1 = CustomData_bmesh_get(&bm->ldata, target->head.data, CD_MDISPS);
md2 = CustomData_bmesh_get(&bm->ldata, l_iter->head.data, CD_MDISPS);
if (mdisp_in_mdispquad(bm, target, l_iter, co, &x2, &y2, res, src_axis_x, src_axis_y)) {
if (mdisp_in_mdispquad(target, l_iter, co, &x2, &y2, res, src_axis_x, src_axis_y)) {
old_mdisps_bilinear(md1->disps[iy * res + ix], md2->disps, res, (float)x2, (float)y2);
bm_loop_flip_disp(src_axis_x, src_axis_y, axis_x, axis_y, md1->disps[iy * res + ix]);
@ -489,7 +489,7 @@ void BM_face_multires_bounds_smooth(BMesh *bm, BMFace *f)
if (!CustomData_has_layer(&bm->ldata, CD_MDISPS))
return;
BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
MDisps *mdp = CustomData_bmesh_get(&bm->ldata, l->prev->head.data, CD_MDISPS);
MDisps *mdl = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MDISPS);
MDisps *mdn = CustomData_bmesh_get(&bm->ldata, l->next->head.data, CD_MDISPS);
@ -521,7 +521,7 @@ void BM_face_multires_bounds_smooth(BMesh *bm, BMFace *f)
}
}
BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
MDisps *mdl1 = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MDISPS);
MDisps *mdl2;
float co1[3], co2[3], co[3];
@ -726,7 +726,7 @@ static void update_data_blocks(BMesh *bm, CustomData *olddata, CustomData *data)
CustomData_bmesh_init_pool(data, bm->totvert, BM_VERT);
BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
block = NULL;
CustomData_bmesh_set_default(data, &block);
CustomData_bmesh_copy_data(olddata, data, eve->head.data, &block);
@ -739,7 +739,7 @@ static void update_data_blocks(BMesh *bm, CustomData *olddata, CustomData *data)
CustomData_bmesh_init_pool(data, bm->totedge, BM_EDGE);
BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
block = NULL;
CustomData_bmesh_set_default(data, &block);
CustomData_bmesh_copy_data(olddata, data, eed->head.data, &block);
@ -753,8 +753,8 @@ static void update_data_blocks(BMesh *bm, CustomData *olddata, CustomData *data)
BMLoop *l;
CustomData_bmesh_init_pool(data, bm->totloop, BM_LOOP);
BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
block = NULL;
CustomData_bmesh_set_default(data, &block);
CustomData_bmesh_copy_data(olddata, data, l->head.data, &block);
@ -768,7 +768,7 @@ static void update_data_blocks(BMesh *bm, CustomData *olddata, CustomData *data)
CustomData_bmesh_init_pool(data, bm->totface, BM_FACE);
BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
block = NULL;
CustomData_bmesh_set_default(data, &block);
CustomData_bmesh_copy_data(olddata, data, efa->head.data, &block);

@ -83,18 +83,17 @@ void *BM_iter_at_index(BMesh *bm, const char itype, void *data, int index)
* Sometimes its convenient to get the iterator as an array
* to avoid multiple calls to #BM_iter_at_index.
*/
int BM_iter_as_array(BMesh *bm, const char type, void *data, void **array, const int len)
int BM_iter_as_array(BMesh *bm, const char itype, void *data, void **array, const int len)
{
int i = 0;
/* sanity check */
if (len > 0) {
BMIter iter;
void *val;
void *ele;
BM_ITER(val, &iter, bm, type, data) {
array[i] = val;
for (ele = BM_iter_new(&iter, bm, itype, data); ele; ele = BM_iter_step(&iter)) {
array[i] = ele;
i++;
if (i == len) {
return len;

@ -82,14 +82,17 @@ typedef enum BMIterType {
/* the iterator htype for each iterator */
extern const char bm_iter_itype_htype_map[BM_ITYPE_MAX];
#define BM_ITER_MESH(ele, iter, bm, itype) \
for (ele = BM_iter_new(iter, bm, itype, NULL); ele; ele = BM_iter_step(iter))
#define BM_ITER(ele, iter, bm, itype, data) \
ele = BM_iter_new(iter, bm, itype, data); \
for ( ; ele; ele = BM_iter_step(iter))
#define BM_ITER_MESH_INDEX(ele, iter, bm, itype, indexvar) \
for (ele = BM_iter_new(iter, bm, itype, NULL), indexvar = 0; ele; ele = BM_iter_step(iter), (indexvar)++)
#define BM_ITER_INDEX(ele, iter, bm, itype, data, indexvar) \
ele = BM_iter_new(iter, bm, itype, data); \
for (indexvar = 0; ele; indexvar++, ele = BM_iter_step(iter))
#define BM_ITER_ELEM(ele, iter, data, itype) \
for (ele = BM_iter_new(iter, NULL, itype, data); ele; ele = BM_iter_step(iter))
#define BM_ITER_ELEM_INDEX(ele, iter, data, itype, indexvar) \
for (ele = BM_iter_new(iter, NULL, itype, data), indexvar = 0; ele; ele = BM_iter_step(iter), (indexvar)++)
/* Iterator Structure */
typedef struct BMIter {

@ -59,14 +59,20 @@ BLI_INLINE int BM_iter_init(BMIter *iter, BMesh *bm, const char itype, void *dat
/* inlining optimizes out this switch when called with the defined type */
switch ((BMIterType)itype) {
case BM_VERTS_OF_MESH:
BLI_assert(bm != NULL);
BLI_assert(data == NULL);
iter->begin = bmiter__vert_of_mesh_begin;
iter->step = bmiter__vert_of_mesh_step;
break;
case BM_EDGES_OF_MESH:
BLI_assert(bm != NULL);
BLI_assert(data == NULL);
iter->begin = bmiter__edge_of_mesh_begin;
iter->step = bmiter__edge_of_mesh_step;
break;
case BM_FACES_OF_MESH:
BLI_assert(bm != NULL);
BLI_assert(data == NULL);
iter->begin = bmiter__face_of_mesh_begin;
iter->step = bmiter__face_of_mesh_step;
break;
@ -161,10 +167,14 @@ BLI_INLINE int BM_iter_init(BMIter *iter, BMesh *bm, const char itype, void *dat
iter->edata = data;
break;
default:
/* should never happen */
BLI_assert(0);
return FALSE;
break;
}
iter->begin(iter);
return TRUE;
}

@ -84,7 +84,7 @@ void BM_mesh_select_mode_flush(BMesh *bm)
int ok;
if (bm->selectmode & SCE_SELECT_VERTEX) {
BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(e->v1, BM_ELEM_SELECT) &&
BM_elem_flag_test(e->v2, BM_ELEM_SELECT) &&
!BM_elem_flag_test(e, BM_ELEM_HIDDEN))
@ -95,7 +95,7 @@ void BM_mesh_select_mode_flush(BMesh *bm)
BM_elem_flag_disable(e, BM_ELEM_SELECT);
}
}
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
ok = TRUE;
if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
@ -114,7 +114,7 @@ void BM_mesh_select_mode_flush(BMesh *bm)
}
}
else if (bm->selectmode & SCE_SELECT_EDGE) {
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
ok = TRUE;
if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
@ -154,7 +154,7 @@ void BM_mesh_deselect_flush(BMesh *bm)
int ok;
BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
if (!(BM_elem_flag_test(e->v1, BM_ELEM_SELECT) &&
BM_elem_flag_test(e->v2, BM_ELEM_SELECT) &&
!BM_elem_flag_test(e, BM_ELEM_HIDDEN)))
@ -163,7 +163,7 @@ void BM_mesh_deselect_flush(BMesh *bm)
}
}
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
ok = TRUE;
if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
@ -205,7 +205,7 @@ void BM_mesh_select_flush(BMesh *bm)
int ok;
BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(e->v1, BM_ELEM_SELECT) &&
BM_elem_flag_test(e->v2, BM_ELEM_SELECT) &&
!BM_elem_flag_test(e, BM_ELEM_HIDDEN))
@ -214,7 +214,7 @@ void BM_mesh_select_flush(BMesh *bm)
}
}
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
ok = TRUE;
if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
@ -245,8 +245,7 @@ void BM_mesh_select_flush(BMesh *bm)
*/
void BM_vert_select_set(BMesh *bm, BMVert *v, int select)
{
/* BMIter iter; */
/* BMEdge *e; */
BLI_assert(v->head.htype == BM_VERT);
if (BM_elem_flag_test(v, BM_ELEM_HIDDEN)) {
return;
@ -273,6 +272,8 @@ void BM_vert_select_set(BMesh *bm, BMVert *v, int select)
*/
void BM_edge_select_set(BMesh *bm, BMEdge *e, int select)
{
BLI_assert(e->head.htype == BM_EDGE);
if (BM_elem_flag_test(e, BM_ELEM_HIDDEN)) {
return;
}
@ -281,8 +282,8 @@ void BM_edge_select_set(BMesh *bm, BMEdge *e, int select)
if (!BM_elem_flag_test(e, BM_ELEM_SELECT)) bm->totedgesel += 1;
BM_elem_flag_enable(e, BM_ELEM_SELECT);
BM_elem_select_set(bm, e->v1, TRUE);
BM_elem_select_set(bm, e->v2, TRUE);
BM_vert_select_set(bm, e->v1, TRUE);
BM_vert_select_set(bm, e->v2, TRUE);
}
else {
if (BM_elem_flag_test(e, BM_ELEM_SELECT)) bm->totedgesel -= 1;
@ -318,8 +319,8 @@ void BM_edge_select_set(BMesh *bm, BMEdge *e, int select)
}
}
else {
BM_elem_select_set(bm, e->v1, FALSE);
BM_elem_select_set(bm, e->v2, FALSE);
BM_vert_select_set(bm, e->v1, FALSE);
BM_vert_select_set(bm, e->v2, FALSE);
}
}
@ -336,6 +337,8 @@ void BM_face_select_set(BMesh *bm, BMFace *f, int select)
BMLoop *l_iter;
BMLoop *l_first;
BLI_assert(f->head.htype == BM_FACE);
if (BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
return;
}
@ -360,30 +363,30 @@ void BM_face_select_set(BMesh *bm, BMFace *f, int select)
BM_elem_flag_disable(f, BM_ELEM_SELECT);
/* flush down to edges */
BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
BMIter fiter;
BMFace *f2;
BM_ITER(f2, &fiter, bm, BM_FACES_OF_EDGE, l->e) {
BM_ITER_ELEM (f2, &fiter, l->e, BM_FACES_OF_EDGE) {
if (BM_elem_flag_test(f2, BM_ELEM_SELECT))
break;
}
if (!f2) {
BM_elem_select_set(bm, l->e, FALSE);
BM_edge_select_set(bm, l->e, FALSE);
}
}
/* flush down to verts */
BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
BMIter eiter;
BMEdge *e;
BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, l->v) {
BM_ITER_ELEM (e, &eiter, l->v, BM_EDGES_OF_VERT) {
if (BM_elem_flag_test(e, BM_ELEM_SELECT))
break;
}
if (!e) {
BM_elem_select_set(bm, l->v, FALSE);
BM_vert_select_set(bm, l->v, FALSE);
}
}
}
@ -405,10 +408,10 @@ void BM_mesh_select_mode_set(BMesh *bm, int selectmode)
if (bm->selectmode & SCE_SELECT_VERTEX) {
/* disabled because selection flushing handles these */
#if 0
BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
BM_elem_flag_disable(ele, BM_ELEM_SELECT);
}
BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER_MESH (ele, &iter, bm, BM_FACES_OF_MESH) {
BM_elem_flag_disable(ele, BM_ELEM_SELECT);
}
#endif
@ -417,12 +420,12 @@ void BM_mesh_select_mode_set(BMesh *bm, int selectmode)
else if (bm->selectmode & SCE_SELECT_EDGE) {
/* disabled because selection flushing handles these */
#if 0
BM_ITER(ele, &iter, bm, BM_VERTS_OF_MESH, NULL) {
BM_ITER_MESH (ele, &iter, bm, BM_VERTS_OF_MESH) {
BM_elem_flag_disable(ele, BM_ELEM_SELECT);
}
#endif
BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
BM_edge_select_set(bm, (BMEdge *)ele, TRUE);
}
@ -432,11 +435,11 @@ void BM_mesh_select_mode_set(BMesh *bm, int selectmode)
else if (bm->selectmode & SCE_SELECT_FACE) {
/* disabled because selection flushing handles these */
#if 0
BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
BM_elem_flag_disable(ele, BM_ELEM_SELECT);
}
#endif
BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER_MESH (ele, &iter, bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
BM_face_select_set(bm, (BMFace *)ele, TRUE);
}
@ -543,7 +546,7 @@ BMFace *BM_active_face_get(BMesh *bm, int sloppy)
}
/* Last attempt: try to find any selected face */
if (f == NULL) {
BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(f, BM_ELEM_SELECT)) {
break;
}
@ -563,7 +566,7 @@ BMFace *BM_active_face_get(BMesh *bm, int sloppy)
* - #EM_editselection_normal
* - #EM_editselection_plane
*/
void BM_editselection_center(BMesh *bm, float r_center[3], BMEditSelection *ese)
void BM_editselection_center(float r_center[3], BMEditSelection *ese)
{
if (ese->htype == BM_VERT) {
BMVert *eve = (BMVert *)ese->ele;
@ -576,7 +579,7 @@ void BM_editselection_center(BMesh *bm, float r_center[3], BMEditSelection *ese)
}
else if (ese->htype == BM_FACE) {
BMFace *efa = (BMFace *)ese->ele;
BM_face_center_bounds_calc(bm, efa, r_center);
BM_face_center_bounds_calc(efa, r_center);
}
}
@ -621,7 +624,7 @@ void BM_editselection_plane(BMesh *bm, float r_plane[3], BMEditSelection *ese)
float vec[3] = {0.0f, 0.0f, 0.0f};
if (ese->prev) { /* use previously selected data to make a useful vertex plane */
BM_editselection_center(bm, vec, ese->prev);
BM_editselection_center(vec, ese->prev);
sub_v3_v3v3(r_plane, vec, eve->co);
}
else {
@ -890,33 +893,33 @@ void BM_mesh_elem_hflag_enable_all(BMesh *bm, const char htype, const char hflag
/***************** Mesh Hiding stuff *********** */
static void vert_flush_hide_set(BMesh *bm, BMVert *v)
static void vert_flush_hide_set(BMVert *v)
{
BMIter iter;
BMEdge *e;
int hide = TRUE;
BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
BM_ITER_ELEM (e, &iter, v, BM_EDGES_OF_VERT) {
hide = hide && BM_elem_flag_test(e, BM_ELEM_HIDDEN);
}
BM_elem_flag_set(v, BM_ELEM_HIDDEN, hide);
}
static void edge_flush_hide(BMesh *bm, BMEdge *e)
static void edge_flush_hide(BMEdge *e)
{
BMIter iter;
BMFace *f;
int hide = TRUE;
BM_ITER(f, &iter, bm, BM_FACES_OF_EDGE, e) {
BM_ITER_ELEM (f, &iter, e, BM_FACES_OF_EDGE) {
hide = hide && BM_elem_flag_test(f, BM_ELEM_HIDDEN);
}
BM_elem_flag_set(e, BM_ELEM_HIDDEN, hide);
}
void BM_vert_hide_set(BMesh *bm, BMVert *v, int hide)
void BM_vert_hide_set(BMVert *v, int hide)
{
/* vert hiding: vert + surrounding edges and faces */
BMIter iter, fiter;
@ -925,46 +928,46 @@ void BM_vert_hide_set(BMesh *bm, BMVert *v, int hide)
BM_elem_flag_set(v, BM_ELEM_HIDDEN, hide);
BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
BM_ITER_ELEM (e, &iter, v, BM_EDGES_OF_VERT) {
BM_elem_flag_set(e, BM_ELEM_HIDDEN, hide);
BM_ITER(f, &fiter, bm, BM_FACES_OF_EDGE, e) {
BM_ITER_ELEM (f, &fiter, e, BM_FACES_OF_EDGE) {
BM_elem_flag_set(f, BM_ELEM_HIDDEN, hide);
}
}
}
void BM_edge_hide_set(BMesh *bm, BMEdge *e, int hide)
void BM_edge_hide_set(BMEdge *e, int hide)
{
BMIter iter;
BMFace *f;
/* BMVert *v; */
/* edge hiding: faces around the edge */
BM_ITER(f, &iter, bm, BM_FACES_OF_EDGE, e) {
BM_ITER_ELEM (f, &iter, e, BM_FACES_OF_EDGE) {
BM_elem_flag_set(f, BM_ELEM_HIDDEN, hide);
}
BM_elem_flag_set(e, BM_ELEM_HIDDEN, hide);
/* hide vertices if necessary */
vert_flush_hide_set(bm, e->v1);
vert_flush_hide_set(bm, e->v2);
vert_flush_hide_set(e->v1);
vert_flush_hide_set(e->v2);
}
void BM_face_hide_set(BMesh *bm, BMFace *f, int hide)
void BM_face_hide_set(BMFace *f, int hide)
{
BMIter iter;
BMLoop *l;
BM_elem_flag_set(f, BM_ELEM_HIDDEN, hide);
BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
edge_flush_hide(bm, l->e);
BM_ITER_ELEM (l, &iter, f, BM_LOOPS_OF_FACE) {
edge_flush_hide(l->e);
}
BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
vert_flush_hide_set(bm, l->v);
BM_ITER_ELEM (l, &iter, f, BM_LOOPS_OF_FACE) {
vert_flush_hide_set(l->v);
}
}
@ -975,15 +978,15 @@ void _bm_elem_hide_set(BMesh *bm, BMHeader *head, int hide)
switch (head->htype) {
case BM_VERT:
if (hide) BM_vert_select_set(bm, (BMVert *)head, FALSE);
BM_vert_hide_set(bm, (BMVert *)head, hide);
BM_vert_hide_set((BMVert *)head, hide);
break;
case BM_EDGE:
if (hide) BM_edge_select_set(bm, (BMEdge *)head, FALSE);
BM_edge_hide_set(bm, (BMEdge *)head, hide);
BM_edge_hide_set((BMEdge *)head, hide);
break;
case BM_FACE:
if (hide) BM_face_select_set(bm, (BMFace *)head, FALSE);
BM_face_hide_set(bm, (BMFace *)head, hide);
BM_face_hide_set((BMFace *)head, hide);
break;
default:
BMESH_ASSERT(0);

Some files were not shown because too many files have changed in this diff Show More