[Bf-blender-cvs] [9f1ad06] hair_immediate_fixes: Merge branch 'master' into hair_immediate_fixes

Lukas Tönne noreply at git.blender.org
Sat Nov 15 14:47:17 CET 2014


Commit: 9f1ad068e90f324acf0f27ae509679ac85c8e98c
Author: Lukas Tönne
Date:   Sat Nov 15 14:40:23 2014 +0100
Branches: hair_immediate_fixes
https://developer.blender.org/rB9f1ad068e90f324acf0f27ae509679ac85c8e98c

Merge branch 'master' into hair_immediate_fixes

Conflicts:
	source/blender/blenkernel/intern/implicit.c

===================================================================



===================================================================

diff --cc source/blender/physics/intern/implicit_blender.c
index 31655f9,0000000..c903c7b
mode 100644,000000..100644
--- a/source/blender/physics/intern/implicit_blender.c
+++ b/source/blender/physics/intern/implicit_blender.c
@@@ -1,2171 -1,0 +1,2020 @@@
 +/*
 + * ***** BEGIN GPL LICENSE BLOCK *****
 + *
 + * This program is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU General Public License
 + * as published by the Free Software Foundation; either version 2
 + * of the License, or (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, write to the Free Software Foundation,
 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 + *
 + * The Original Code is Copyright (C) Blender Foundation
 + * All rights reserved.
 + *
 + * The Original Code is: all of this file.
 + *
 + * Contributor(s): none yet.
 + *
 + * ***** END GPL LICENSE BLOCK *****
 + */
 +
 +/** \file blender/blenkernel/intern/implicit.c
 + *  \ingroup bph
 + */
 +
 +#include "implicit.h"
 +
 +#ifdef IMPLICIT_SOLVER_BLENDER
 +
 +#include "MEM_guardedalloc.h"
 +
 +#include "DNA_scene_types.h"
 +#include "DNA_object_types.h"
 +#include "DNA_object_force.h"
 +#include "DNA_meshdata_types.h"
 +#include "DNA_texture_types.h"
 +
 +#include "BLI_math.h"
 +#include "BLI_linklist.h"
 +#include "BLI_utildefines.h"
 +
 +#include "BKE_cloth.h"
 +#include "BKE_collision.h"
 +#include "BKE_effect.h"
 +#include "BKE_global.h"
 +
 +#include "BPH_mass_spring.h"
 +
 +#ifdef __GNUC__
 +#  pragma GCC diagnostic ignored "-Wtype-limits"
 +#endif
 +
 +#ifdef _OPENMP
 +#  define CLOTH_OPENMP_LIMIT 512
 +#endif
 +
 +#if 0  /* debug timing */
 +#ifdef _WIN32
 +#include <windows.h>
 +static LARGE_INTEGER _itstart, _itend;
 +static LARGE_INTEGER ifreq;
 +static void itstart(void)
 +{
 +	static int first = 1;
 +	if (first) {
 +		QueryPerformanceFrequency(&ifreq);
 +		first = 0;
 +	}
 +	QueryPerformanceCounter(&_itstart);
 +}
 +static void itend(void)
 +{
 +	QueryPerformanceCounter(&_itend);
 +}
 +double itval(void)
 +{
 +	return ((double)_itend.QuadPart -
 +			(double)_itstart.QuadPart)/((double)ifreq.QuadPart);
 +}
 +#else
 +#include <sys/time.h>
 +// intrinsics need better compile flag checking
 +// #include <xmmintrin.h>
 +// #include <pmmintrin.h>
 +// #include <pthread.h>
 +
 +static struct timeval _itstart, _itend;
 +static struct timezone itz;
 +static void itstart(void)
 +{
 +	gettimeofday(&_itstart, &itz);
 +}
 +static void itend(void)
 +{
 +	gettimeofday(&_itend, &itz);
 +}
 +static double itval(void)
 +{
 +	double t1, t2;
 +	t1 =  (double)_itstart.tv_sec + (double)_itstart.tv_usec/(1000*1000);
 +	t2 =  (double)_itend.tv_sec + (double)_itend.tv_usec/(1000*1000);
 +	return t2-t1;
 +}
 +#endif
 +#endif  /* debug timing */
 +
 +static float I[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
 +static float ZERO[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
 +
 +/*
 +#define C99
 +#ifdef C99
 +#defineDO_INLINE inline 
 +#else 
 +#defineDO_INLINE static 
 +#endif
 +*/
 +struct Cloth;
 +
 +//////////////////////////////////////////
 +/* fast vector / matrix library, enhancements are welcome :) -dg */
 +/////////////////////////////////////////
 +
 +/* DEFINITIONS */
 +typedef float lfVector[3];
 +typedef struct fmatrix3x3 {
 +	float m[3][3]; /* 3x3 matrix */
 +	unsigned int c, r; /* column and row number */
 +	/* int pinned; // is this vertex allowed to move? */
 +	float n1, n2, n3; /* three normal vectors for collision constrains */
 +	unsigned int vcount; /* vertex count */
 +	unsigned int scount; /* spring count */ 
 +} fmatrix3x3;
 +
 +///////////////////////////
 +// float[3] vector
 +///////////////////////////
 +/* simple vector code */
 +/* STATUS: verified */
 +DO_INLINE void mul_fvector_S(float to[3], float from[3], float scalar)
 +{
 +	to[0] = from[0] * scalar;
 +	to[1] = from[1] * scalar;
 +	to[2] = from[2] * scalar;
 +}
 +/* simple cross product */
 +/* STATUS: verified */
 +DO_INLINE void cross_fvector(float to[3], float vectorA[3], float vectorB[3])
 +{
 +	to[0] = vectorA[1] * vectorB[2] - vectorA[2] * vectorB[1];
 +	to[1] = vectorA[2] * vectorB[0] - vectorA[0] * vectorB[2];
 +	to[2] = vectorA[0] * vectorB[1] - vectorA[1] * vectorB[0];
 +}
 +/* simple v^T * v product ("outer product") */
 +/* STATUS: HAS TO BE verified (*should* work) */
 +DO_INLINE void mul_fvectorT_fvector(float to[3][3], float vectorA[3], float vectorB[3])
 +{
 +	mul_fvector_S(to[0], vectorB, vectorA[0]);
 +	mul_fvector_S(to[1], vectorB, vectorA[1]);
 +	mul_fvector_S(to[2], vectorB, vectorA[2]);
 +}
 +/* simple v^T * v product with scalar ("outer product") */
 +/* STATUS: HAS TO BE verified (*should* work) */
 +DO_INLINE void mul_fvectorT_fvectorS(float to[3][3], float vectorA[3], float vectorB[3], float aS)
 +{	
 +	mul_fvectorT_fvector(to, vectorA, vectorB);
 +	
 +	mul_fvector_S(to[0], to[0], aS);
 +	mul_fvector_S(to[1], to[1], aS);
 +	mul_fvector_S(to[2], to[2], aS);
 +}
 +
 +#if 0
 +/* printf vector[3] on console: for debug output */
 +static void print_fvector(float m3[3])
 +{
 +	printf("%f\n%f\n%f\n\n", m3[0], m3[1], m3[2]);
 +}
 +
 +///////////////////////////
 +// long float vector float (*)[3]
 +///////////////////////////
 +/* print long vector on console: for debug output */
 +DO_INLINE void print_lfvector(float (*fLongVector)[3], unsigned int verts)
 +{
 +	unsigned int i = 0;
 +	for (i = 0; i < verts; i++) {
 +		print_fvector(fLongVector[i]);
 +	}
 +}
 +#endif
 +
 +/* create long vector */
 +DO_INLINE lfVector *create_lfvector(unsigned int verts)
 +{
 +	/* TODO: check if memory allocation was successful */
 +	return  (lfVector *)MEM_callocN(verts * sizeof(lfVector), "cloth_implicit_alloc_vector");
 +	// return (lfVector *)cloth_aligned_malloc(&MEMORY_BASE, verts * sizeof(lfVector));
 +}
 +/* delete long vector */
 +DO_INLINE void del_lfvector(float (*fLongVector)[3])
 +{
 +	if (fLongVector != NULL) {
 +		MEM_freeN(fLongVector);
 +		// cloth_aligned_free(&MEMORY_BASE, fLongVector);
 +	}
 +}
 +/* copy long vector */
 +DO_INLINE void cp_lfvector(float (*to)[3], float (*from)[3], unsigned int verts)
 +{
 +	memcpy(to, from, verts * sizeof(lfVector));
 +}
 +/* init long vector with float[3] */
 +DO_INLINE void init_lfvector(float (*fLongVector)[3], float vector[3], unsigned int verts)
 +{
 +	unsigned int i = 0;
 +	for (i = 0; i < verts; i++) {
 +		copy_v3_v3(fLongVector[i], vector);
 +	}
 +}
 +/* zero long vector with float[3] */
 +DO_INLINE void zero_lfvector(float (*to)[3], unsigned int verts)
 +{
 +	memset(to, 0.0f, verts * sizeof(lfVector));
 +}
 +/* multiply long vector with scalar*/
 +DO_INLINE void mul_lfvectorS(float (*to)[3], float (*fLongVector)[3], float scalar, unsigned int verts)
 +{
 +	unsigned int i = 0;
 +
 +	for (i = 0; i < verts; i++) {
 +		mul_fvector_S(to[i], fLongVector[i], scalar);
 +	}
 +}
 +/* multiply long vector with scalar*/
 +/* A -= B * float */
 +DO_INLINE void submul_lfvectorS(float (*to)[3], float (*fLongVector)[3], float scalar, unsigned int verts)
 +{
 +	unsigned int i = 0;
 +	for (i = 0; i < verts; i++) {
 +		VECSUBMUL(to[i], fLongVector[i], scalar);
 +	}
 +}
 +/* dot product for big vector */
 +DO_INLINE float dot_lfvector(float (*fLongVectorA)[3], float (*fLongVectorB)[3], unsigned int verts)
 +{
 +	long i = 0;
 +	float temp = 0.0;
 +// XXX brecht, disabled this for now (first schedule line was already disabled),
 +// due to non-commutative nature of floating point ops this makes the sim give
 +// different results each time you run it!
 +// schedule(guided, 2)
 +//#pragma omp parallel for reduction(+: temp) if (verts > CLOTH_OPENMP_LIMIT)
 +	for (i = 0; i < (long)verts; i++) {
 +		temp += dot_v3v3(fLongVectorA[i], fLongVectorB[i]);
 +	}
 +	return temp;
 +}
 +/* A = B + C  --> for big vector */
 +DO_INLINE void add_lfvector_lfvector(float (*to)[3], float (*fLongVectorA)[3], float (*fLongVectorB)[3], unsigned int verts)
 +{
 +	unsigned int i = 0;
 +
 +	for (i = 0; i < verts; i++) {
 +		VECADD(to[i], fLongVectorA[i], fLongVectorB[i]);
 +	}
 +
 +}
 +/* A = B + C * float --> for big vector */
 +DO_INLINE void add_lfvector_lfvectorS(float (*to)[3], float (*fLongVectorA)[3], float (*fLongVectorB)[3], float bS, unsigned int verts)
 +{
 +	unsigned int i = 0;
 +
 +	for (i = 0; i < verts; i++) {
 +		VECADDS(to[i], fLongVectorA[i], fLongVectorB[i], bS);
 +
 +	}
 +}
 +/* A = B * float + C * float --> for big vector */
 +DO_INLINE void add_lfvectorS_lfvectorS(float (*to)[3], float (*fLongVectorA)[3], float aS, float (*fLongVectorB)[3], float bS, unsigned int verts)
 +{
 +	unsigned int i = 0;
 +
 +	for (i = 0; i < verts; i++) {
 +		VECADDSS(to[i], fLongVectorA[i], aS, fLongVectorB[i], bS);
 +	}
 +}
 +/* A = B - C * float --> for big vector */
 +DO_INLINE void sub_lfvector_lfvectorS(float (*to)[3], float (*fLongVectorA)[3], float (*fLongVectorB)[3], float bS, unsigned int verts)
 +{
 +	unsigned int i = 0;
 +	for (i = 0; i < verts; i++) {
 +		VECSUBS(to[i], fLongVectorA[i], fLongVectorB[i], bS);
 +	}
 +
 +}
 +/* A = B - C --> for big vector */
 +DO_INLINE void sub_lfvector_lfvector(float (*to)[3], float (*fLongVectorA)[3], float (*fLongVectorB)[3], unsigned int verts)
 +{
 +	unsigned int i = 0;
 +
 +	for (i = 0; i < verts; i++) {
 +		sub_v3_v3v3(to[i], fLongVectorA[i], fLongVectorB[i]);
 +	}
 +
 +}
 +///////////////////////////
 +// 3x3 matrix
 +///////////////////////////
 +#if 0
 +/* printf 3x3 matrix on console: for debug output */
 +static void print_fmatrix(float m3[3][3])
 +{
 +	printf("%f\t%f\t%f\n", m3[0][0], m3[0][1], m3[0][2]);
 +	printf("%f\t%f\t%f\n", m3[1][0], m3[1][1], m3[1][2]);
 +	printf("%f\t%f\t%f\n\n", m3[2][0], m3[2][1], m3[2][2]);
 +}
 +
 +static void print_sparse_matrix(fmatrix3x3 *m)
 +{
 +	if (m) {
 +		unsigned int i;
 +		for (i = 0; i < m[0].vcount + m[0].scount; i++) {
 +			printf("%d:\n", i);
 +			print_fmatrix(m[i].m);
 +		}
 +	}
 +}
 +#endif
 +
 +static void print_lvecto

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list