Add PhysicsEffects to Extras. The build is only tested on Windows and Android.
The Android/NEON optimized version of Physics Effects is thanks to Graham Rhodes and Anthony Hamilton, See Issue 587
This commit is contained in:
@@ -0,0 +1,181 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_COMMON_H
|
||||
#define _SCE_PFX_COMMON_H
|
||||
|
||||
// Include common headers
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <tchar.h>
|
||||
#else
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
#if defined(_WIN32)
|
||||
#include "pfx_vectormath_include.win32.h"
|
||||
#else
|
||||
#include "pfx_vectormath_include.h"
|
||||
#endif
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
// Basic Types
|
||||
#if defined(_WIN32)
|
||||
typedef char PfxInt8;
|
||||
typedef unsigned char PfxUInt8;
|
||||
typedef short PfxInt16;
|
||||
typedef unsigned short PfxUInt16;
|
||||
typedef int PfxInt32;
|
||||
typedef unsigned int PfxUInt32;
|
||||
typedef long long PfxInt64;
|
||||
typedef unsigned long long PfxUInt64;
|
||||
#else
|
||||
typedef int8_t PfxInt8;
|
||||
typedef uint8_t PfxUInt8;
|
||||
typedef int16_t PfxInt16;
|
||||
typedef uint16_t PfxUInt16;
|
||||
typedef int32_t PfxInt32;
|
||||
typedef uint32_t PfxUInt32;
|
||||
typedef int64_t PfxInt64;
|
||||
typedef uint64_t PfxUInt64;
|
||||
#endif
|
||||
|
||||
typedef bool PfxBool;
|
||||
typedef float PfxFloat;
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
// Debug Print
|
||||
#ifdef _WIN32
|
||||
static void pfxOutputDebugString(const char *str, ...)
|
||||
{
|
||||
char strDebug[1024]={0};
|
||||
va_list argList;
|
||||
va_start(argList, str);
|
||||
vsprintf_s(strDebug,str,argList);
|
||||
OutputDebugStringA(strDebug);
|
||||
va_end(argList);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(_DEBUG)
|
||||
#if defined(_WIN32)
|
||||
#define SCE_PFX_DPRINT pfxOutputDebugString
|
||||
#else
|
||||
#define SCE_PFX_DPRINT(...) printf(__VA_ARGS__)
|
||||
#endif
|
||||
#else
|
||||
#ifdef _WIN32
|
||||
#define SCE_PFX_DPRINT
|
||||
#else
|
||||
#define SCE_PFX_DPRINT(...)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Printf
|
||||
#if defined(_WIN32)
|
||||
#define SCE_PFX_PRINTF pfxOutputDebugString
|
||||
#else
|
||||
// ARA begin insert new code
|
||||
#ifdef __ANDROID__
|
||||
#include <android/log.h>
|
||||
#define SCE_PFX_PRINTF(...) __android_log_print(ANDROID_LOG_VERBOSE, "SCE_PFX_PRINTF", __VA_ARGS__)
|
||||
#else
|
||||
#define SCE_PFX_PRINTF(...) printf(__VA_ARGS__)
|
||||
#endif
|
||||
// ARA end, old baseline code block was:
|
||||
// #define SCE_PFX_PRINTF(...) printf(__VA_ARGS__)
|
||||
//
|
||||
#endif
|
||||
|
||||
#define SCE_PFX_UNLIKELY(a) (a)
|
||||
#define SCE_PFX_LIKELY(a) (a)
|
||||
|
||||
// Inline
|
||||
#if defined(_MSC_VER)
|
||||
#define SCE_PFX_FORCE_INLINE __forceinline
|
||||
#elif defined(__SNC__) || defined(__GNUC__)
|
||||
#define SCE_PFX_FORCE_INLINE inline __attribute__((always_inline))
|
||||
#endif
|
||||
|
||||
// Assert
|
||||
#define SCE_PFX_HALT() abort()
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define SCE_PFX_ASSERT(test) {if(!(test)){SCE_PFX_PRINTF("Assert "__FILE__ ":%u ("#test")\n", __LINE__);SCE_PFX_HALT();}}
|
||||
#define SCE_PFX_ASSERT_MSG(test,msg) {if(!(test)){SCE_PFX_PRINTF("Assert " msg " " __FILE__ ":%u ("#test")\n",__LINE__);SCE_PFX_HALT();}}
|
||||
#else
|
||||
#define SCE_PFX_ASSERT(test)
|
||||
#define SCE_PFX_ASSERT_MSG(test,msg)
|
||||
#endif
|
||||
|
||||
#define SCE_PFX_ALWAYS_ASSERT(test) {if(!(test)){SCE_PFX_PRINTF("Assert "__FILE__ ":%u ("#test")\n", __LINE__);SCE_PFX_HALT();}}
|
||||
#define SCE_PFX_ALWAYS_ASSERT_MSG(test,msg) {if(!(test)){SCE_PFX_PRINTF("Assert:" msg " " __FILE__ ":%u ("#test")\n",__LINE__);SCE_PFX_HALT();}}
|
||||
|
||||
// Aligned
|
||||
#if defined(_MSC_VER)
|
||||
#define SCE_PFX_ALIGNED(alignment) __declspec(align(alignment))
|
||||
#elif defined(__SNC__) || defined(__GNUC__)
|
||||
#define SCE_PFX_ALIGNED(alignment) __attribute__((__aligned__((alignment))))
|
||||
#endif
|
||||
|
||||
// Etc
|
||||
#define SCE_PFX_MIN(a,b) (((a)<(b))?(a):(b))
|
||||
#define SCE_PFX_MAX(a,b) (((a)>(b))?(a):(b))
|
||||
#define SCE_PFX_CLAMP(v,a,b) SCE_PFX_MAX(a,SCE_PFX_MIN(v,b))
|
||||
#define SCE_PFX_SWAP(type, x, y) do {type t; t=x; x=y; y=t; } while (0)
|
||||
#define SCE_PFX_SQR(a) ((a)*(a))
|
||||
|
||||
#define SCE_PFX_ALIGN16(count,size) ((((((count) * (size)) + 15) & (~15)) + (size)-1) / (size))
|
||||
#define SCE_PFX_ALIGN128(count,size) ((((((count) * (size)) + 127) & (~127)) + (size)-1) / (size))
|
||||
|
||||
#define SCE_PFX_AVAILABLE_BYTES_ALIGN16(ptr,bytes) (bytes-((uintptr_t)(ptr)&0x0f))
|
||||
#define SCE_PFX_AVAILABLE_BYTES_ALIGN128(ptr,bytes) (bytes-((uintptr_t)(ptr)&0x7f))
|
||||
|
||||
#define SCE_PFX_BYTES_ALIGN16(bytes) (((bytes)+15)&(~15))
|
||||
#define SCE_PFX_BYTES_ALIGN128(bytes) (((bytes)+127)&(~127))
|
||||
|
||||
#define SCE_PFX_PTR_ALIGN16(ptr) (((uintptr_t)(ptr)+15)&(~15))
|
||||
#define SCE_PFX_PTR_ALIGN128(ptr) (((uintptr_t)(ptr)+127)&(~127))
|
||||
|
||||
#define SCE_PFX_PTR_IS_ALIGNED16(ptr) (((uintptr_t)(ptr)&0x0f)==0)
|
||||
#define SCE_PFX_PTR_IS_ALIGNED128(ptr) (((uintptr_t)(ptr)&0x7f)==0)
|
||||
|
||||
#define SCE_PFX_GET_POINTER(offset,stride,id) ((uintptr_t)(offset)+(stride)*(id))
|
||||
|
||||
#define SCE_PFX_FLT_MAX 1e+38f
|
||||
#define SCE_PFX_PI 3.14159265358979f
|
||||
|
||||
#define SCE_PFX_RANGE_CHECK(val,minVal,maxVal) (((val)>=(minVal))&&((val)<=(maxVal)))
|
||||
|
||||
#define SCE_PFX_IS_RUNNING_ON_64BIT_ENV() ( ( sizeof(void*)==8 )? true : false )
|
||||
|
||||
#if defined(__SNC__) || defined(__GNUC__)
|
||||
#define SCE_PFX_PADDING(count,bytes) PfxUInt8 padding##count[bytes];
|
||||
#else
|
||||
#define SCE_PFX_PADDING(count,bytes)
|
||||
#endif
|
||||
|
||||
#include "pfx_error_code.h"
|
||||
|
||||
#endif // _SCE_PFX_COMMON_H
|
||||
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_ERROR_CODE_H
|
||||
#define _SCE_PFX_ERROR_CODE_H
|
||||
|
||||
#define SCE_PFX_OK 0
|
||||
#define SCE_PFX_ERR_INVALID_VALUE 0x80880001
|
||||
#define SCE_PFX_ERR_INVALID_ALIGN 0x80880002
|
||||
#define SCE_PFX_ERR_OUT_OF_BUFFER 0x80880003
|
||||
#define SCE_PFX_ERR_OUT_OF_MAX_PAIRS 0x80880004
|
||||
#define SCE_PFX_ERR_OUT_OF_RANGE 0x80880005
|
||||
#define SCE_PFX_ERR_OUT_OF_WORLD 0x80880006
|
||||
#define SCE_PFX_ERR_INVALID_FLAG 0x80880007
|
||||
|
||||
#endif // _SCE_PFX_ERROR_CODE_H
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_HEAP_MANAGER_H
|
||||
#define _SCE_PFX_HEAP_MANAGER_H
|
||||
|
||||
#include "pfx_common.h"
|
||||
|
||||
//J プールされたメモリを管理するスタックのサイズ
|
||||
//E Size of a stack which used to manage pool memory
|
||||
#define SCE_PFX_HEAP_STACK_SIZE 64
|
||||
|
||||
#define SCE_PFX_MIN_ALLOC_SIZE 16
|
||||
|
||||
#define SCE_PFX_ALLOC_BYTES_ALIGN16(bytes) SCE_PFX_MAX(16,SCE_PFX_BYTES_ALIGN16(bytes))
|
||||
#define SCE_PFX_ALLOC_BYTES_ALIGN128(bytes) SCE_PFX_MAX(128,SCE_PFX_BYTES_ALIGN128(bytes))
|
||||
|
||||
#if defined (_WIN64) || defined (__LP64__)
|
||||
#define SCE_PFX_ALIGN_MASK_16 0xfffffffffffffff0
|
||||
#define SCE_PFX_ALIGN_MASK_128 0xffffffffffffff80
|
||||
#else
|
||||
#define SCE_PFX_ALIGN_MASK_16 0xfffffff0
|
||||
#define SCE_PFX_ALIGN_MASK_128 0xffffff80
|
||||
#endif
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// PfxHeapManager
|
||||
|
||||
//J <補足>
|
||||
//J メモリはスタックで管理されています。取得した順と逆に開放する必要があります。
|
||||
//J メモリを一気に開放したい場合はclear()を呼び出してください。
|
||||
//J 最小割り当てサイズはSCE_PFX_MIN_ALLOC_SIZEで定義されます。
|
||||
|
||||
//E <Notes>
|
||||
//E Memory is managed as a stack, so deallocate() needs to be called in reverse order.
|
||||
//E Use clear() to deallocate all allocated memory at once.
|
||||
//E SCE_PFX_MIN_ALLOC_SIZE defines the smallest amount of buffer.
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
class PfxHeapManager
|
||||
{
|
||||
private:
|
||||
PfxUInt8 *m_heap;
|
||||
PfxUInt8 *m_poolStack[SCE_PFX_HEAP_STACK_SIZE];
|
||||
PfxInt32 m_heapBytes;
|
||||
PfxInt32 m_curStack;
|
||||
PfxInt32 m_rest;
|
||||
|
||||
public:
|
||||
enum {ALIGN16=16,ALIGN128=128};
|
||||
|
||||
PfxHeapManager(PfxUInt8 *buf,PfxInt32 bytes)
|
||||
{
|
||||
m_heap = buf;
|
||||
m_heapBytes = bytes;
|
||||
clear();
|
||||
}
|
||||
|
||||
~PfxHeapManager()
|
||||
{
|
||||
}
|
||||
|
||||
PfxInt32 getAllocated()
|
||||
{
|
||||
return (PfxInt32)(m_poolStack[m_curStack]-m_heap);
|
||||
}
|
||||
|
||||
PfxInt32 getRest()
|
||||
{
|
||||
return m_heapBytes-getAllocated();
|
||||
}
|
||||
|
||||
void *allocate(size_t bytes,PfxInt32 alignment = ALIGN16)
|
||||
{
|
||||
SCE_PFX_ALWAYS_ASSERT(m_curStack<SCE_PFX_HEAP_STACK_SIZE);
|
||||
|
||||
bytes = SCE_PFX_MAX(bytes,SCE_PFX_MIN_ALLOC_SIZE);
|
||||
|
||||
uintptr_t p = (uintptr_t)m_poolStack[m_curStack];
|
||||
|
||||
if(alignment == ALIGN128) {
|
||||
p = (p+127) & SCE_PFX_ALIGN_MASK_128;
|
||||
bytes = (bytes+127) & SCE_PFX_ALIGN_MASK_128;
|
||||
}
|
||||
else {
|
||||
p = (p+15) & SCE_PFX_ALIGN_MASK_16;
|
||||
bytes = (bytes+15) & SCE_PFX_ALIGN_MASK_16;
|
||||
}
|
||||
|
||||
SCE_PFX_ALWAYS_ASSERT_MSG(bytes <= (m_heapBytes-(p-(uintptr_t)m_heap)),"Memory overflow");
|
||||
|
||||
m_poolStack[++m_curStack] = (PfxUInt8 *)(p + bytes);
|
||||
|
||||
m_rest = getRest();
|
||||
|
||||
return (void*)p;
|
||||
}
|
||||
|
||||
void deallocate(void *p)
|
||||
{
|
||||
#if 0
|
||||
m_curStack--;
|
||||
PfxInt32 addr = (PfxInt32)m_poolStack[m_curStack];
|
||||
SCE_PFX_ALWAYS_ASSERT_MSG(addr == (PfxInt32)p || ((addr+127) & 0xffffff80) == (PfxInt32)p,"Stack overflow");
|
||||
#else
|
||||
(void) p;
|
||||
m_curStack--;
|
||||
#endif
|
||||
}
|
||||
|
||||
void clear()
|
||||
{
|
||||
m_poolStack[0] = m_heap;
|
||||
m_curStack = 0;
|
||||
m_rest = 0;
|
||||
}
|
||||
|
||||
void printStack()
|
||||
{
|
||||
SCE_PFX_PRINTF("memStack %d/%d\n",m_curStack,SCE_PFX_HEAP_STACK_SIZE);
|
||||
}
|
||||
};
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#endif // _SCE_PFX_HEAP_MANAGER_H
|
||||
@@ -0,0 +1,168 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_PERF_COUNTER_H
|
||||
#define _SCE_PFX_PERF_COUNTER_H
|
||||
|
||||
#include "pfx_common.h"
|
||||
|
||||
// ARA begin insert new code
|
||||
#ifndef _WIN32
|
||||
#include <time.h>
|
||||
#endif
|
||||
// ARA end
|
||||
|
||||
//J パフォーマンス測定する場合はPFX_USE_PERFCOUNTERを定義
|
||||
//J ブックマークを使用する場合はPFX_USE_BOOKMARKを定義
|
||||
|
||||
//E Define SCE_PFX_USE_PERFCOUNTER to check performance
|
||||
//E Define SCE_PFX_USE_BOOKMARK to use bookmark
|
||||
|
||||
|
||||
#define SCE_PFX_MAX_PERF_STR 32
|
||||
#define SCE_PFX_MAX_PERF_COUNT 20
|
||||
|
||||
//#define SCE_PFX_USE_PERFCOUNTER
|
||||
//#define SCE_PFX_USE_BOOKMARK
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
#ifdef SCE_PFX_USE_PERFCOUNTER
|
||||
|
||||
class PfxPerfCounter
|
||||
{
|
||||
private:
|
||||
int m_count,m_strCount;
|
||||
char m_str[SCE_PFX_MAX_PERF_COUNT][SCE_PFX_MAX_PERF_STR];
|
||||
float m_freq;
|
||||
|
||||
SCE_PFX_PADDING(1,4)
|
||||
#ifdef _WIN32
|
||||
LONGLONG m_cnt[SCE_PFX_MAX_PERF_COUNT*2];
|
||||
#else
|
||||
// ARA begin insert new code
|
||||
timespec m_cnt[SCE_PFX_MAX_PERF_COUNT*2];
|
||||
// ARA end
|
||||
#endif
|
||||
|
||||
void count(int i)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
QueryPerformanceCounter( (LARGE_INTEGER *)&m_cnt[i] );
|
||||
#else
|
||||
// ARA begin insert new code
|
||||
clock_gettime(CLOCK_MONOTONIC, &m_cnt[i]);
|
||||
// ARA end
|
||||
#endif
|
||||
}
|
||||
|
||||
public:
|
||||
PfxPerfCounter()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
LARGE_INTEGER sPerfCountFreq;
|
||||
QueryPerformanceFrequency(&sPerfCountFreq);
|
||||
m_freq = (float)sPerfCountFreq.QuadPart;
|
||||
#else
|
||||
// ARA begin insert new code
|
||||
m_freq = 1000000000.0f; // clock_gettime reports time in nanoseconds (though accuracy is platform dependent)
|
||||
// ARA end
|
||||
#endif
|
||||
resetCount();
|
||||
}
|
||||
|
||||
~PfxPerfCounter()
|
||||
{
|
||||
//printCount();
|
||||
}
|
||||
|
||||
void countBegin(const char *name)
|
||||
{
|
||||
SCE_PFX_ASSERT(m_strCount < SCE_PFX_MAX_PERF_COUNT);
|
||||
strncpy(m_str[m_strCount],name,SCE_PFX_MAX_PERF_STR-1);
|
||||
m_str[m_strCount][SCE_PFX_MAX_PERF_STR-1] = 0x00;
|
||||
m_strCount++;
|
||||
count(m_count++);
|
||||
}
|
||||
|
||||
void countEnd()
|
||||
{
|
||||
count(m_count++);
|
||||
}
|
||||
|
||||
void resetCount()
|
||||
{
|
||||
m_strCount = 0;
|
||||
m_count = 0;
|
||||
}
|
||||
|
||||
float getCountTime(int i)
|
||||
{
|
||||
#if _WIN32
|
||||
return (float)(m_cnt[i+1]-m_cnt[i]) / m_freq * 1000.0f;
|
||||
#else
|
||||
// ARA begin insert new code
|
||||
return float(m_cnt[i+1].tv_sec - m_cnt[i].tv_sec) +
|
||||
(float(m_cnt[i+1].tv_nsec - m_cnt[i].tv_nsec) / m_freq);
|
||||
// ARA end
|
||||
#endif
|
||||
}
|
||||
|
||||
void printCount()
|
||||
{
|
||||
if(m_count%2 != 0) countEnd();
|
||||
SCE_PFX_PRINTF("*** PfxPerfCounter results ***\n");
|
||||
float total = 0.0f;
|
||||
for(int i=0;i+1<m_count;i+=2) {
|
||||
total += getCountTime(i);
|
||||
}
|
||||
for(int i=0;i+1<m_count;i+=2) {
|
||||
SCE_PFX_PRINTF(" -- %s %fms(%.2f%%)\n",m_str[i>>1],getCountTime(i),getCountTime(i)/total*100.0f);
|
||||
}
|
||||
SCE_PFX_PRINTF(" -- Total %fms\n",total);
|
||||
}
|
||||
};
|
||||
|
||||
#else /* SCE_PFX_USE_PERFCOUNTER */
|
||||
|
||||
class PfxPerfCounter
|
||||
{
|
||||
public:
|
||||
PfxPerfCounter() {}
|
||||
~PfxPerfCounter() {}
|
||||
void countBegin(const char *name) {(void) name;}
|
||||
void countEnd() {}
|
||||
void resetCount() {}
|
||||
float getCountTime(int i) {(void)i;return 0.0f;}
|
||||
void printCount() {}
|
||||
};
|
||||
|
||||
#endif /* SCE_PFX_USE_PERFCOUNTER */
|
||||
|
||||
#define pfxInsertBookmark(bookmark)
|
||||
|
||||
#ifdef SCE_PFX_USE_BOOKMARK
|
||||
#define SCE_PFX_PUSH_MARKER(name)
|
||||
#define SCE_PFX_POP_MARKER()
|
||||
#else
|
||||
#define SCE_PFX_PUSH_MARKER(name)
|
||||
#define SCE_PFX_POP_MARKER()
|
||||
#endif
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
#endif // _SCE_PFX_PERF_COUNTER_H
|
||||
@@ -0,0 +1,166 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_VEC_INT3_H
|
||||
#define _SCE_PFX_VEC_INT3_H
|
||||
|
||||
#include "pfx_common.h"
|
||||
|
||||
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
class SCE_PFX_ALIGNED(16) PfxVecInt3
|
||||
{
|
||||
private:
|
||||
PfxInt32 m_x,m_y,m_z,m_w;
|
||||
|
||||
public:
|
||||
PfxVecInt3() {m_x=m_y=m_z=m_w=0;}
|
||||
PfxVecInt3(const PfxVector3 SCE_VECTORMATH_AOS_VECTOR_ARG vec) {m_x=(PfxInt32)vec[0];m_y=(PfxInt32)vec[1];m_z=(PfxInt32)vec[2];m_w=0;}
|
||||
PfxVecInt3(PfxFloat fx,PfxFloat fy,PfxFloat fz) {m_x=(PfxInt32)fx;m_y=(PfxInt32)fy;m_z=(PfxInt32)fz;m_w=0;}
|
||||
PfxVecInt3(PfxInt32 iv) {m_x=m_y=m_z=iv;m_w=0;}
|
||||
PfxVecInt3(PfxInt32 ix,PfxInt32 iy,PfxInt32 iz) {m_x=ix;m_y=iy;m_z=iz;m_w=0;}
|
||||
|
||||
inline PfxVecInt3 &operator =( const PfxVecInt3 &vec);
|
||||
|
||||
inline PfxInt32 get(PfxInt32 i) const {return *(&m_x+i);}
|
||||
inline PfxInt32 getX() const {return m_x;}
|
||||
inline PfxInt32 getY() const {return m_y;}
|
||||
inline PfxInt32 getZ() const {return m_z;}
|
||||
inline void set(PfxInt32 i,PfxInt32 v) {*(&m_x+i) = v;}
|
||||
inline void setX(PfxInt32 v) {m_x = v;}
|
||||
inline void setY(PfxInt32 v) {m_y = v;}
|
||||
inline void setZ(PfxInt32 v) {m_z = v;}
|
||||
|
||||
inline const PfxVecInt3 operator +( const PfxVecInt3 & vec ) const;
|
||||
inline const PfxVecInt3 operator -( const PfxVecInt3 & vec ) const;
|
||||
inline const PfxVecInt3 operator *( PfxInt32 scalar ) const;
|
||||
inline const PfxVecInt3 operator /( PfxInt32 scalar ) const;
|
||||
|
||||
inline PfxVecInt3 & operator +=( const PfxVecInt3 & vec );
|
||||
inline PfxVecInt3 & operator -=( const PfxVecInt3 & vec );
|
||||
inline PfxVecInt3 & operator *=( PfxInt32 scalar );
|
||||
inline PfxVecInt3 & operator /=( PfxInt32 scalar );
|
||||
|
||||
inline const PfxVecInt3 operator -() const;
|
||||
|
||||
operator PfxVector3() const
|
||||
{
|
||||
return PfxVector3((PfxFloat)m_x,(PfxFloat)m_y,(PfxFloat)m_z);
|
||||
}
|
||||
};
|
||||
|
||||
inline PfxVecInt3 &PfxVecInt3::operator =( const PfxVecInt3 &vec)
|
||||
{
|
||||
m_x = vec.m_x;
|
||||
m_y = vec.m_y;
|
||||
m_z = vec.m_z;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline const PfxVecInt3 PfxVecInt3::operator +( const PfxVecInt3 & vec ) const
|
||||
{
|
||||
return PfxVecInt3(m_x+vec.m_x, m_y+vec.m_y, m_z+vec.m_z);
|
||||
}
|
||||
|
||||
inline const PfxVecInt3 PfxVecInt3::operator -( const PfxVecInt3 & vec ) const
|
||||
{
|
||||
return PfxVecInt3(m_x-vec.m_x, m_y-vec.m_y, m_z-vec.m_z);
|
||||
}
|
||||
|
||||
inline const PfxVecInt3 PfxVecInt3::operator *( PfxInt32 scalar ) const
|
||||
{
|
||||
return PfxVecInt3(m_x*scalar, m_y*scalar, m_z*scalar);
|
||||
}
|
||||
|
||||
inline const PfxVecInt3 PfxVecInt3::operator /( PfxInt32 scalar ) const
|
||||
{
|
||||
return PfxVecInt3(m_x/scalar, m_y/scalar, m_z/scalar);
|
||||
}
|
||||
|
||||
inline PfxVecInt3 &PfxVecInt3::operator +=( const PfxVecInt3 & vec )
|
||||
{
|
||||
*this = *this + vec;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline PfxVecInt3 &PfxVecInt3::operator -=( const PfxVecInt3 & vec )
|
||||
{
|
||||
*this = *this - vec;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline PfxVecInt3 &PfxVecInt3::operator *=( PfxInt32 scalar )
|
||||
{
|
||||
*this = *this * scalar;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline PfxVecInt3 &PfxVecInt3::operator /=( PfxInt32 scalar )
|
||||
{
|
||||
*this = *this / scalar;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline const PfxVecInt3 PfxVecInt3::operator -() const
|
||||
{
|
||||
return PfxVecInt3(-m_x,-m_y,-m_z);
|
||||
}
|
||||
|
||||
inline const PfxVecInt3 operator *( PfxInt32 scalar, const PfxVecInt3 & vec )
|
||||
{
|
||||
return vec * scalar;
|
||||
}
|
||||
|
||||
inline const PfxVecInt3 mulPerElem( const PfxVecInt3 & vec0, const PfxVecInt3 & vec1 )
|
||||
{
|
||||
return PfxVecInt3(vec0.getX()*vec1.getX(), vec0.getY()*vec1.getY(), vec0.getZ()*vec1.getZ());
|
||||
}
|
||||
|
||||
inline const PfxVecInt3 divPerElem( const PfxVecInt3 & vec0, const PfxVecInt3 & vec1 )
|
||||
{
|
||||
return PfxVecInt3(vec0.getX()/vec1.getX(), vec0.getY()/vec1.getY(), vec0.getZ()/vec1.getZ());
|
||||
}
|
||||
|
||||
inline const PfxVecInt3 absPerElem( const PfxVecInt3 & vec )
|
||||
{
|
||||
return PfxVecInt3(abs(vec.getX()), abs(vec.getY()), abs(vec.getZ()));
|
||||
}
|
||||
|
||||
inline const PfxVecInt3 maxPerElem( const PfxVecInt3 & vec0, const PfxVecInt3 & vec1 )
|
||||
{
|
||||
return PfxVecInt3(
|
||||
(vec0.getX() > vec1.getX())? vec0.getX() : vec1.getX(),
|
||||
(vec0.getY() > vec1.getY())? vec0.getY() : vec1.getY(),
|
||||
(vec0.getZ() > vec1.getZ())? vec0.getZ() : vec1.getZ()
|
||||
);
|
||||
}
|
||||
|
||||
inline const PfxVecInt3 minPerElem( const PfxVecInt3 & vec0, const PfxVecInt3 & vec1 )
|
||||
{
|
||||
return PfxVecInt3(
|
||||
(vec0.getX() < vec1.getX())? vec0.getX() : vec1.getX(),
|
||||
(vec0.getY() < vec1.getY())? vec0.getY() : vec1.getY(),
|
||||
(vec0.getZ() < vec1.getZ())? vec0.getZ() : vec1.getZ()
|
||||
);
|
||||
}
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
|
||||
#endif // _SCE_PFX_VEC_INT3_H
|
||||
@@ -0,0 +1,181 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_VEC_UTILS_H
|
||||
#define _SCE_PFX_VEC_UTILS_H
|
||||
|
||||
#include "pfx_common.h"
|
||||
#include "pfx_vec_int3.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
static SCE_PFX_FORCE_INLINE PfxVector3 pfxReadVector3(const PfxFloat* fptr)
|
||||
{
|
||||
PfxVector3 v;
|
||||
|
||||
loadXYZ(v, fptr);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
static SCE_PFX_FORCE_INLINE PfxPoint3 pfxReadPoint3(const PfxFloat* fptr)
|
||||
{
|
||||
PfxPoint3 v;
|
||||
|
||||
loadXYZ(v, fptr);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
static SCE_PFX_FORCE_INLINE PfxQuat pfxReadQuat(const PfxFloat* fptr)
|
||||
{
|
||||
PfxQuat vq;
|
||||
|
||||
loadXYZW(vq, fptr);
|
||||
|
||||
return vq;
|
||||
}
|
||||
|
||||
static SCE_PFX_FORCE_INLINE void pfxStoreVector3(const PfxVector3 &src, PfxFloat* fptr)
|
||||
{
|
||||
storeXYZ(src, fptr);
|
||||
}
|
||||
|
||||
static SCE_PFX_FORCE_INLINE void pfxStorePoint3(const PfxPoint3 &src, PfxFloat* fptr)
|
||||
{
|
||||
storeXYZ(src, fptr);
|
||||
}
|
||||
|
||||
static SCE_PFX_FORCE_INLINE void pfxStoreQuat(const PfxQuat &src, PfxFloat* fptr)
|
||||
{
|
||||
storeXYZW(src, fptr);
|
||||
}
|
||||
|
||||
} // namespace PhysicsEffects
|
||||
} // namespace sce
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
static SCE_PFX_FORCE_INLINE
|
||||
void pfxGetPlaneSpace(const PfxVector3& n, PfxVector3& fptr, PfxVector3& q)
|
||||
{
|
||||
if(fabsf(n[2]) > 0.707f) {
|
||||
// choose fptr in y-z plane
|
||||
PfxFloat a = n[1]*n[1] + n[2]*n[2];
|
||||
PfxFloat k = 1.0f/sqrtf(a);
|
||||
fptr[0] = 0;
|
||||
fptr[1] = -n[2]*k;
|
||||
fptr[2] = n[1]*k;
|
||||
// set q = n x fptr
|
||||
q[0] = a*k;
|
||||
q[1] = -n[0]*fptr[2];
|
||||
q[2] = n[0]*fptr[1];
|
||||
}
|
||||
else {
|
||||
// choose fptr in x-y plane
|
||||
PfxFloat a = n[0]*n[0] + n[1]*n[1];
|
||||
PfxFloat k = 1.0f/sqrtf(a);
|
||||
fptr[0] = -n[1]*k;
|
||||
fptr[1] = n[0]*k;
|
||||
fptr[2] = 0;
|
||||
// set q = n x fptr
|
||||
q[0] = -n[2]*fptr[1];
|
||||
q[1] = n[2]*fptr[0];
|
||||
q[2] = a*k;
|
||||
}
|
||||
}
|
||||
|
||||
static SCE_PFX_FORCE_INLINE
|
||||
void pfxGetRotationAngleAndAxis(const PfxQuat &unitQuat,PfxFloat &angle,PfxVector3 &axis)
|
||||
{
|
||||
const PfxFloat epsilon=0.00001f;
|
||||
|
||||
if(fabsf(unitQuat.getW()) < 1.0f-epsilon && lengthSqr(unitQuat.getXYZ()) > epsilon) {
|
||||
PfxFloat angleHalf = acosf(unitQuat.getW());
|
||||
PfxFloat sinAngleHalf = sinf(angleHalf);
|
||||
|
||||
if(fabsf(sinAngleHalf) > 1.0e-10f) {
|
||||
axis = unitQuat.getXYZ()/sinAngleHalf;
|
||||
} else {
|
||||
axis = unitQuat.getXYZ();
|
||||
}
|
||||
angle = 2.0f*angleHalf;
|
||||
} else {
|
||||
angle = 0.0f;
|
||||
axis = PfxVector3(1.0f, 0.0f, 0.0f);
|
||||
}
|
||||
}
|
||||
|
||||
static SCE_PFX_FORCE_INLINE
|
||||
PfxFloat pfxSafeAtan2(PfxFloat y,PfxFloat x)
|
||||
{
|
||||
if(SCE_PFX_SQR(x) < 0.000001f || SCE_PFX_SQR(y) < 0.000001f) {
|
||||
return 0.0f;
|
||||
}
|
||||
return atan2f(y,x);
|
||||
}
|
||||
|
||||
static SCE_PFX_FORCE_INLINE
|
||||
PfxVector3 pfxSafeNormalize(const PfxVector3 &vec)
|
||||
{
|
||||
float lenSqr = lengthSqr( vec );
|
||||
|
||||
if( lenSqr > 0.000001f ) {
|
||||
return normalize(vec);
|
||||
}else {
|
||||
return PfxVector3( 1.0f, 0.0f, 0.0f );
|
||||
}
|
||||
}
|
||||
|
||||
static SCE_PFX_FORCE_INLINE
|
||||
PfxVecInt3 pfxConvertCoordWorldToLocal(const PfxVector3 &coord,const PfxVector3 ¢er,const PfxVector3 &half)
|
||||
{
|
||||
const PfxVector3 sz(65535.0f);
|
||||
PfxVector3 q = divPerElem(coord - center + half,2.0f*half);
|
||||
q = minPerElem(maxPerElem(q,PfxVector3(0.0f)),PfxVector3(1.0f)); // clamp 0.0 - 1.0
|
||||
q = mulPerElem(q,sz);
|
||||
return PfxVecInt3(q);
|
||||
}
|
||||
|
||||
static SCE_PFX_FORCE_INLINE
|
||||
void pfxConvertCoordWorldToLocal(
|
||||
const PfxVector3 ¢er,const PfxVector3 &half,
|
||||
const PfxVector3 &coordMin,const PfxVector3 &coordMax,
|
||||
PfxVecInt3 &localMin,PfxVecInt3 &localMax)
|
||||
{
|
||||
const PfxVector3 sz(65535.0f);
|
||||
PfxVector3 qmin = divPerElem(coordMin - center + half,2.0f*half);
|
||||
qmin = minPerElem(maxPerElem(qmin,PfxVector3(0.0f)),PfxVector3(1.0f)); // clamp 0.0 - 1.0
|
||||
qmin = mulPerElem(qmin,sz);
|
||||
|
||||
PfxVector3 qmax = divPerElem(coordMax - center + half,2.0f*half);
|
||||
qmax = minPerElem(maxPerElem(qmax,PfxVector3(0.0f)),PfxVector3(1.0f)); // clamp 0.0 - 1.0
|
||||
qmax = mulPerElem(qmax,sz);
|
||||
localMin = PfxVecInt3(floorf(qmin[0]),floorf(qmin[1]),floorf(qmin[2]));
|
||||
localMax = PfxVecInt3(ceilf(qmax[0]),ceilf(qmax[1]),ceilf(qmax[2]));
|
||||
}
|
||||
|
||||
static SCE_PFX_FORCE_INLINE
|
||||
PfxVector3 pfxConvertCoordLocalToWorld(const PfxVecInt3 &coord,const PfxVector3 ¢er,const PfxVector3 &half)
|
||||
{
|
||||
PfxVector3 sz(65535.0f),vcoord(coord);
|
||||
PfxVector3 q = divPerElem(vcoord,sz);
|
||||
return mulPerElem(q,2.0f*half) + center - half;
|
||||
}
|
||||
} // namespace PhysicsEffects
|
||||
} // namespace sce
|
||||
|
||||
#endif // _SCE_PFX_VEC_UTILS_H
|
||||
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_VECTORMATH_INCLUDE_H
|
||||
#define _SCE_PFX_VECTORMATH_INCLUDE_H
|
||||
|
||||
// If you want to use the free/open sourced vectormath, you need to
|
||||
// put codes in the include/vecmath folder and set following define.
|
||||
#define SCE_PFX_USE_FREE_VECTORMATH
|
||||
|
||||
// If you want to use vectomath with SIMD,
|
||||
// following define is needed.
|
||||
//#define SCE_PFX_USE_SIMD_VECTORMATH
|
||||
|
||||
// This option enables to replace original implementation with
|
||||
// vector geometry library.
|
||||
//#define SCE_PFX_USE_GEOMETRY
|
||||
|
||||
// vectormath include
|
||||
#ifdef SCE_PFX_USE_FREE_VECTORMATH
|
||||
// ARA begin insert new code
|
||||
#if defined(SCE_PFX_USE_SIMD_VECTORMATH) && defined(__ANDROID__) && defined(__ARM_NEON__)
|
||||
// For Android targets supporting NEON instructions,
|
||||
// use NEON-optimized vector math library
|
||||
#include "../../../vecmath/neon/vectormath_aos.h"
|
||||
#include "../../../vecmath/neon/floatInVec.h"
|
||||
#else
|
||||
// ARA end
|
||||
// use standard free vector math library
|
||||
#include "../../../vecmath/std/vectormath_aos.h"
|
||||
#include "../../../vecmath/std/floatInVec.h"
|
||||
// ARA begin insert new code
|
||||
#endif
|
||||
// ARA end
|
||||
#define SCE_VECTORMATH_AOS_VECTOR_ARG
|
||||
#define SCE_VECTORMATH_AOS_MATRIX_ARG
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
typedef Vectormath::Aos::Point3 PfxPoint3;
|
||||
typedef Vectormath::Aos::Vector3 PfxVector3;
|
||||
typedef Vectormath::Aos::Vector4 PfxVector4;
|
||||
typedef Vectormath::Aos::Quat PfxQuat;
|
||||
typedef Vectormath::Aos::Matrix3 PfxMatrix3;
|
||||
typedef Vectormath::Aos::Matrix4 PfxMatrix4;
|
||||
typedef Vectormath::Aos::Transform3 PfxTransform3;
|
||||
typedef Vectormath::floatInVec PfxFloatInVec;
|
||||
typedef Vectormath::boolInVec PfxBoolInVec;
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#else
|
||||
#include <vectormath.h>
|
||||
#define SCE_GEOMETRY_USE_SCALAR_MATH
|
||||
#define SCE_VECTORMATH_AOS_VECTOR_ARG SCE_VECTORMATH_SCALAR_AOS_VECTOR_ARG
|
||||
#define SCE_VECTORMATH_AOS_MATRIX_ARG SCE_VECTORMATH_SCALAR_AOS_MATRIX_ARG
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
typedef sce::Vectormath::Scalar::Aos::Point3 PfxPoint3;
|
||||
typedef sce::Vectormath::Scalar::Aos::Vector3 PfxVector3;
|
||||
typedef sce::Vectormath::Scalar::Aos::Vector4 PfxVector4;
|
||||
typedef sce::Vectormath::Scalar::Aos::Quat PfxQuat;
|
||||
typedef sce::Vectormath::Scalar::Aos::Matrix3 PfxMatrix3;
|
||||
typedef sce::Vectormath::Scalar::Aos::Matrix4 PfxMatrix4;
|
||||
typedef sce::Vectormath::Scalar::Aos::Transform3 PfxTransform3;
|
||||
typedef sce::Vectormath::Scalar::floatInVec PfxFloatInVec;
|
||||
typedef sce::Vectormath::Scalar::boolInVec PfxBoolInVec;
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
#ifdef SCE_PFX_USE_GEOMETRY
|
||||
#include <sce_geometry.h>
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
typedef sce::Geometry::Aos::Line PfxGeomLine;
|
||||
typedef sce::Geometry::Aos::Segment PfxGeomSegment;
|
||||
typedef sce::Geometry::Aos::Plane PfxGeomPlane;
|
||||
typedef sce::Geometry::Aos::Sphere PfxGeomSphere;
|
||||
typedef sce::Geometry::Aos::Capsule PfxGeomCapsule;
|
||||
typedef sce::Geometry::Aos::Bounds PfxGeomBounds;
|
||||
typedef sce::Geometry::Aos::Aabb PfxGeomAabb;
|
||||
typedef sce::Geometry::Aos::Obb PfxGeomObb;
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif // _SCE_PFX_VECTORMATH_INCLUDE_H
|
||||
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_VECTORMATH_INCLUDE_WIN32_H
|
||||
#define _SCE_PFX_VECTORMATH_INCLUDE_WIN32_H
|
||||
|
||||
// If you want to use the free/open sourced vectormath, you need to
|
||||
// put codes in the include/vecmath folder and set following define.
|
||||
#define SCE_PFX_USE_FREE_VECTORMATH
|
||||
|
||||
// If you want to use vectomath with SIMD,
|
||||
// following define is needed.
|
||||
// #define SCE_PFX_USE_SIMD_VECTORMATH
|
||||
|
||||
// This option enables to replace original implementation with
|
||||
// vector geometry library.
|
||||
//#define SCE_PFX_USE_GEOMETRY
|
||||
|
||||
// vectormath include
|
||||
#ifdef SCE_PFX_USE_FREE_VECTORMATH
|
||||
#ifdef SCE_PFX_USE_SIMD_VECTORMATH
|
||||
#include "../../../vecmath/sse/vectormath_aos.h"
|
||||
#include "../../../vecmath/sse/floatInVec.h"
|
||||
#define SCE_VECTORMATH_AOS_VECTOR_ARG &
|
||||
#define SCE_VECTORMATH_AOS_MATRIX_ARG &
|
||||
#else
|
||||
#include "../../../vecmath/std/vectormath_aos.h"
|
||||
#include "../../../vecmath/std/floatInVec.h"
|
||||
#define SCE_VECTORMATH_AOS_VECTOR_ARG
|
||||
#define SCE_VECTORMATH_AOS_MATRIX_ARG
|
||||
#endif
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
typedef Vectormath::Aos::Point3 PfxPoint3;
|
||||
typedef Vectormath::Aos::Vector3 PfxVector3;
|
||||
typedef Vectormath::Aos::Vector4 PfxVector4;
|
||||
typedef Vectormath::Aos::Quat PfxQuat;
|
||||
typedef Vectormath::Aos::Matrix3 PfxMatrix3;
|
||||
typedef Vectormath::Aos::Matrix4 PfxMatrix4;
|
||||
typedef Vectormath::Aos::Transform3 PfxTransform3;
|
||||
typedef Vectormath::floatInVec PfxFloatInVec;
|
||||
typedef Vectormath::boolInVec PfxBoolInVec;
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#else
|
||||
#include <vectormath.h>
|
||||
|
||||
#ifdef SCE_PFX_USE_SIMD_VECTORMATH
|
||||
#define SCE_VECTORMATH_AOS_VECTOR_ARG SCE_VECTORMATH_SIMD_AOS_VECTOR_ARG
|
||||
#define SCE_VECTORMATH_AOS_MATRIX_ARG SCE_VECTORMATH_SIMD_AOS_MATRIX_ARG
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
typedef sce::Vectormath::Simd::Aos::Point3 PfxPoint3;
|
||||
typedef sce::Vectormath::Simd::Aos::Vector3 PfxVector3;
|
||||
typedef sce::Vectormath::Simd::Aos::Vector4 PfxVector4;
|
||||
typedef sce::Vectormath::Simd::Aos::Quat PfxQuat;
|
||||
typedef sce::Vectormath::Simd::Aos::Matrix3 PfxMatrix3;
|
||||
typedef sce::Vectormath::Simd::Aos::Matrix4 PfxMatrix4;
|
||||
typedef sce::Vectormath::Simd::Aos::Transform3 PfxTransform3;
|
||||
typedef sce::Vectormath::Simd::floatInVec PfxFloatInVec;
|
||||
typedef sce::Vectormath::Simd::boolInVec PfxBoolInVec;
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#else
|
||||
#define SCE_GEOMETRY_USE_SCALAR_MATH
|
||||
#define SCE_VECTORMATH_AOS_VECTOR_ARG SCE_VECTORMATH_SCALAR_AOS_VECTOR_ARG
|
||||
#define SCE_VECTORMATH_AOS_MATRIX_ARG SCE_VECTORMATH_SCALAR_AOS_MATRIX_ARG
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
typedef sce::Vectormath::Scalar::Aos::Point3 PfxPoint3;
|
||||
typedef sce::Vectormath::Scalar::Aos::Vector3 PfxVector3;
|
||||
typedef sce::Vectormath::Scalar::Aos::Vector4 PfxVector4;
|
||||
typedef sce::Vectormath::Scalar::Aos::Quat PfxQuat;
|
||||
typedef sce::Vectormath::Scalar::Aos::Matrix3 PfxMatrix3;
|
||||
typedef sce::Vectormath::Scalar::Aos::Matrix4 PfxMatrix4;
|
||||
typedef sce::Vectormath::Scalar::Aos::Transform3 PfxTransform3;
|
||||
typedef sce::Vectormath::Scalar::floatInVec PfxFloatInVec;
|
||||
typedef sce::Vectormath::Scalar::boolInVec PfxBoolInVec;
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef SCE_PFX_USE_GEOMETRY
|
||||
#include <sce_geometry.h>
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
typedef sce::Geometry::Aos::Line PfxGeomLine;
|
||||
typedef sce::Geometry::Aos::Segment PfxGeomSegment;
|
||||
typedef sce::Geometry::Aos::Plane PfxGeomPlane;
|
||||
typedef sce::Geometry::Aos::Sphere PfxGeomSphere;
|
||||
typedef sce::Geometry::Aos::Capsule PfxGeomCapsule;
|
||||
typedef sce::Geometry::Aos::Bounds PfxGeomBounds;
|
||||
typedef sce::Geometry::Aos::Aabb PfxGeomAabb;
|
||||
typedef sce::Geometry::Aos::Obb PfxGeomObb;
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#endif
|
||||
|
||||
#endif // _SCE_PFX_VECTORMATH_INCLUDE_WIN32_H
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_BROADPHASE_PAIR_H
|
||||
#define _SCE_PFX_BROADPHASE_PAIR_H
|
||||
|
||||
#include "../sort/pfx_sort_data.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
typedef PfxSortData16 PfxBroadphasePair;
|
||||
|
||||
SCE_PFX_FORCE_INLINE void pfxSetObjectIdA(PfxBroadphasePair &pair,PfxUInt16 i) {pair.set16(0,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetObjectIdB(PfxBroadphasePair &pair,PfxUInt16 i) {pair.set16(1,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetMotionMaskA(PfxBroadphasePair &pair,PfxUInt8 i) {pair.set8(4,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetMotionMaskB(PfxBroadphasePair &pair,PfxUInt8 i) {pair.set8(5,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetBroadphaseFlag(PfxBroadphasePair &pair,PfxUInt8 f) {pair.set8(6,(pair.get8(6)&0xf0)|(f&0x0f));}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetActive(PfxBroadphasePair &pair,PfxBool b) {pair.set8(6,(pair.get8(6)&0x0f)|((b?1:0)<<4));}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetContactId(PfxBroadphasePair &pair,PfxUInt32 i) {pair.set32(2,i);}
|
||||
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetObjectIdA(const PfxBroadphasePair &pair) {return pair.get16(0);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetObjectIdB(const PfxBroadphasePair &pair) {return pair.get16(1);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt8 pfxGetMotionMaskA(const PfxBroadphasePair &pair) {return pair.get8(4);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt8 pfxGetMotionMaskB(const PfxBroadphasePair &pair) {return pair.get8(5);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt8 pfxGetBroadphaseFlag(const PfxBroadphasePair &pair) {return pair.get8(6)&0x0f;}
|
||||
SCE_PFX_FORCE_INLINE PfxBool pfxGetActive(const PfxBroadphasePair &pair) {return (pair.get8(6)>>4)!=0;}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt32 pfxGetContactId(const PfxBroadphasePair &pair) {return pair.get32(2);}
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
#endif // _SCE_PFX_BROADPHASE_PAIR_H
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_BROADPHASE_PROXY_H
|
||||
#define _SCE_PFX_BROADPHASE_PROXY_H
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
typedef PfxSortData32 PfxBroadphaseProxy;
|
||||
|
||||
//J AABBパラメータはPfxAabbと共通
|
||||
//E PfxBroadphaseProxy shares AABB parameters with PfxAabb32
|
||||
|
||||
SCE_PFX_FORCE_INLINE void pfxSetObjectId(PfxBroadphaseProxy &proxy,PfxUInt16 i) {proxy.set16(6,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetMotionMask(PfxBroadphaseProxy &proxy,PfxUInt8 i) {proxy.set8(14,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetProxyFlag(PfxBroadphaseProxy &proxy,PfxUInt8 i) {proxy.set8(15,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetSelf(PfxBroadphaseProxy &proxy,PfxUInt32 i) {proxy.set32(5,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetTarget(PfxBroadphaseProxy &proxy,PfxUInt32 i) {proxy.set32(6,i);}
|
||||
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetObjectId(const PfxBroadphaseProxy &proxy) {return proxy.get16(6);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt8 pfxGetMotionMask(const PfxBroadphaseProxy &proxy) {return proxy.get8(14);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt8 pfxGetProxyFlag(const PfxBroadphaseProxy &proxy) {return proxy.get8(15);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt32 pfxGetSelf(const PfxBroadphaseProxy &proxy) {return proxy.get32(5);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt32 pfxGetTarget(const PfxBroadphaseProxy &proxy) {return proxy.get32(6);}
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#endif // _SCE_PFX_BROADPHASE_PROXY_H
|
||||
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_UPDATE_BROADPHASE_PROXY_H
|
||||
#define _SCE_PFX_UPDATE_BROADPHASE_PROXY_H
|
||||
|
||||
#include "pfx_broadphase_pair.h"
|
||||
#include "pfx_broadphase_proxy.h"
|
||||
#include "../rigidbody/pfx_rigid_state.h"
|
||||
#include "../collision/pfx_collidable.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Update Broadphase Proxy
|
||||
|
||||
//E For single axis
|
||||
//J 単一軸に対して作成
|
||||
PfxInt32 pfxUpdateBroadphaseProxy(
|
||||
PfxBroadphaseProxy &proxy,
|
||||
const PfxRigidState &state,
|
||||
const PfxCollidable &coll,
|
||||
const PfxVector3 &worldCenter,
|
||||
const PfxVector3 &worldExtent,
|
||||
PfxUInt32 axis);
|
||||
|
||||
PfxInt32 pfxUpdateBroadphaseProxy(
|
||||
PfxBroadphaseProxy &proxy,
|
||||
const PfxRigidState &state,
|
||||
const PfxVector3 &objectCenter,
|
||||
const PfxVector3 &objectHalf,
|
||||
const PfxVector3 &worldCenter,
|
||||
const PfxVector3 &worldExtent,
|
||||
PfxUInt32 axis);
|
||||
|
||||
//E For all axes
|
||||
//J 全軸に対して作成
|
||||
PfxInt32 pfxUpdateBroadphaseProxy(
|
||||
PfxBroadphaseProxy &proxyX,
|
||||
PfxBroadphaseProxy &proxyY,
|
||||
PfxBroadphaseProxy &proxyZ,
|
||||
PfxBroadphaseProxy &proxyXb,
|
||||
PfxBroadphaseProxy &proxyYb,
|
||||
PfxBroadphaseProxy &proxyZb,
|
||||
const PfxRigidState &state,
|
||||
const PfxCollidable &coll,
|
||||
const PfxVector3 &worldCenter,
|
||||
const PfxVector3 &worldExtent);
|
||||
|
||||
PfxInt32 pfxUpdateBroadphaseProxy(
|
||||
PfxBroadphaseProxy &proxyX,
|
||||
PfxBroadphaseProxy &proxyY,
|
||||
PfxBroadphaseProxy &proxyZ,
|
||||
PfxBroadphaseProxy &proxyXb,
|
||||
PfxBroadphaseProxy &proxyYb,
|
||||
PfxBroadphaseProxy &proxyZb,
|
||||
const PfxRigidState &state,
|
||||
const PfxVector3 &objectCenter,
|
||||
const PfxVector3 &objectHalf,
|
||||
const PfxVector3 &worldCenter,
|
||||
const PfxVector3 &worldExtent);
|
||||
|
||||
} // namespace PhysicsEffects
|
||||
} // namespace sce
|
||||
|
||||
#endif // _SCE_PFX_UPDATE_BROADPHASE_PROXY_H
|
||||
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_AABB_H
|
||||
#define _SCE_PFX_AABB_H
|
||||
|
||||
#include "../sort/pfx_sort_data.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
typedef PfxSortData16 PfxAabb16;
|
||||
typedef PfxSortData32 PfxAabb32;
|
||||
|
||||
SCE_PFX_FORCE_INLINE void pfxSetXMin(PfxAabb16& aabb,PfxUInt16 i) {aabb.set16(0,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetXMax(PfxAabb16& aabb,PfxUInt16 i) {aabb.set16(1,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetYMin(PfxAabb16& aabb,PfxUInt16 i) {aabb.set16(2,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetYMax(PfxAabb16& aabb,PfxUInt16 i) {aabb.set16(3,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetZMin(PfxAabb16& aabb,PfxUInt16 i) {aabb.set16(4,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetZMax(PfxAabb16& aabb,PfxUInt16 i) {aabb.set16(5,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetXYZMin(PfxAabb16 &aabb,PfxUInt16 i,int axis) {aabb.set16(axis<<1,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetXYZMax(PfxAabb16 &aabb,PfxUInt16 i,int axis) {aabb.set16((axis<<1)+1,i);}
|
||||
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetXMin(const PfxAabb16& aabb) {return aabb.get16(0);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetXMax(const PfxAabb16& aabb) {return aabb.get16(1);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetYMin(const PfxAabb16& aabb) {return aabb.get16(2);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetYMax(const PfxAabb16& aabb) {return aabb.get16(3);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetZMin(const PfxAabb16& aabb) {return aabb.get16(4);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetZMax(const PfxAabb16& aabb) {return aabb.get16(5);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetXYZMin(const PfxAabb16 &aabb,int axis) {return aabb.get16(axis<<1);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetXYZMax(const PfxAabb16 &aabb,int axis) {return aabb.get16((axis<<1)+1);}
|
||||
|
||||
SCE_PFX_FORCE_INLINE void pfxSetXMin(PfxAabb32& aabb,PfxUInt16 i) {aabb.set16(0,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetXMax(PfxAabb32& aabb,PfxUInt16 i) {aabb.set16(1,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetYMin(PfxAabb32& aabb,PfxUInt16 i) {aabb.set16(2,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetYMax(PfxAabb32& aabb,PfxUInt16 i) {aabb.set16(3,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetZMin(PfxAabb32& aabb,PfxUInt16 i) {aabb.set16(4,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetZMax(PfxAabb32& aabb,PfxUInt16 i) {aabb.set16(5,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetXYZMin(PfxAabb32 &aabb,PfxUInt16 i,int axis) {aabb.set16(axis<<1,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetXYZMax(PfxAabb32 &aabb,PfxUInt16 i,int axis) {aabb.set16((axis<<1)+1,i);}
|
||||
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetXMin(const PfxAabb32& aabb) {return aabb.get16(0);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetXMax(const PfxAabb32& aabb) {return aabb.get16(1);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetYMin(const PfxAabb32& aabb) {return aabb.get16(2);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetYMax(const PfxAabb32& aabb) {return aabb.get16(3);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetZMin(const PfxAabb32& aabb) {return aabb.get16(4);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetZMax(const PfxAabb32& aabb) {return aabb.get16(5);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetXYZMin(const PfxAabb32 &aabb,int axis) {return aabb.get16(axis<<1);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt16 pfxGetXYZMax(const PfxAabb32 &aabb,int axis) {return aabb.get16((axis<<1)+1);}
|
||||
|
||||
|
||||
#define SCE_PFX_TEST_AABB(aabbA,aabbB) \
|
||||
if(pfxGetXMax(aabbA) < pfxGetXMin(aabbB) || pfxGetXMin(aabbA) > pfxGetXMax(aabbB)) return false;\
|
||||
if(pfxGetYMax(aabbA) < pfxGetYMin(aabbB) || pfxGetYMin(aabbA) > pfxGetYMax(aabbB)) return false;\
|
||||
if(pfxGetZMax(aabbA) < pfxGetZMin(aabbB) || pfxGetZMin(aabbA) > pfxGetZMax(aabbB)) return false;\
|
||||
return true;
|
||||
|
||||
SCE_PFX_FORCE_INLINE
|
||||
bool pfxTestAabb(const PfxAabb16 &aabbA,const PfxAabb16 &aabbB)
|
||||
{
|
||||
SCE_PFX_TEST_AABB(aabbA,aabbB)
|
||||
}
|
||||
|
||||
SCE_PFX_FORCE_INLINE
|
||||
bool pfxTestAabb(const PfxAabb32 &aabbA,const PfxAabb32 &aabbB)
|
||||
{
|
||||
SCE_PFX_TEST_AABB(aabbA,aabbB)
|
||||
}
|
||||
|
||||
SCE_PFX_FORCE_INLINE
|
||||
bool pfxTestAabb(const PfxAabb32 &aabbA,const PfxAabb16 &aabbB)
|
||||
{
|
||||
SCE_PFX_TEST_AABB(aabbA,aabbB)
|
||||
}
|
||||
|
||||
SCE_PFX_FORCE_INLINE
|
||||
bool pfxTestAabb(const PfxAabb16 &aabbA,const PfxAabb32 &aabbB)
|
||||
{
|
||||
SCE_PFX_TEST_AABB(aabbA,aabbB)
|
||||
}
|
||||
|
||||
|
||||
SCE_PFX_FORCE_INLINE
|
||||
PfxAabb16 pfxMergeAabb(const PfxAabb16 &aabbA,const PfxAabb16 &aabbB)
|
||||
{
|
||||
PfxAabb16 aabb = aabbA;
|
||||
pfxSetXMin(aabb,SCE_PFX_MIN(pfxGetXMin(aabbA),pfxGetXMin(aabbB)));
|
||||
pfxSetXMax(aabb,SCE_PFX_MAX(pfxGetXMax(aabbA),pfxGetXMax(aabbB)));
|
||||
pfxSetYMin(aabb,SCE_PFX_MIN(pfxGetYMin(aabbA),pfxGetYMin(aabbB)));
|
||||
pfxSetYMax(aabb,SCE_PFX_MAX(pfxGetYMax(aabbA),pfxGetYMax(aabbB)));
|
||||
pfxSetZMin(aabb,SCE_PFX_MIN(pfxGetZMin(aabbA),pfxGetZMin(aabbB)));
|
||||
pfxSetZMax(aabb,SCE_PFX_MAX(pfxGetZMax(aabbA),pfxGetZMax(aabbB)));
|
||||
return aabb;
|
||||
}
|
||||
|
||||
SCE_PFX_FORCE_INLINE
|
||||
PfxAabb32 pfxMergeAabb(const PfxAabb32 &aabbA,const PfxAabb32 &aabbB)
|
||||
{
|
||||
PfxAabb32 aabb = aabbA;
|
||||
pfxSetXMin(aabb,SCE_PFX_MIN(pfxGetXMin(aabbA),pfxGetXMin(aabbB)));
|
||||
pfxSetXMax(aabb,SCE_PFX_MAX(pfxGetXMax(aabbA),pfxGetXMax(aabbB)));
|
||||
pfxSetYMin(aabb,SCE_PFX_MIN(pfxGetYMin(aabbA),pfxGetYMin(aabbB)));
|
||||
pfxSetYMax(aabb,SCE_PFX_MAX(pfxGetYMax(aabbA),pfxGetYMax(aabbB)));
|
||||
pfxSetZMin(aabb,SCE_PFX_MIN(pfxGetZMin(aabbA),pfxGetZMin(aabbB)));
|
||||
pfxSetZMax(aabb,SCE_PFX_MAX(pfxGetZMax(aabbA),pfxGetZMax(aabbB)));
|
||||
return aabb;
|
||||
}
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
#endif // _SCE_PFX_AABB_H
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_BOX_H
|
||||
#define _SCE_PFX_BOX_H
|
||||
|
||||
#include "../base/pfx_common.h"
|
||||
|
||||
namespace sce{
|
||||
namespace PhysicsEffects{
|
||||
struct PfxBox {
|
||||
PfxVector3 m_half;
|
||||
|
||||
inline PfxBox() {}
|
||||
inline PfxBox(const PfxVector3 SCE_VECTORMATH_AOS_VECTOR_ARG half);
|
||||
inline PfxBox(PfxFloat hx, PfxFloat hy, PfxFloat hz);
|
||||
|
||||
inline void set(const PfxVector3 SCE_VECTORMATH_AOS_VECTOR_ARG half);
|
||||
inline void set(PfxFloat hx, PfxFloat hy, PfxFloat hz);
|
||||
};
|
||||
|
||||
inline
|
||||
PfxBox::PfxBox(const PfxVector3 SCE_VECTORMATH_AOS_VECTOR_ARG half)
|
||||
{
|
||||
set(half);
|
||||
}
|
||||
|
||||
inline
|
||||
PfxBox::PfxBox(PfxFloat hx, PfxFloat hy, PfxFloat hz)
|
||||
{
|
||||
set(hx, hy, hz);
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxBox::set(const PfxVector3 SCE_VECTORMATH_AOS_VECTOR_ARG half)
|
||||
{
|
||||
m_half = half;
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxBox::set(PfxFloat hx, PfxFloat hy, PfxFloat hz)
|
||||
{
|
||||
m_half = PfxVector3(hx, hy, hz);
|
||||
}
|
||||
} // namespace PhysicsEffects
|
||||
} // namespace sce
|
||||
|
||||
#endif // _SCE_PFX_BOX_H
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_CAPSULE_H
|
||||
#define _SCE_PFX_CAPSULE_H
|
||||
|
||||
#include "../base/pfx_common.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
struct PfxCapsule
|
||||
{
|
||||
PfxFloat m_halfLen;
|
||||
PfxFloat m_radius;
|
||||
|
||||
PfxCapsule() {}
|
||||
PfxCapsule(PfxFloat halfLength, PfxFloat radius);
|
||||
|
||||
void set(PfxFloat halfLength, PfxFloat radius);
|
||||
};
|
||||
|
||||
inline
|
||||
PfxCapsule::PfxCapsule(PfxFloat halfLength, PfxFloat radius)
|
||||
{
|
||||
m_halfLen = halfLength;
|
||||
m_radius = radius;
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxCapsule::set(PfxFloat halfLength, PfxFloat radius)
|
||||
{
|
||||
m_halfLen = halfLength;
|
||||
m_radius = radius;
|
||||
}
|
||||
|
||||
} // namespace PhysicsEffects
|
||||
} // namespace sce
|
||||
|
||||
#endif // _SCE_PFX_CAPSULE_H
|
||||
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_COLLIDABLE_H
|
||||
#define _SCE_PFX_COLLIDABLE_H
|
||||
|
||||
#include "pfx_shape.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
#define SCE_PFX_NUMPRIMS 64
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Collidable Object
|
||||
|
||||
class SCE_PFX_ALIGNED(128) PfxCollidable
|
||||
{
|
||||
friend class PfxShapeIterator;
|
||||
|
||||
private:
|
||||
PfxShape *m_shapeBase;
|
||||
PfxUInt16 m_shapeIds[SCE_PFX_NUMPRIMS];
|
||||
PfxUInt8 m_numShapes;
|
||||
PfxUInt8 m_maxShapes;
|
||||
SCE_PFX_PADDING(1,2)
|
||||
PfxFloat m_center[3]; // AABB center (Local)
|
||||
PfxFloat m_half[3]; // AABB half (Local)
|
||||
PfxShape m_defShape;
|
||||
SCE_PFX_PADDING(2,32)
|
||||
|
||||
inline PfxShape &getNewShape();
|
||||
|
||||
public:
|
||||
inline void reset();
|
||||
inline void reset(PfxShape *base,PfxUInt16 *ids,int n=1);
|
||||
|
||||
void finish();
|
||||
|
||||
void addShape(const PfxShape &shape);
|
||||
|
||||
inline PfxUInt32 getNumShapes() const;
|
||||
const PfxShape& getDefShape() const {return m_defShape;}
|
||||
PfxShape& getDefShape() {return m_defShape;}
|
||||
|
||||
inline PfxUInt16 getShapeId(int i) const;
|
||||
|
||||
inline const PfxShape& getShape(int i) const;
|
||||
inline PfxShape& getShape(int i);
|
||||
|
||||
inline PfxVector3 getHalf() const;
|
||||
inline PfxVector3 getCenter() const;
|
||||
};
|
||||
|
||||
#include "pfx_collidable_implementation.h"
|
||||
|
||||
} // namespace PhysicsEffects
|
||||
} // namespace sce
|
||||
|
||||
#endif // _SCE_PFX_COLLIDABLE_H
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_COLLIDABLE_IMPLEMENTATION_H
|
||||
#define _SCE_PFX_COLLIDABLE_IMPLEMENTATION_H
|
||||
|
||||
inline
|
||||
void PfxCollidable::reset()
|
||||
{
|
||||
m_shapeBase = NULL;
|
||||
m_numShapes = 0;
|
||||
m_maxShapes = 1;
|
||||
m_center[0] = 0.0f;
|
||||
m_center[1] = 0.0f;
|
||||
m_center[2] = 0.0f;
|
||||
m_half[0] = 0.0f;
|
||||
m_half[1] = 0.0f;
|
||||
m_half[2] = 0.0f;
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxCollidable::reset(PfxShape *base,PfxUInt16 *ids,int n)
|
||||
{
|
||||
m_shapeBase = base;
|
||||
m_numShapes = 0;
|
||||
m_maxShapes = n;
|
||||
for(int i=0;i<n;i++) {
|
||||
m_shapeIds[i] = ids[i];
|
||||
}
|
||||
m_center[0] = 0.0f;
|
||||
m_center[1] = 0.0f;
|
||||
m_center[2] = 0.0f;
|
||||
m_half[0] = 0.0f;
|
||||
m_half[1] = 0.0f;
|
||||
m_half[2] = 0.0f;
|
||||
}
|
||||
|
||||
inline
|
||||
PfxUInt32 PfxCollidable::getNumShapes() const
|
||||
{
|
||||
return m_numShapes;
|
||||
}
|
||||
|
||||
inline
|
||||
PfxUInt16 PfxCollidable::getShapeId(int i) const
|
||||
{
|
||||
SCE_PFX_ASSERT(i>0);
|
||||
return m_shapeIds[i-1];
|
||||
}
|
||||
|
||||
inline
|
||||
const PfxShape& PfxCollidable::getShape(int i) const
|
||||
{
|
||||
SCE_PFX_ASSERT(i<m_numShapes);
|
||||
if(i>0) {
|
||||
return m_shapeBase[m_shapeIds[i-1]];
|
||||
}
|
||||
else {
|
||||
return m_defShape;
|
||||
}
|
||||
}
|
||||
|
||||
inline
|
||||
PfxShape& PfxCollidable::getShape(int i)
|
||||
{
|
||||
SCE_PFX_ASSERT(i<m_numShapes);
|
||||
if(i>0) {
|
||||
return m_shapeBase[m_shapeIds[i-1]];
|
||||
}
|
||||
else {
|
||||
return m_defShape;
|
||||
}
|
||||
}
|
||||
|
||||
inline
|
||||
PfxShape &PfxCollidable::getNewShape()
|
||||
{
|
||||
SCE_PFX_ASSERT(m_numShapes<=m_maxShapes);
|
||||
if(m_numShapes == 0) {
|
||||
m_numShapes++;
|
||||
return m_defShape;
|
||||
}
|
||||
else {
|
||||
m_numShapes++;
|
||||
return m_shapeBase[m_shapeIds[m_numShapes-2]];
|
||||
}
|
||||
}
|
||||
|
||||
inline
|
||||
PfxVector3 PfxCollidable::getHalf() const
|
||||
{
|
||||
return pfxReadVector3(m_half);
|
||||
}
|
||||
|
||||
inline
|
||||
PfxVector3 PfxCollidable::getCenter() const
|
||||
{
|
||||
return pfxReadVector3(m_center);
|
||||
}
|
||||
|
||||
#endif // _SCE_PFX_COLLIDABLE_IMPLEMENTATION_H
|
||||
@@ -0,0 +1,135 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_CONTACT_MANIFOLD_H
|
||||
#define _SCE_PFX_CONTACT_MANIFOLD_H
|
||||
|
||||
#include "../base/pfx_common.h"
|
||||
#include "../base/pfx_vec_utils.h"
|
||||
#include "pfx_sub_data.h"
|
||||
#include "../solver/pfx_constraint_row.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
#define SCE_PFX_NUMCONTACTS_PER_BODIES 4
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Contact Point
|
||||
|
||||
struct PfxContactPoint
|
||||
{
|
||||
PfxUInt8 m_duration;
|
||||
PfxUInt8 m_shapeIdA;
|
||||
PfxUInt8 m_shapeIdB;
|
||||
SCE_PFX_PADDING(1,1)
|
||||
PfxSubData m_subData;
|
||||
PfxFloat m_distance;
|
||||
PfxFloat m_localPointA[3];
|
||||
PfxFloat m_localPointB[3];
|
||||
SCE_PFX_PADDING(2,8)
|
||||
PfxConstraintRow m_constraintRow[3];
|
||||
|
||||
void reset()
|
||||
{
|
||||
m_duration = 0;
|
||||
m_shapeIdA = m_shapeIdB = 0;
|
||||
m_subData = PfxSubData();
|
||||
m_distance = SCE_PFX_FLT_MAX;
|
||||
m_constraintRow[0].m_accumImpulse = 0.0f;
|
||||
m_constraintRow[1].m_accumImpulse = 0.0f;
|
||||
m_constraintRow[2].m_accumImpulse = 0.0f;
|
||||
}
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Contact Manifold
|
||||
|
||||
//J 同一ペアの衝突が続く限り保持されるコンタクト情報
|
||||
//E PfxContactManifold keeps contact information until two rigid bodies are separated.
|
||||
|
||||
class SCE_PFX_ALIGNED(128) PfxContactManifold
|
||||
{
|
||||
private:
|
||||
PfxUInt16 m_rigidBodyIdA,m_rigidBodyIdB;
|
||||
PfxUInt16 m_duration;
|
||||
PfxUInt16 m_numContacts;
|
||||
PfxFloat m_compositeFriction;
|
||||
PfxUInt32 m_internalFlag;
|
||||
PfxContactPoint m_contactPoints[SCE_PFX_NUMCONTACTS_PER_BODIES];
|
||||
void *m_userData;
|
||||
PfxUInt32 m_userParam[4];
|
||||
SCE_PFX_PADDING(1,28)
|
||||
|
||||
int findNearestContactPoint(const PfxPoint3 &newPoint,const PfxVector3 &newNormal);
|
||||
int sort4ContactPoints(const PfxPoint3 &newPoint,PfxFloat newDistance);
|
||||
|
||||
public:
|
||||
// Internal method
|
||||
PfxFloat getCompositeFriction() const {return m_compositeFriction;}
|
||||
void setCompositeFriction(PfxFloat f) {m_compositeFriction = f;}
|
||||
|
||||
PfxUInt32 getInternalFlag() const {return m_internalFlag;}
|
||||
void setInternalFlag(PfxUInt32 f) {m_internalFlag = f;}
|
||||
|
||||
public:
|
||||
void reset(PfxUInt16 rigidBodyIdA,PfxUInt16 rigidBodyIdB)
|
||||
{
|
||||
m_userData = 0;
|
||||
m_userParam[0] = m_userParam[1] = m_userParam[2] = m_userParam[3] = 0;
|
||||
m_numContacts = 0;
|
||||
m_duration = 0;
|
||||
m_rigidBodyIdA = rigidBodyIdA;
|
||||
m_rigidBodyIdB = rigidBodyIdB;
|
||||
}
|
||||
|
||||
void addContactPoint(
|
||||
PfxFloat newDistance,
|
||||
const PfxVector3 &newNormal, // world coords
|
||||
const PfxPoint3 &newPointA, // local coords to the objectA
|
||||
const PfxPoint3 &newPointB, // local coords to the objectB
|
||||
PfxSubData subData);
|
||||
|
||||
void addContactPoint(const PfxContactPoint &cp);
|
||||
|
||||
void removeContactPoint(int i)
|
||||
{
|
||||
SCE_PFX_ASSERT(i>=0&&i<m_numContacts);
|
||||
m_contactPoints[i] = m_contactPoints[m_numContacts-1];
|
||||
m_numContacts--;
|
||||
}
|
||||
|
||||
int getNumContacts() const {return (int)m_numContacts;}
|
||||
|
||||
PfxContactPoint &getContactPoint(int i) {return m_contactPoints[i];}
|
||||
|
||||
const PfxContactPoint &getContactPoint(int i) const {return m_contactPoints[i];}
|
||||
|
||||
void refresh(const PfxVector3 &pA,const PfxQuat &qA,const PfxVector3 &pB,const PfxQuat &qB);
|
||||
|
||||
void merge(const PfxContactManifold &contact);
|
||||
|
||||
PfxUInt16 getDuration() const {return m_duration;}
|
||||
|
||||
PfxUInt16 getRigidBodyIdA() const {return m_rigidBodyIdA;}
|
||||
|
||||
PfxUInt16 getRigidBodyIdB() const {return m_rigidBodyIdB;}
|
||||
};
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
#endif // _SCE_PFX_CONTACT_MANIFOLD_H
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_CYLINDER_H
|
||||
#define _SCE_PFX_CYLINDER_H
|
||||
|
||||
#include "../base/pfx_common.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
struct PfxCylinder
|
||||
{
|
||||
PfxFloat m_halfLen;
|
||||
PfxFloat m_radius;
|
||||
|
||||
PfxCylinder() {}
|
||||
PfxCylinder(PfxFloat halfLength, PfxFloat radius);
|
||||
|
||||
void set(PfxFloat halfLength, PfxFloat radius);
|
||||
};
|
||||
|
||||
inline
|
||||
PfxCylinder::PfxCylinder(PfxFloat halfLength, PfxFloat radius)
|
||||
{
|
||||
m_halfLen = halfLength;
|
||||
m_radius = radius;
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxCylinder::set(PfxFloat halfLength, PfxFloat radius)
|
||||
{
|
||||
m_halfLen = halfLength;
|
||||
m_radius = radius;
|
||||
}
|
||||
|
||||
} // namespace PhysicsEffects
|
||||
} // namespace sce
|
||||
|
||||
#endif // _SCE_PFX_CYLINDER_H
|
||||
@@ -0,0 +1,122 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_LARGE_TRI_MESH_H
|
||||
#define _SCE_PFX_LARGE_TRI_MESH_H
|
||||
|
||||
#include "pfx_tri_mesh.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
#define SCE_PFX_MAX_LARGETRIMESH_ISLANDS 256
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Large Mesh
|
||||
|
||||
class SCE_PFX_ALIGNED(16) PfxLargeTriMesh
|
||||
{
|
||||
public:
|
||||
//J ラージメッシュのサイズ
|
||||
//E Size of a large mesh
|
||||
PfxVector3 m_half;
|
||||
|
||||
//J 含まれるメッシュの総数
|
||||
//E Number of mesh groups
|
||||
PfxUInt16 m_numIslands;
|
||||
|
||||
//J アイランドAABB配列(ソート済み)
|
||||
//E Array of island AABB (Sorted)
|
||||
PfxUInt8 m_axis; // 0 = X , 1 = Y , 2 = Z
|
||||
SCE_PFX_PADDING(1,1)
|
||||
PfxAabb16 *m_aabbList;
|
||||
SCE_PFX_PADDING(2,4)
|
||||
|
||||
//J アイランド配列
|
||||
//E Array of island
|
||||
PfxTriMesh *m_islands;
|
||||
|
||||
PfxLargeTriMesh()
|
||||
{
|
||||
m_numIslands = 0;
|
||||
m_islands = NULL;
|
||||
m_aabbList = NULL;
|
||||
}
|
||||
|
||||
inline bool testAABB(int islandId,const PfxVector3 ¢er,const PfxVector3 &half) const;
|
||||
|
||||
//J ワールド座標値をラージメッシュローカルに変換する
|
||||
//E Convert a position in the world coordinate into a position in the local coordinate
|
||||
inline PfxVecInt3 getLocalPosition(const PfxVector3 &worldPosition) const;
|
||||
inline void getLocalPosition(
|
||||
const PfxVector3 &worldMinPosition,const PfxVector3 &worldMaxPosition,
|
||||
PfxVecInt3 &localMinPosition,PfxVecInt3 &localMaxPosition) const;
|
||||
|
||||
//J ラージメッシュローカル座標値をワールドに変換する
|
||||
//E Convert a position in the local coordinate into a position in the world coordinate
|
||||
inline PfxVector3 getWorldPosition(const PfxVecInt3 &localPosition) const;
|
||||
};
|
||||
|
||||
inline
|
||||
bool PfxLargeTriMesh::testAABB(int islandId,const PfxVector3 ¢er,const PfxVector3 &half) const
|
||||
{
|
||||
PfxVecInt3 aabbMinL = getLocalPosition(center-half);
|
||||
PfxVecInt3 aabbMaxL = getLocalPosition(center+half);
|
||||
|
||||
if(aabbMaxL.getX() < pfxGetXMin(m_aabbList[islandId]) || aabbMinL.getX() > pfxGetXMax(m_aabbList[islandId])) return false;
|
||||
if(aabbMaxL.getY() < pfxGetYMin(m_aabbList[islandId]) || aabbMinL.getY() > pfxGetYMax(m_aabbList[islandId])) return false;
|
||||
if(aabbMaxL.getZ() < pfxGetZMin(m_aabbList[islandId]) || aabbMinL.getZ() > pfxGetZMax(m_aabbList[islandId])) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
inline
|
||||
PfxVecInt3 PfxLargeTriMesh::getLocalPosition(const PfxVector3 &worldPosition) const
|
||||
{
|
||||
const PfxVector3 sz(65535.0f);
|
||||
PfxVector3 tmp = divPerElem(worldPosition+m_half,2.0f*m_half);
|
||||
tmp = mulPerElem(sz,minPerElem(maxPerElem(tmp,PfxVector3(0.0f)),PfxVector3(1.0f))); // clamp 0.0 - 1.0
|
||||
return PfxVecInt3(tmp);
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxLargeTriMesh::getLocalPosition(
|
||||
const PfxVector3 &worldMinPosition,const PfxVector3 &worldMaxPosition,
|
||||
PfxVecInt3 &localMinPosition,PfxVecInt3 &localMaxPosition) const
|
||||
{
|
||||
const PfxVector3 sz(65535.0f);
|
||||
PfxVector3 qmin = divPerElem(worldMinPosition+m_half,2.0f*m_half);
|
||||
qmin = mulPerElem(sz,minPerElem(maxPerElem(qmin,PfxVector3(0.0f)),PfxVector3(1.0f))); // clamp 0.0 - 1.0
|
||||
|
||||
PfxVector3 qmax = divPerElem(worldMaxPosition+m_half,2.0f*m_half);
|
||||
qmax = mulPerElem(sz,minPerElem(maxPerElem(qmax,PfxVector3(0.0f)),PfxVector3(1.0f))); // clamp 0.0 - 1.0
|
||||
|
||||
localMinPosition = PfxVecInt3(floorf(qmin[0]),floorf(qmin[1]),floorf(qmin[2]));
|
||||
localMaxPosition = PfxVecInt3(ceilf(qmax[0]),ceilf(qmax[1]),ceilf(qmax[2]));
|
||||
}
|
||||
|
||||
inline
|
||||
PfxVector3 PfxLargeTriMesh::getWorldPosition(const PfxVecInt3 &localPosition) const
|
||||
{
|
||||
PfxVector3 sz(65535.0f),lp(localPosition);
|
||||
PfxVector3 tmp = divPerElem(lp,sz);
|
||||
return mulPerElem(tmp,2.0f*m_half) - m_half;
|
||||
}
|
||||
|
||||
} // namespace PhysicsEffects
|
||||
} // namespace sce
|
||||
|
||||
#endif // _SCE_PFX_LARGE_TRI_MESH_H
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_RAY_H
|
||||
#define _SCE_PFX_RAY_H
|
||||
|
||||
#include "../base/pfx_common.h"
|
||||
#include "pfx_sub_data.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
#define SCE_PFX_RAY_FACET_MODE_FRONT_ONLY 0
|
||||
#define SCE_PFX_RAY_FACET_MODE_BACK_ONLY 1
|
||||
#define SCE_PFX_RAY_FACET_MODE_FRONT_AND_BACK 2
|
||||
|
||||
struct SCE_PFX_ALIGNED(16) PfxRayInput
|
||||
{
|
||||
PfxVector3 m_startPosition;
|
||||
PfxVector3 m_direction;
|
||||
PfxUInt32 m_contactFilterSelf;
|
||||
PfxUInt32 m_contactFilterTarget;
|
||||
PfxUInt8 m_facetMode;
|
||||
SCE_PFX_PADDING(1,7)
|
||||
|
||||
void reset()
|
||||
{
|
||||
m_contactFilterSelf = m_contactFilterTarget = 0xffffffff;
|
||||
m_facetMode = SCE_PFX_RAY_FACET_MODE_FRONT_ONLY;
|
||||
}
|
||||
};
|
||||
|
||||
struct SCE_PFX_ALIGNED(16) PfxRayOutput
|
||||
{
|
||||
PfxVector3 m_contactPoint;
|
||||
PfxVector3 m_contactNormal;
|
||||
PfxFloat m_variable;
|
||||
PfxUInt16 m_objectId;
|
||||
PfxUInt8 m_shapeId;
|
||||
PfxBool m_contactFlag : 1;
|
||||
PfxSubData m_subData;
|
||||
};
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
#endif // _SCE_PFX_RAY_H
|
||||
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_SHAPE_H
|
||||
#define _SCE_PFX_SHAPE_H
|
||||
|
||||
#include "../base/pfx_common.h"
|
||||
#include "../base/pfx_vec_utils.h"
|
||||
#include "pfx_box.h"
|
||||
#include "pfx_sphere.h"
|
||||
#include "pfx_capsule.h"
|
||||
#include "pfx_cylinder.h"
|
||||
#include "pfx_tri_mesh.h"
|
||||
#include "pfx_large_tri_mesh.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
enum ePfxShapeType
|
||||
{
|
||||
kPfxShapeSphere = 0,
|
||||
kPfxShapeBox,
|
||||
kPfxShapeCapsule,
|
||||
kPfxShapeCylinder,
|
||||
kPfxShapeConvexMesh,
|
||||
kPfxShapeLargeTriMesh,
|
||||
kPfxShapeReserved0,
|
||||
kPfxShapeReserved1,
|
||||
kPfxShapeReserved2,
|
||||
kPfxShapeUser0,
|
||||
kPfxShapeUser1,
|
||||
kPfxShapeUser2,
|
||||
kPfxShapeCount // =12
|
||||
};
|
||||
|
||||
class SCE_PFX_ALIGNED(16) PfxShape
|
||||
{
|
||||
friend class PfxCollidable;
|
||||
|
||||
private:
|
||||
union {
|
||||
PfxFloat m_vecDataF[3];
|
||||
PfxUInt32 m_vecDataI[3];
|
||||
void *m_vecDataPtr[2];
|
||||
};
|
||||
PfxUInt8 m_type;
|
||||
SCE_PFX_PADDING(1,3)
|
||||
PfxFloat m_offsetPosition[3];
|
||||
PfxFloat m_offsetOrientation[4];
|
||||
PfxUInt32 m_contactFilterSelf;
|
||||
PfxUInt32 m_contactFilterTarget;
|
||||
SCE_PFX_PADDING(2,12)
|
||||
|
||||
public:
|
||||
inline void reset();
|
||||
|
||||
// Shape
|
||||
inline void setBox(PfxBox SCE_VECTORMATH_AOS_VECTOR_ARG box);
|
||||
inline void setCapsule(PfxCapsule capsule);
|
||||
inline void setCylinder(PfxCylinder cylinder);
|
||||
inline void setSphere(PfxSphere sphere);
|
||||
inline void setConvexMesh(const PfxConvexMesh *convexMesh);
|
||||
inline void setLargeTriMesh(const PfxLargeTriMesh *largeMesh);
|
||||
|
||||
inline PfxUInt8 getType() const;
|
||||
inline PfxBox getBox()const ;
|
||||
inline PfxCapsule getCapsule() const;
|
||||
inline PfxCylinder getCylinder() const;
|
||||
inline PfxSphere getSphere() const;
|
||||
inline const PfxConvexMesh* getConvexMesh() const;
|
||||
inline const PfxLargeTriMesh* getLargeTriMesh() const;
|
||||
|
||||
// Offset
|
||||
inline void setOffsetTransform(const PfxTransform3 & xfrm);
|
||||
inline void setOffsetOrientation(const PfxQuat SCE_VECTORMATH_AOS_VECTOR_ARG rot) {return pfxStoreQuat(rot,m_offsetOrientation);}
|
||||
inline void setOffsetPosition(const PfxVector3 SCE_VECTORMATH_AOS_VECTOR_ARG pos) {return pfxStoreVector3(pos,m_offsetPosition);}
|
||||
|
||||
inline PfxTransform3 getOffsetTransform() const;
|
||||
inline PfxVector3 getOffsetPosition() const {return pfxReadVector3(m_offsetPosition);}
|
||||
inline PfxQuat getOffsetOrientation() const {return pfxReadQuat(m_offsetOrientation);}
|
||||
|
||||
// Raw data access
|
||||
inline void setDataFloat(int i,PfxFloat v) {m_vecDataF[i]=v;}
|
||||
inline void setDataInteger(int i,PfxUInt32 v) {m_vecDataI[i]=v;}
|
||||
|
||||
inline PfxFloat getDataFloat(int i) const {return m_vecDataF[i];}
|
||||
inline PfxUInt32 getDataInteger(int i) const {return m_vecDataI[i];}
|
||||
|
||||
// Contact Filter
|
||||
PfxUInt32 getContactFilterSelf() const {return m_contactFilterSelf;}
|
||||
void setContactFilterSelf(PfxUInt32 filter) {m_contactFilterSelf = filter;}
|
||||
|
||||
PfxUInt32 getContactFilterTarget() const {return m_contactFilterTarget;}
|
||||
void setContactFilterTarget(PfxUInt32 filter) {m_contactFilterTarget = filter;}
|
||||
|
||||
// Bouding Volume
|
||||
void getAabb(PfxVector3 &aabbMin,PfxVector3 &aabbMax) const;
|
||||
};
|
||||
|
||||
#include "pfx_shape_implementation.h"
|
||||
|
||||
} // namespace PhysicsEffects
|
||||
} // namespace sce
|
||||
|
||||
#endif // _SCE_PFX_SHAPE_H
|
||||
@@ -0,0 +1,145 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_SHAPE_IMPLEMENTATION_H
|
||||
#define _SCE_PFX_SHAPE_IMPLEMENTATION_H
|
||||
|
||||
inline
|
||||
void PfxShape::reset()
|
||||
{
|
||||
m_type = kPfxShapeSphere;
|
||||
m_offsetPosition[0] = m_offsetPosition[1] = m_offsetPosition[2]= 0.0f;
|
||||
m_offsetOrientation[0] = m_offsetOrientation[1] = m_offsetOrientation[2]= 0.0f;
|
||||
m_offsetOrientation[3] = 1.0f;
|
||||
m_contactFilterSelf = m_contactFilterTarget = 0xffffffff;
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxShape::setBox(PfxBox SCE_VECTORMATH_AOS_VECTOR_ARG box)
|
||||
{
|
||||
m_vecDataF[0] = box.m_half[0];
|
||||
m_vecDataF[1] = box.m_half[1];
|
||||
m_vecDataF[2] = box.m_half[2];
|
||||
m_type = kPfxShapeBox;
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxShape::setCapsule(PfxCapsule capsule)
|
||||
{
|
||||
m_vecDataF[0] = capsule.m_halfLen;
|
||||
m_vecDataF[1] = capsule.m_radius;
|
||||
m_vecDataF[2] = 0.0f;
|
||||
m_type = kPfxShapeCapsule;
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxShape::setCylinder(PfxCylinder cylinder)
|
||||
{
|
||||
m_vecDataF[0] = cylinder.m_halfLen;
|
||||
m_vecDataF[1] = cylinder.m_radius;
|
||||
m_vecDataF[2] = 0.0f;
|
||||
m_type = kPfxShapeCylinder;
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxShape::setSphere(PfxSphere sphere)
|
||||
{
|
||||
m_vecDataF[0] = sphere.m_radius;
|
||||
m_vecDataF[1] = 0.0f;
|
||||
m_vecDataF[2] = 0.0f;
|
||||
m_type = kPfxShapeSphere;
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxShape::setConvexMesh(const PfxConvexMesh *convexMesh)
|
||||
{
|
||||
m_vecDataPtr[0] = (void*)convexMesh;
|
||||
m_vecDataPtr[1] = NULL;
|
||||
m_type = kPfxShapeConvexMesh;
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxShape::setLargeTriMesh(const PfxLargeTriMesh *largeMesh)
|
||||
{
|
||||
m_vecDataPtr[0] = (void*)largeMesh;
|
||||
m_vecDataPtr[1] = NULL;
|
||||
m_type = kPfxShapeLargeTriMesh;
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxShape::setOffsetTransform(const PfxTransform3 & xfrm)
|
||||
{
|
||||
setOffsetOrientation(PfxQuat(xfrm.getUpper3x3()));
|
||||
setOffsetPosition(xfrm.getTranslation());
|
||||
}
|
||||
|
||||
inline
|
||||
PfxUInt8 PfxShape::getType() const
|
||||
{
|
||||
return m_type;
|
||||
}
|
||||
|
||||
inline
|
||||
PfxBox PfxShape::getBox() const
|
||||
{
|
||||
SCE_PFX_ALWAYS_ASSERT(m_type==kPfxShapeBox);
|
||||
return PfxBox(m_vecDataF[0],m_vecDataF[1],m_vecDataF[2]);
|
||||
}
|
||||
|
||||
inline
|
||||
PfxCapsule PfxShape::getCapsule() const
|
||||
{
|
||||
SCE_PFX_ALWAYS_ASSERT(m_type==kPfxShapeCapsule);
|
||||
return PfxCapsule(m_vecDataF[0], m_vecDataF[1]);
|
||||
}
|
||||
|
||||
inline
|
||||
PfxCylinder PfxShape::getCylinder() const
|
||||
{
|
||||
SCE_PFX_ALWAYS_ASSERT(m_type==kPfxShapeCylinder);
|
||||
return PfxCylinder(m_vecDataF[0], m_vecDataF[1]);
|
||||
}
|
||||
|
||||
inline
|
||||
PfxSphere PfxShape::getSphere() const
|
||||
{
|
||||
SCE_PFX_ALWAYS_ASSERT(m_type==kPfxShapeSphere);
|
||||
return PfxSphere(m_vecDataF[0]);
|
||||
}
|
||||
|
||||
inline
|
||||
const PfxConvexMesh *PfxShape::getConvexMesh() const
|
||||
{
|
||||
SCE_PFX_ALWAYS_ASSERT(m_type==kPfxShapeConvexMesh);
|
||||
SCE_PFX_ALWAYS_ASSERT(m_vecDataPtr[0]!=NULL);
|
||||
return (PfxConvexMesh*)m_vecDataPtr[0];
|
||||
}
|
||||
|
||||
inline
|
||||
const PfxLargeTriMesh *PfxShape::getLargeTriMesh() const
|
||||
{
|
||||
SCE_PFX_ALWAYS_ASSERT(m_type==kPfxShapeLargeTriMesh);
|
||||
SCE_PFX_ALWAYS_ASSERT(m_vecDataPtr[0]!=NULL);
|
||||
return (PfxLargeTriMesh*)m_vecDataPtr[0];
|
||||
}
|
||||
|
||||
inline
|
||||
PfxTransform3 PfxShape::getOffsetTransform() const
|
||||
{
|
||||
return PfxTransform3(getOffsetOrientation(),getOffsetPosition());
|
||||
}
|
||||
|
||||
#endif // _SCE_PFX_SHAPE_IMPLEMENTATION_H
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_SHAPE_ITERATOR_H
|
||||
#define _SCE_PFX_SHAPE_ITERATOR_H
|
||||
|
||||
#include "pfx_collidable.h"
|
||||
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
class PfxShapeIterator
|
||||
{
|
||||
private:
|
||||
PfxUInt32 m_numShapes;
|
||||
PfxShape *m_shapeBase;
|
||||
const PfxUInt16 *m_shapeIds;
|
||||
const PfxShape *m_curShape;
|
||||
PfxUInt32 m_index;
|
||||
|
||||
public:
|
||||
PfxShapeIterator(const PfxCollidable &coll) : m_shapeIds(coll.m_shapeIds)
|
||||
{
|
||||
m_numShapes = coll.m_numShapes;
|
||||
m_shapeBase = coll.m_shapeBase;
|
||||
m_index = 0;
|
||||
m_curShape = &coll.m_defShape;
|
||||
}
|
||||
|
||||
~PfxShapeIterator() {}
|
||||
|
||||
inline PfxShapeIterator& operator++()
|
||||
{
|
||||
m_curShape = &m_shapeBase[m_shapeIds[m_index++]];
|
||||
return *this;
|
||||
}
|
||||
|
||||
const PfxShape& operator*() const {return *m_curShape;}
|
||||
};
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
#endif // _SCE_PFX_SHAPE_ITERATOR_H
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_SPHERE_H
|
||||
#define _SCE_PFX_SPHERE_H
|
||||
|
||||
#include "../base/pfx_common.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
struct PfxSphere {
|
||||
PfxFloat m_radius;
|
||||
|
||||
PfxSphere() {}
|
||||
PfxSphere( PfxFloat radius );
|
||||
|
||||
void set( PfxFloat radius );
|
||||
};
|
||||
|
||||
inline
|
||||
PfxSphere::PfxSphere( PfxFloat radius )
|
||||
{
|
||||
m_radius = radius;
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxSphere::set( PfxFloat radius )
|
||||
{
|
||||
m_radius = radius;
|
||||
}
|
||||
|
||||
} // namespace PhysicsEffects
|
||||
} // namespace sce
|
||||
|
||||
#endif // _SCE_PFX_SPHERE_H
|
||||
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_SUB_DATA_H
|
||||
#define _SCE_PFX_SUB_DATA_H
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
struct PfxSubData {
|
||||
enum {
|
||||
NONE = 0,
|
||||
MESH_INFO
|
||||
};
|
||||
|
||||
union {
|
||||
struct {
|
||||
PfxUInt8 m_type;
|
||||
SCE_PFX_PADDING(1,1)
|
||||
|
||||
struct {
|
||||
PfxUInt8 islandId;
|
||||
PfxUInt8 facetId;
|
||||
PfxUInt16 s;
|
||||
PfxUInt16 t;
|
||||
|
||||
} m_facetLocal;
|
||||
};
|
||||
PfxUInt32 param[2];
|
||||
};
|
||||
|
||||
PfxSubData()
|
||||
{
|
||||
param[0] = param[1] = 0;
|
||||
}
|
||||
|
||||
void setIslandId(PfxUInt8 i) {m_facetLocal.islandId = i;}
|
||||
void setFacetId(PfxUInt8 i) {m_facetLocal.facetId = i;}
|
||||
void setFacetLocalS(PfxFloat s) {m_facetLocal.s = (PfxUInt16)(s * 65535.0f);}
|
||||
void setFacetLocalT(PfxFloat t) {m_facetLocal.t = (PfxUInt16)(t * 65535.0f);}
|
||||
|
||||
PfxUInt8 getIslandId() {return m_facetLocal.islandId;}
|
||||
PfxUInt8 getFacetId() {return m_facetLocal.facetId;}
|
||||
PfxFloat getFacetLocalS() {return m_facetLocal.s / 65535.0f;}
|
||||
PfxFloat getFacetLocalT() {return m_facetLocal.t / 65535.0f;}
|
||||
};
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#endif // _SCE_PFX_SUB_DATA_H
|
||||
@@ -0,0 +1,154 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_TRI_MESH_H
|
||||
#define _SCE_PFX_TRI_MESH_H
|
||||
|
||||
#include "../base/pfx_common.h"
|
||||
#include "../base/pfx_vec_utils.h"
|
||||
#include "pfx_aabb.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
//J メッシュのリソース制限
|
||||
//E Define some limitations of a triangle mesh
|
||||
#define SCE_PFX_NUMMESHFACETS 64
|
||||
#define SCE_PFX_NUMMESHEDGES 192
|
||||
#define SCE_PFX_NUMMESHVERTICES 128
|
||||
|
||||
//J エッジの角
|
||||
//E Edge types
|
||||
#define SCE_PFX_EDGE_FLAT 0
|
||||
#define SCE_PFX_EDGE_CONVEX 1
|
||||
#define SCE_PFX_EDGE_CONCAVE 2
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Edge
|
||||
struct PfxEdge
|
||||
{
|
||||
PfxUInt8 m_vertId[2];
|
||||
PfxUInt8 m_angleType;
|
||||
PfxUInt8 m_tilt;
|
||||
};
|
||||
|
||||
inline
|
||||
bool operator ==(const PfxEdge &e1,const PfxEdge &e2)
|
||||
{
|
||||
return (e1.m_vertId[0] == e2.m_vertId[0] && e1.m_vertId[1] == e2.m_vertId[1]) ||
|
||||
(e1.m_vertId[1] == e2.m_vertId[0] && e1.m_vertId[0] == e2.m_vertId[1]);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Facet
|
||||
|
||||
struct PfxFacet
|
||||
{
|
||||
PfxFloat m_normal[3];
|
||||
PfxFloat m_thickness;
|
||||
PfxUInt8 m_group;
|
||||
PfxUInt8 m_vertIds[3];
|
||||
PfxUInt8 m_edgeIds[3];
|
||||
PfxUInt8 m_userData;
|
||||
PfxFloat m_half[3];
|
||||
PfxFloat m_center[3];
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Mesh
|
||||
|
||||
struct SCE_PFX_ALIGNED(16) PfxTriMesh
|
||||
{
|
||||
PfxUInt8 m_numVerts;
|
||||
PfxUInt8 m_numEdges;
|
||||
PfxUInt8 m_numFacets;
|
||||
PfxUInt8 m_reserved;
|
||||
PfxFacet m_facets[SCE_PFX_NUMMESHFACETS];
|
||||
PfxEdge m_edges[SCE_PFX_NUMMESHEDGES];
|
||||
SCE_PFX_PADDING(1,12)
|
||||
PfxVector3 m_verts[SCE_PFX_NUMMESHVERTICES];
|
||||
PfxVector3 m_half;
|
||||
|
||||
PfxTriMesh()
|
||||
{
|
||||
m_numVerts = m_numEdges = m_numFacets = 0;
|
||||
}
|
||||
|
||||
inline void updateAABB();
|
||||
};
|
||||
|
||||
inline
|
||||
void PfxTriMesh::updateAABB()
|
||||
{
|
||||
PfxVector3 halfMax(0);
|
||||
|
||||
for(PfxUInt8 i=0;i<m_numFacets;i++) {
|
||||
PfxVector3 pnts[6] = {
|
||||
m_verts[m_facets[i].m_vertIds[0]],
|
||||
m_verts[m_facets[i].m_vertIds[1]],
|
||||
m_verts[m_facets[i].m_vertIds[2]],
|
||||
m_verts[m_facets[i].m_vertIds[0]] - m_facets[i].m_thickness * pfxReadVector3(m_facets[i].m_normal),
|
||||
m_verts[m_facets[i].m_vertIds[1]] - m_facets[i].m_thickness * pfxReadVector3(m_facets[i].m_normal),
|
||||
m_verts[m_facets[i].m_vertIds[2]] - m_facets[i].m_thickness * pfxReadVector3(m_facets[i].m_normal)
|
||||
};
|
||||
|
||||
PfxVector3 facetAABBmin,facetAABBmax,facetHalf,facetCenter;
|
||||
facetAABBmin = minPerElem(pnts[5],minPerElem(pnts[4],minPerElem(pnts[3],minPerElem(pnts[2],minPerElem(pnts[0],pnts[1])))));
|
||||
facetAABBmax = maxPerElem(pnts[5],maxPerElem(pnts[4],maxPerElem(pnts[3],maxPerElem(pnts[2],maxPerElem(pnts[0],pnts[1])))));
|
||||
facetHalf = 0.5f * (facetAABBmax - facetAABBmin) + PfxVector3(0.00001f); // Slightly stretch to avoid collision hole
|
||||
facetCenter = 0.5f * (facetAABBmax + facetAABBmin);
|
||||
pfxStoreVector3(facetHalf,m_facets[i].m_half);
|
||||
pfxStoreVector3(facetCenter,m_facets[i].m_center);
|
||||
halfMax = maxPerElem(absPerElem(facetAABBmax),halfMax);
|
||||
}
|
||||
m_half = halfMax;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Convex Mesh
|
||||
|
||||
struct SCE_PFX_ALIGNED(16) PfxConvexMesh
|
||||
{
|
||||
PfxUInt8 m_numVerts;
|
||||
PfxUInt8 m_numIndices;
|
||||
PfxUInt16 m_indices[SCE_PFX_NUMMESHFACETS*3];
|
||||
SCE_PFX_PADDING(1,14)
|
||||
PfxVector3 m_verts[SCE_PFX_NUMMESHVERTICES];
|
||||
PfxVector3 m_half;
|
||||
SCE_PFX_PADDING(2,16)
|
||||
|
||||
PfxConvexMesh()
|
||||
{
|
||||
m_numVerts = m_numIndices = 0;
|
||||
}
|
||||
|
||||
inline void updateAABB();
|
||||
};
|
||||
|
||||
inline
|
||||
void PfxConvexMesh::updateAABB()
|
||||
{
|
||||
PfxVector3 halfMax(0);
|
||||
for(int i=0;i<m_numVerts;i++) {
|
||||
halfMax = maxPerElem(absPerElem(m_verts[i]),halfMax);
|
||||
}
|
||||
m_half = halfMax;
|
||||
}
|
||||
|
||||
} // namespace PhysicsEffects
|
||||
} // namespace sce
|
||||
|
||||
#endif // _SCE_PFX_TRI_MESH_H
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_BASE_LEVEL_INCLUDE_H
|
||||
#define _SCE_PFX_BASE_LEVEL_INCLUDE_H
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Physics Effects Base Level Headers
|
||||
|
||||
#include "base/pfx_common.h"
|
||||
#include "base/pfx_perf_counter.h"
|
||||
|
||||
#include "rigidbody/pfx_rigid_state.h"
|
||||
#include "rigidbody/pfx_rigid_body.h"
|
||||
|
||||
#include "broadphase/pfx_broadphase_pair.h"
|
||||
#include "broadphase/pfx_broadphase_proxy.h"
|
||||
#include "broadphase/pfx_update_broadphase_proxy.h"
|
||||
|
||||
#include "collision/pfx_collidable.h"
|
||||
#include "collision/pfx_shape_iterator.h"
|
||||
#include "collision/pfx_contact_manifold.h"
|
||||
|
||||
#include "solver/pfx_constraint_pair.h"
|
||||
#include "solver/pfx_contact_constraint.h"
|
||||
#include "solver/pfx_joint_ball.h"
|
||||
#include "solver/pfx_joint_swing_twist.h"
|
||||
#include "solver/pfx_joint_hinge.h"
|
||||
#include "solver/pfx_joint_slider.h"
|
||||
#include "solver/pfx_joint_fix.h"
|
||||
#include "solver/pfx_joint_universal.h"
|
||||
|
||||
#include "solver/pfx_integrate.h"
|
||||
|
||||
#include "sort/pfx_sort.h"
|
||||
|
||||
#endif // _SCE_PFX_BASE_LEVEL_INCLUDE_H
|
||||
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_RIGID_BODY_H
|
||||
#define _SCE_PFX_RIGID_BODY_H
|
||||
|
||||
#include "../base/pfx_common.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
class SCE_PFX_ALIGNED(128) PfxRigidBody
|
||||
{
|
||||
private:
|
||||
// Rigid Body constants
|
||||
PfxMatrix3 m_inertia; // Inertia matrix in body's coords
|
||||
PfxMatrix3 m_inertiaInv; // Inertia matrix inverse in body's coords
|
||||
PfxFloat m_mass; // Rigid Body mass
|
||||
PfxFloat m_massInv; // Inverse of mass
|
||||
PfxFloat m_restitution; // Coefficient of restitution
|
||||
PfxFloat m_friction; // Coefficient of friction
|
||||
SCE_PFX_PADDING(1,16)
|
||||
|
||||
public:
|
||||
PfxFloat getMassInv() const {return m_massInv;}
|
||||
void setMassInv(PfxFloat massInv) {m_massInv=massInv;}
|
||||
|
||||
const PfxMatrix3& getInertiaInv() const {return m_inertiaInv;}
|
||||
void setInertiaInv(const PfxMatrix3 SCE_VECTORMATH_AOS_MATRIX_ARG inertiaInv) {m_inertiaInv = inertiaInv;}
|
||||
|
||||
public:
|
||||
inline void reset();
|
||||
|
||||
PfxFloat getMass() const {return m_mass;};
|
||||
void setMass(PfxFloat mass) {m_mass=mass;m_massInv=mass>0.0f?1.0f/mass:0.0f;}
|
||||
|
||||
const PfxMatrix3& getInertia() const {return m_inertia;}
|
||||
void setInertia(const PfxMatrix3 SCE_VECTORMATH_AOS_MATRIX_ARG inertia) {m_inertia = inertia;m_inertiaInv = inverse(inertia);}
|
||||
|
||||
PfxFloat getRestitution() const {return m_restitution;}
|
||||
void setRestitution(PfxFloat restitution) {m_restitution = restitution;}
|
||||
|
||||
PfxFloat getFriction() const {return m_friction;}
|
||||
void setFriction(PfxFloat friction) {m_friction = friction;}
|
||||
};
|
||||
|
||||
inline
|
||||
void PfxRigidBody::reset()
|
||||
{
|
||||
m_mass = 0.0f;
|
||||
m_restitution = 0.2f;
|
||||
m_friction = 0.6f;
|
||||
}
|
||||
|
||||
} // namespace PhysicsEffects
|
||||
} // namespace sce
|
||||
|
||||
#endif // _SCE_PFX_RIGID_BODY_H
|
||||
@@ -0,0 +1,196 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_RIGID_STATE_H
|
||||
#define _SCE_PFX_RIGID_STATE_H
|
||||
|
||||
#include "../base/pfx_common.h"
|
||||
#include "../base/pfx_vec_utils.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
// Motion Type
|
||||
enum ePfxMotionType {
|
||||
kPfxMotionTypeFixed = 0,
|
||||
kPfxMotionTypeActive,
|
||||
kPfxMotionTypeKeyframe,
|
||||
kPfxMotionTypeOneWay,
|
||||
kPfxMotionTypeTrigger,
|
||||
kPfxMotionTypeCount
|
||||
};
|
||||
|
||||
#define SCE_PFX_MOTION_MASK_DYNAMIC(motion) ((1<<(motion))&0x0a) // Active,OneWay
|
||||
#define SCE_PFX_MOTION_MASK_STATIC(motion) ((1<<(motion))&0x95) // Fixed,Keyframe
|
||||
#define SCE_PFX_MOTION_MASK_CAN_SLEEP(motion) ((1<<(motion))&0x0e) // Can sleep
|
||||
|
||||
#define SCE_PFX_MOTION_MASK_SLEEPING 0x80 // Is sleeping
|
||||
#define SCE_PFX_MOTION_MASK_TYPE 0x7f // Motion Type
|
||||
|
||||
class SCE_PFX_ALIGNED(128) PfxRigidState
|
||||
{
|
||||
private:
|
||||
union {
|
||||
struct {
|
||||
PfxUInt8 m_useSleep : 1;
|
||||
PfxUInt8 m_sleeping : 1;
|
||||
PfxUInt8 m_reserved1 : 1;
|
||||
PfxUInt8 m_reserved2 : 1;
|
||||
PfxUInt8 m_reserved3 : 1;
|
||||
PfxUInt8 m_reserved4 : 1;
|
||||
PfxUInt8 m_reserved5 : 1;
|
||||
PfxUInt8 m_reserved6 : 1;
|
||||
};
|
||||
PfxUInt8 m_flags;
|
||||
};
|
||||
PfxUInt8 m_motionType;
|
||||
PfxUInt16 m_sleepCount;
|
||||
PfxUInt16 m_rigidBodyId;
|
||||
|
||||
SCE_PFX_PADDING(1,2)
|
||||
|
||||
PfxUInt32 m_contactFilterSelf;
|
||||
PfxUInt32 m_contactFilterTarget;
|
||||
|
||||
PfxFloat m_linearDamping;
|
||||
PfxFloat m_angularDamping;
|
||||
|
||||
PfxFloat m_maxLinearVelocity;
|
||||
PfxFloat m_maxAngularVelocity;
|
||||
|
||||
PfxVector3 m_position;
|
||||
PfxQuat m_orientation;
|
||||
PfxVector3 m_linearVelocity;
|
||||
PfxVector3 m_angularVelocity;
|
||||
|
||||
void *m_userData;
|
||||
PfxUInt32 m_userParam[4];
|
||||
|
||||
SCE_PFX_PADDING(2,12)
|
||||
|
||||
public:
|
||||
inline void reset();
|
||||
|
||||
PfxUInt16 getRigidBodyId() const {return m_rigidBodyId;}
|
||||
void setRigidBodyId(PfxUInt16 i) {m_rigidBodyId = i;}
|
||||
|
||||
PfxUInt32 getContactFilterSelf() const {return m_contactFilterSelf;}
|
||||
void setContactFilterSelf(PfxUInt32 filter) {m_contactFilterSelf = filter;}
|
||||
|
||||
PfxUInt32 getContactFilterTarget() const {return m_contactFilterTarget;}
|
||||
void setContactFilterTarget(PfxUInt32 filter) {m_contactFilterTarget = filter;}
|
||||
|
||||
ePfxMotionType getMotionType() const {return (ePfxMotionType)m_motionType;}
|
||||
void setMotionType(ePfxMotionType t) {SCE_PFX_ALWAYS_ASSERT(t<kPfxMotionTypeCount);m_motionType = (PfxUInt8)t;wakeup();}
|
||||
|
||||
PfxUInt8 getMotionMask() const {return m_motionType|(m_sleeping<<7);}
|
||||
|
||||
PfxBool isAsleep() const {return m_sleeping==1;}
|
||||
PfxBool isAwake() const {return m_sleeping==0;}
|
||||
|
||||
void wakeup() {m_sleeping=0;m_sleepCount=0;}
|
||||
void sleep() {if(m_useSleep) {m_sleeping=1;m_sleepCount=0;}}
|
||||
|
||||
PfxUInt8 getUseSleep() const {return m_useSleep;}
|
||||
void setUseSleep(PfxUInt8 b) {m_useSleep=b;}
|
||||
|
||||
void incrementSleepCount() {if(m_sleepCount<0xffff)m_sleepCount++;}
|
||||
void resetSleepCount() {m_sleepCount=0;}
|
||||
PfxUInt16 getSleepCount() const {return m_sleepCount;}
|
||||
|
||||
PfxFloat getLinearDamping() const {return m_linearDamping;}
|
||||
PfxFloat getAngularDamping() const {return m_angularDamping;}
|
||||
|
||||
PfxFloat getMaxLinearVelocity() const {return m_maxLinearVelocity;}
|
||||
PfxFloat getMaxAngularVelocity() const {return m_maxAngularVelocity;}
|
||||
|
||||
void setLinearDamping(PfxFloat damping) {m_linearDamping=damping;}
|
||||
void setAngularDamping(PfxFloat damping) {m_angularDamping=damping;}
|
||||
|
||||
void setMaxLinearVelocity(PfxFloat maxvelocity){m_maxLinearVelocity = maxvelocity;}
|
||||
void setMaxAngularVelocity(PfxFloat maxvelocity){m_maxAngularVelocity = maxvelocity;}
|
||||
|
||||
PfxVector3 getPosition() const {return m_position;}
|
||||
PfxQuat getOrientation() const {return m_orientation;}
|
||||
PfxVector3 getLinearVelocity() const {return m_linearVelocity;}
|
||||
PfxVector3 getAngularVelocity() const {return m_angularVelocity;}
|
||||
|
||||
void setPosition(const PfxVector3 &pos) {m_position = pos;}
|
||||
void setOrientation(const PfxQuat &rot) {m_orientation = rot;}
|
||||
void setLinearVelocity(const PfxVector3 &vel) {m_linearVelocity = vel;}
|
||||
void setAngularVelocity(const PfxVector3 &vel) {m_angularVelocity = vel;}
|
||||
|
||||
void *getUserData() const {return m_userData;}
|
||||
void setUserData(void *d) {m_userData=d;}
|
||||
|
||||
inline void movePosition(const PfxVector3 &pos,PfxFloat timeStep);
|
||||
inline void moveOrientation(const PfxQuat &rot,PfxFloat timeStep);
|
||||
};
|
||||
|
||||
inline
|
||||
void PfxRigidState::reset()
|
||||
{
|
||||
m_sleepCount = 0;
|
||||
m_motionType = kPfxMotionTypeActive;
|
||||
m_flags = 0;
|
||||
m_rigidBodyId = 0;
|
||||
m_contactFilterSelf = 0xffffffff;
|
||||
m_contactFilterTarget = 0xffffffff;
|
||||
m_linearDamping = 1.0f;
|
||||
m_angularDamping = 0.99f;
|
||||
m_maxLinearVelocity = 200.0f;
|
||||
m_maxAngularVelocity = SCE_PFX_PI * 100.0f;
|
||||
m_position = PfxVector3(0.0f);
|
||||
m_orientation = PfxQuat::identity();
|
||||
m_linearVelocity = PfxVector3(0.0f);
|
||||
m_angularVelocity = PfxVector3(0.0f);
|
||||
m_userData = NULL;
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxRigidState::movePosition(const PfxVector3 &pos,PfxFloat timeStep)
|
||||
{
|
||||
if(getMotionType()!=kPfxMotionTypeKeyframe) return;
|
||||
|
||||
SCE_PFX_ASSERT(timeStep > 0.0f);
|
||||
|
||||
setLinearVelocity((pos - getPosition()) / timeStep);
|
||||
}
|
||||
|
||||
inline
|
||||
void PfxRigidState::moveOrientation(const PfxQuat &rot,PfxFloat timeStep)
|
||||
{
|
||||
if(getMotionType()!=kPfxMotionTypeKeyframe) return;
|
||||
|
||||
SCE_PFX_ASSERT(timeStep > 0.0f);
|
||||
|
||||
PfxQuat ori1 = getOrientation();
|
||||
PfxQuat ori2 = rot;
|
||||
|
||||
if(dot(ori2,ori1) < 0.0f) {
|
||||
ori2 = -rot;
|
||||
}
|
||||
|
||||
PfxQuat dq = ( ori2 - ori1 ) / timeStep;
|
||||
dq = dq * 2.0f * conj(ori1);
|
||||
PfxVector3 omega = dq.getXYZ();
|
||||
|
||||
setAngularVelocity(omega);
|
||||
}
|
||||
} // namespace PhysicsEffects
|
||||
} // namespace sce
|
||||
#endif // _SCE_PFX_RIGID_STATE_H
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_CONSTRAINT_PAIR_H
|
||||
#define _SCE_PFX_CONSTRAINT_PAIR_H
|
||||
|
||||
#include "../sort/pfx_sort_data.h"
|
||||
#include "../broadphase/pfx_broadphase_pair.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
typedef PfxSortData16 PfxConstraintPair;
|
||||
|
||||
//J PfxBroadphasePairと共通
|
||||
//E Same as PfxBroadphasePair
|
||||
|
||||
SCE_PFX_FORCE_INLINE void pfxSetConstraintId(PfxConstraintPair &pair,PfxUInt32 i) {pair.set32(2,i);}
|
||||
SCE_PFX_FORCE_INLINE void pfxSetNumConstraints(PfxConstraintPair &pair,PfxUInt8 n) {pair.set8(7,n);}
|
||||
|
||||
SCE_PFX_FORCE_INLINE PfxUInt32 pfxGetConstraintId(const PfxConstraintPair &pair) {return pair.get32(2);}
|
||||
SCE_PFX_FORCE_INLINE PfxUInt8 pfxGetNumConstraints(const PfxConstraintPair &pair) {return pair.get8(7);}
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#endif // _SCE_PFX_CONSTRAINT_PAIR_H
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_CONSTRAINT_ROW_H
|
||||
#define _SCE_PFX_CONSTRAINT_ROW_H
|
||||
|
||||
#include "../base/pfx_vec_utils.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
|
||||
#include "../base/pfx_common.h"
|
||||
|
||||
//E Don't change following order of parameters
|
||||
struct SCE_PFX_ALIGNED(16) PfxConstraintRow {
|
||||
PfxFloat m_normal[3];
|
||||
PfxFloat m_rhs;
|
||||
PfxFloat m_jacDiagInv;
|
||||
PfxFloat m_lowerLimit;
|
||||
PfxFloat m_upperLimit;
|
||||
PfxFloat m_accumImpulse;
|
||||
};
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#endif // _SCE_PFX_CONSTRAINT_ROW_H
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_CONTACT_CONSTRAINT_H
|
||||
#define _SCE_PFX_CONTACT_CONSTRAINT_H
|
||||
|
||||
#include "../rigidbody/pfx_rigid_state.h"
|
||||
#include "pfx_constraint_row.h"
|
||||
#include "pfx_solver_body.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
void pfxSetupContactConstraint(
|
||||
PfxConstraintRow &constraintResponse,
|
||||
PfxConstraintRow &constraintFriction1,
|
||||
PfxConstraintRow &constraintFriction2,
|
||||
PfxFloat penetrationDepth,
|
||||
PfxFloat restitution,
|
||||
PfxFloat friction,
|
||||
const PfxVector3 &contactNormal,
|
||||
const PfxVector3 &contactPointA,
|
||||
const PfxVector3 &contactPointB,
|
||||
const PfxRigidState &stateA,
|
||||
const PfxRigidState &stateB,
|
||||
PfxSolverBody &solverBodyA,
|
||||
PfxSolverBody &solverBodyB,
|
||||
PfxFloat separateBias,
|
||||
PfxFloat timeStep
|
||||
);
|
||||
|
||||
void pfxSolveContactConstraint(
|
||||
PfxConstraintRow &constraintResponse,
|
||||
PfxConstraintRow &constraintFriction1,
|
||||
PfxConstraintRow &constraintFriction2,
|
||||
const PfxVector3 &contactPointA,
|
||||
const PfxVector3 &contactPointB,
|
||||
PfxSolverBody &solverBodyA,
|
||||
PfxSolverBody &solverBodyB,
|
||||
PfxFloat friction
|
||||
);
|
||||
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#endif // _SCE_PFX_CONTACT_CONSTRAINT_H
|
||||
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_INTEGRATE_H_
|
||||
#define _SCE_PFX_INTEGRATE_H_
|
||||
|
||||
#include "../base/pfx_common.h"
|
||||
#include "../rigidbody/pfx_rigid_body.h"
|
||||
#include "../rigidbody/pfx_rigid_state.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
template <typename T>
|
||||
static SCE_PFX_FORCE_INLINE T pfxRungeKutta(const T &deriv,PfxFloat dt)
|
||||
{
|
||||
T k0, k1, k2, k3;
|
||||
k0 = deriv * dt;
|
||||
k1 = (deriv + k0 * 0.5f) * dt;
|
||||
k2 = (deriv + k1 * 0.5f) * dt;
|
||||
k3 = (deriv + k2) * dt;
|
||||
return (k0 + k1*2.0f + k2*2.0f + k3) / 6.0f;
|
||||
}
|
||||
|
||||
#define SCE_PFX_MOTION_MASK_INTEGRATE ((1<<kPfxMotionTypeFixed)|(1<<kPfxMotionTypeTrigger))
|
||||
|
||||
static SCE_PFX_FORCE_INLINE
|
||||
void pfxIntegrate(
|
||||
PfxRigidState &state,
|
||||
const PfxRigidBody &body,
|
||||
PfxFloat timeStep
|
||||
)
|
||||
{
|
||||
(void) body;
|
||||
if(((1<<state.getMotionMask())&SCE_PFX_MOTION_MASK_INTEGRATE) || state.isAsleep()) return;
|
||||
|
||||
PfxVector3 position = state.getPosition();
|
||||
PfxQuat orientation = state.getOrientation();
|
||||
PfxVector3 linearVelocity = state.getLinearVelocity();
|
||||
PfxVector3 angularVelocity = state.getAngularVelocity();
|
||||
|
||||
PfxVector3 dx = linearVelocity;
|
||||
PfxQuat dq = PfxQuat(angularVelocity,0) * orientation * 0.5f;
|
||||
|
||||
#ifdef SCE_PFX_ODE_EULER
|
||||
position += dx * timeStep;
|
||||
orientation += dq * timeStep;
|
||||
orientation = normalize(orientation);
|
||||
#else
|
||||
position += pfxRungeKutta(dx,timeStep);
|
||||
orientation += pfxRungeKutta(dq,timeStep);
|
||||
orientation = normalize(orientation);
|
||||
#endif
|
||||
|
||||
state.setPosition(position);
|
||||
state.setOrientation(orientation);
|
||||
}
|
||||
|
||||
#define SCE_PFX_MOTION_MASK_APPLYFORCE ((1<<kPfxMotionTypeFixed)|(1<<kPfxMotionTypeTrigger)|(1<<kPfxMotionTypeKeyframe))
|
||||
|
||||
static SCE_PFX_FORCE_INLINE
|
||||
void pfxApplyExternalForce(
|
||||
PfxRigidState &state,
|
||||
const PfxRigidBody &body,
|
||||
const PfxVector3 &extForce,
|
||||
const PfxVector3 &extTorque,
|
||||
PfxFloat timeStep
|
||||
)
|
||||
{
|
||||
if(((1<<state.getMotionType())&SCE_PFX_MOTION_MASK_APPLYFORCE) || state.isAsleep()) return;
|
||||
|
||||
PfxVector3 angularVelocity = state.getAngularVelocity();
|
||||
PfxMatrix3 m(state.getOrientation());
|
||||
PfxMatrix3 worldInertia = m * body.getInertia() * transpose(m);
|
||||
PfxMatrix3 worldInertiaInv = m * body.getInertiaInv() * transpose(m);
|
||||
PfxVector3 dv = extForce * body.getMassInv();
|
||||
PfxVector3 dw = worldInertiaInv * (cross(worldInertia * angularVelocity, angularVelocity) + extTorque);
|
||||
|
||||
PfxVector3 nv = state.getLinearVelocity();
|
||||
PfxVector3 nw = state.getAngularVelocity();
|
||||
|
||||
#ifdef SCE_PFX_ODE_EULER
|
||||
nv += dv * timeStep;
|
||||
nw += dw * timeStep;
|
||||
#else
|
||||
nv += pfxRungeKutta(dv,timeStep);
|
||||
nw += pfxRungeKutta(dw,timeStep);
|
||||
#endif
|
||||
|
||||
nv *= state.getLinearDamping();
|
||||
nw *= state.getAngularDamping();
|
||||
|
||||
if(length(nv) > state.getMaxLinearVelocity())
|
||||
{
|
||||
nv = normalize( nv ) * state.getMaxLinearVelocity();
|
||||
}
|
||||
if(length(nw) > state.getMaxAngularVelocity())
|
||||
{
|
||||
nw = normalize( nw ) * state.getMaxAngularVelocity();
|
||||
}
|
||||
|
||||
state.setLinearVelocity(nv);
|
||||
state.setAngularVelocity(nw);
|
||||
}
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
#endif /* _SCE_PFX_INTEGRATE_H_ */
|
||||
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_JOINT_H
|
||||
#define _SCE_PFX_JOINT_H
|
||||
|
||||
#include "../rigidbody/pfx_rigid_state.h"
|
||||
#include "pfx_joint_constraint.h"
|
||||
#include "pfx_constraint_pair.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
// Joint Type
|
||||
enum ePfxJointType {
|
||||
kPfxJointBall = 0,
|
||||
kPfxJointSwingtwist,
|
||||
kPfxJointHinge,
|
||||
kPfxJointSlider,
|
||||
kPfxJointFix,
|
||||
kPfxJointUniversal,
|
||||
kPfxJointAnimation,
|
||||
kPfxJointReserved0,
|
||||
kPfxJointReserved1,
|
||||
kPfxJointReserved2,
|
||||
kPfxJointUser0,
|
||||
kPfxJointUser1,
|
||||
kPfxJointUser2,
|
||||
kPfxJointUser3,
|
||||
kPfxJointUser4,
|
||||
kPfxJointCount // = 15
|
||||
};
|
||||
|
||||
// Joint Structure
|
||||
struct SCE_PFX_ALIGNED(128) PfxJoint {
|
||||
PfxUInt8 m_active;
|
||||
PfxUInt8 m_numConstraints;
|
||||
PfxUInt8 m_type;
|
||||
SCE_PFX_PADDING(1,1)
|
||||
PfxUInt16 m_rigidBodyIdA;
|
||||
PfxUInt16 m_rigidBodyIdB;
|
||||
SCE_PFX_PADDING(2,8)
|
||||
PfxJointConstraint m_constraints[6];
|
||||
void *m_userData;
|
||||
SCE_PFX_PADDING(3,12)
|
||||
PfxVector3 m_param[4]; // Used by some joints for specific features
|
||||
PfxVector3 m_anchorA;
|
||||
PfxVector3 m_anchorB;
|
||||
PfxMatrix3 m_frameA;
|
||||
PfxMatrix3 m_frameB;
|
||||
SCE_PFX_PADDING(4,32)
|
||||
};
|
||||
|
||||
SCE_PFX_FORCE_INLINE
|
||||
void pfxUpdateJointPairs(
|
||||
PfxConstraintPair &pair,
|
||||
PfxUInt32 jointId,
|
||||
const PfxJoint &joint,
|
||||
const PfxRigidState &stateA,
|
||||
const PfxRigidState &stateB
|
||||
)
|
||||
{
|
||||
SCE_PFX_ALWAYS_ASSERT(stateA.getRigidBodyId()==joint.m_rigidBodyIdA);
|
||||
SCE_PFX_ALWAYS_ASSERT(stateB.getRigidBodyId()==joint.m_rigidBodyIdB);
|
||||
pfxSetObjectIdA(pair,stateA.getRigidBodyId());
|
||||
pfxSetObjectIdB(pair,stateB.getRigidBodyId());
|
||||
pfxSetMotionMaskA(pair,stateA.getMotionMask());
|
||||
pfxSetMotionMaskB(pair,stateB.getMotionMask());
|
||||
pfxSetConstraintId(pair,jointId);
|
||||
pfxSetNumConstraints(pair,joint.m_numConstraints);
|
||||
pfxSetActive(pair,joint.m_active>0);
|
||||
}
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
|
||||
#endif // _PFX_JOINT_H
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_JOINT_BALL_H
|
||||
#define _SCE_PFX_JOINT_BALL_H
|
||||
|
||||
#include "pfx_joint.h"
|
||||
#include "pfx_solver_body.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
struct PfxBallJointInitParam {
|
||||
PfxVector3 anchorPoint;
|
||||
|
||||
PfxBallJointInitParam()
|
||||
{
|
||||
anchorPoint = PfxVector3(0.0f);
|
||||
}
|
||||
};
|
||||
|
||||
PfxInt32 pfxInitializeBallJoint(
|
||||
PfxJoint &joint,
|
||||
const PfxRigidState &stateA,
|
||||
const PfxRigidState &stateB,
|
||||
const PfxBallJointInitParam ¶m);
|
||||
|
||||
void pfxSetupBallJoint(
|
||||
PfxJoint &joint,
|
||||
const PfxRigidState &stateA,
|
||||
const PfxRigidState &stateB,
|
||||
PfxSolverBody &solverBodyA,
|
||||
PfxSolverBody &solverBodyB,
|
||||
PfxFloat timeStep);
|
||||
|
||||
void pfxWarmStartBallJoint(
|
||||
PfxJoint &joint,
|
||||
PfxSolverBody &solverBodyA,
|
||||
PfxSolverBody &solverBodyB);
|
||||
|
||||
void pfxSolveBallJoint(
|
||||
PfxJoint &joint,
|
||||
PfxSolverBody &solverBodyA,
|
||||
PfxSolverBody &solverBodyB);
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
#endif // _SCE_PFX_JOINT_BALL_H
|
||||
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_JOINT_CONSTRAINT_H
|
||||
#define _SCE_PFX_JOINT_CONSTRAINT_H
|
||||
|
||||
#include "../base/pfx_common.h"
|
||||
#include "../base/pfx_vec_utils.h"
|
||||
#include "pfx_constraint_row.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
// Lock type
|
||||
#define SCE_PFX_JOINT_LOCK_FREE 0
|
||||
#define SCE_PFX_JOINT_LOCK_LIMIT 1
|
||||
#define SCE_PFX_JOINT_LOCK_FIX 2
|
||||
|
||||
// Slop
|
||||
#define SCE_PFX_JOINT_LINEAR_SLOP 0.01f
|
||||
#define SCE_PFX_JOINT_ANGULAR_SLOP 0.01f
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////// Joint Constraint
|
||||
|
||||
struct PfxJointConstraint {
|
||||
PfxInt8 m_lock;
|
||||
PfxInt8 m_warmStarting;
|
||||
SCE_PFX_PADDING(1,2)
|
||||
PfxFloat m_movableLowerLimit;
|
||||
PfxFloat m_movableUpperLimit;
|
||||
PfxFloat m_bias;
|
||||
PfxFloat m_weight;
|
||||
PfxFloat m_damping;
|
||||
PfxFloat m_maxImpulse;
|
||||
SCE_PFX_PADDING(2,4)
|
||||
PfxConstraintRow m_constraintRow;
|
||||
|
||||
void reset()
|
||||
{
|
||||
m_lock = SCE_PFX_JOINT_LOCK_FIX;
|
||||
m_warmStarting = 0;
|
||||
m_movableLowerLimit = 0.0f;
|
||||
m_movableUpperLimit = 0.0f;
|
||||
m_bias = 0.2f;
|
||||
m_weight = 1.0f;
|
||||
m_damping = 0.0f;
|
||||
m_maxImpulse = SCE_PFX_FLT_MAX;
|
||||
memset(&m_constraintRow,0,sizeof(PfxConstraintRow));
|
||||
}
|
||||
};
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
#endif // _SCE_PFX_JOINT_CONSTRAINT_H
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_JOINT_FIX_H
|
||||
#define _SCE_PFX_JOINT_FIX_H
|
||||
|
||||
#include "pfx_joint.h"
|
||||
#include "pfx_solver_body.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
struct PfxFixJointInitParam {
|
||||
PfxVector3 anchorPoint;
|
||||
|
||||
PfxFixJointInitParam()
|
||||
{
|
||||
anchorPoint = PfxVector3(0.0f);
|
||||
}
|
||||
};
|
||||
|
||||
PfxInt32 pfxInitializeFixJoint(
|
||||
PfxJoint &joint,
|
||||
const PfxRigidState &stateA,
|
||||
const PfxRigidState &stateB,
|
||||
const PfxFixJointInitParam ¶m);
|
||||
|
||||
// pfxSetupFixJoint = pfxSetupSwingTwistJoint
|
||||
|
||||
// pfxWarmStartFixJoint = pfxWarmStartSwingTwistJoint
|
||||
|
||||
// pfxSolveFixJoint = pfxSolveSwingTwistJoint
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
#endif // _SCE_PFX_JOINT_FIX_H
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_JOINT_HINGE_H_
|
||||
#define _SCE_PFX_JOINT_HINGE_H_
|
||||
|
||||
#include "pfx_joint.h"
|
||||
#include "pfx_solver_body.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
struct PfxHingeJointInitParam {
|
||||
PfxVector3 anchorPoint;
|
||||
PfxVector3 axis;
|
||||
PfxFloat lowerAngle;
|
||||
PfxFloat upperAngle;
|
||||
SCE_PFX_PADDING(1,8)
|
||||
|
||||
PfxHingeJointInitParam()
|
||||
{
|
||||
anchorPoint = PfxVector3(0.0f);
|
||||
axis = PfxVector3(1.0f,0.0f,0.0f);
|
||||
lowerAngle = 0.0f;
|
||||
upperAngle = 0.0f;
|
||||
}
|
||||
};
|
||||
|
||||
PfxInt32 pfxInitializeHingeJoint(
|
||||
PfxJoint &joint,
|
||||
const PfxRigidState &stateA,
|
||||
const PfxRigidState &stateB,
|
||||
const PfxHingeJointInitParam ¶m);
|
||||
|
||||
// pfxSetupHingeJoint = pfxSetupSwingTwistJoint
|
||||
|
||||
// pfxWarmStartHingeJoint = pfxWarmStartSwingTwistJoint
|
||||
|
||||
// pfxSolveHingeJoint = pfxSolveSwingTwistJoint
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#endif // _SCE_PFX_JOINT_HINGE_H
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_JOINT_SLIDER_H
|
||||
#define _SCE_PFX_JOINT_SLIDER_H
|
||||
|
||||
#include "pfx_joint.h"
|
||||
#include "pfx_solver_body.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
struct PfxSliderJointInitParam {
|
||||
PfxVector3 anchorPoint;
|
||||
PfxVector3 direction;
|
||||
PfxFloat lowerDistance;
|
||||
PfxFloat upperDistance;
|
||||
SCE_PFX_PADDING(1,8)
|
||||
|
||||
PfxSliderJointInitParam()
|
||||
{
|
||||
anchorPoint = PfxVector3(0.0f);
|
||||
direction = PfxVector3(1.0f,0.0f,0.0f);
|
||||
lowerDistance = 0.0f;
|
||||
upperDistance = 0.0f;
|
||||
}
|
||||
};
|
||||
|
||||
PfxInt32 pfxInitializeSliderJoint(
|
||||
PfxJoint &joint,
|
||||
const PfxRigidState &stateA,
|
||||
const PfxRigidState &stateB,
|
||||
const PfxSliderJointInitParam ¶m);
|
||||
|
||||
// pfxSetupSliderJoint = pfxSetupSwingTwistJoint
|
||||
|
||||
// pfxWarmStartSliderJoint = pfxWarmStartSwingTwistJoint
|
||||
|
||||
// pfxSolveSliderJoint = pfxSolveSwingTwistJoint
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
#endif // _SCE_PFX_JOINT_SLIDER_H
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_JOINT_SWING_TWIST_H
|
||||
#define _SCE_PFX_JOINT_SWING_TWIST_H
|
||||
|
||||
#include "pfx_joint.h"
|
||||
#include "pfx_solver_body.h"
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
struct PfxSwingTwistJointInitParam {
|
||||
PfxVector3 anchorPoint;
|
||||
PfxVector3 twistAxis;
|
||||
PfxFloat twistLowerAngle;
|
||||
PfxFloat twistUpperAngle;
|
||||
PfxFloat swingLowerAngle;
|
||||
PfxFloat swingUpperAngle;
|
||||
|
||||
PfxSwingTwistJointInitParam()
|
||||
{
|
||||
anchorPoint = PfxVector3(0.0f);
|
||||
twistAxis = PfxVector3(1.0f,0.0f,0.0f);
|
||||
twistLowerAngle = -0.26f;
|
||||
twistUpperAngle = 0.26f;
|
||||
swingLowerAngle = 0.0f;
|
||||
swingUpperAngle = 0.7f;
|
||||
}
|
||||
};
|
||||
|
||||
PfxInt32 pfxInitializeSwingTwistJoint(
|
||||
PfxJoint &joint,
|
||||
const PfxRigidState &stateA,
|
||||
const PfxRigidState &stateB,
|
||||
const PfxSwingTwistJointInitParam ¶m);
|
||||
|
||||
void pfxSetupSwingTwistJoint(
|
||||
PfxJoint &joint,
|
||||
const PfxRigidState &stateA,
|
||||
const PfxRigidState &stateB,
|
||||
PfxSolverBody &solverBodyA,
|
||||
PfxSolverBody &solverBodyB,
|
||||
PfxFloat timeStep);
|
||||
|
||||
void pfxWarmStartSwingTwistJoint(
|
||||
PfxJoint &joint,
|
||||
PfxSolverBody &solverBodyA,
|
||||
PfxSolverBody &solverBodyB);
|
||||
|
||||
void pfxSolveSwingTwistJoint(
|
||||
PfxJoint &joint,
|
||||
PfxSolverBody &solverBodyA,
|
||||
PfxSolverBody &solverBodyB);
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#endif // _SCE_PFX_JOINT_SWING_TWIST_H
|
||||
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_JOINT_UNIVERSAL_H
|
||||
#define _SCE_PFX_JOINT_UNIVERSAL_H
|
||||
|
||||
#include "pfx_joint.h"
|
||||
#include "pfx_solver_body.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
struct PfxUniversalJointInitParam {
|
||||
PfxVector3 anchorPoint;
|
||||
PfxVector3 axis;
|
||||
PfxFloat swing1LowerAngle;
|
||||
PfxFloat swing1UpperAngle;
|
||||
PfxFloat swing2LowerAngle;
|
||||
PfxFloat swing2UpperAngle;
|
||||
|
||||
PfxUniversalJointInitParam()
|
||||
{
|
||||
anchorPoint = PfxVector3(0.0f);
|
||||
axis = PfxVector3(1.0f,0.0f,0.0f);
|
||||
swing1LowerAngle = -0.7f;
|
||||
swing1UpperAngle = 0.7f;
|
||||
swing2LowerAngle = -0.7f;
|
||||
swing2UpperAngle = 0.7f;
|
||||
}
|
||||
};
|
||||
|
||||
PfxInt32 pfxInitializeUniversalJoint(
|
||||
PfxJoint &joint,
|
||||
const PfxRigidState &stateA,
|
||||
const PfxRigidState &stateB,
|
||||
const PfxUniversalJointInitParam ¶m);
|
||||
|
||||
void pfxSetupUniversalJoint(
|
||||
PfxJoint &joint,
|
||||
const PfxRigidState &stateA,
|
||||
const PfxRigidState &stateB,
|
||||
PfxSolverBody &solverBodyA,
|
||||
PfxSolverBody &solverBodyB,
|
||||
PfxFloat timeStep);
|
||||
|
||||
// pfxWarmStartUniversalJoint = pfxWarmStartSwingTwistJoint
|
||||
|
||||
// pfxSolveUniversalJoint = pfxSolveSwingTwistJoint
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#endif // _SCE_PFX_JOINT_UNIVERSAL_H
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_SOLVER_BODY_H
|
||||
#define _SCE_PFX_SOLVER_BODY_H
|
||||
|
||||
#include "../base/pfx_common.h"
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
struct SCE_PFX_ALIGNED(128) PfxSolverBody {
|
||||
PfxVector3 m_deltaLinearVelocity;
|
||||
PfxVector3 m_deltaAngularVelocity;
|
||||
PfxQuat m_orientation;
|
||||
PfxMatrix3 m_inertiaInv;
|
||||
PfxFloat m_massInv;
|
||||
PfxUInt32 m_motionType;
|
||||
SCE_PFX_PADDING(1,24)
|
||||
};
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
#endif // _SCE_PFX_SOLVER_BODY_H
|
||||
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_SORT_H
|
||||
#define _SCE_PFX_SORT_H
|
||||
|
||||
#include "pfx_sort_data.h"
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Single Sort
|
||||
|
||||
void pfxSort(PfxSortData16 *data,PfxSortData16 *buff,unsigned int n);
|
||||
void pfxSort(PfxSortData32 *data,PfxSortData32 *buff,unsigned int n);
|
||||
|
||||
} //namespace PhysicsEffects
|
||||
} //namespace sce
|
||||
|
||||
#endif // _SCE_PFX_SORT_H
|
||||
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
|
||||
All rights reserved.
|
||||
|
||||
Physics Effects is open software; you can redistribute it and/or
|
||||
modify it under the terms of the BSD License.
|
||||
|
||||
Physics Effects 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 BSD License for more details.
|
||||
|
||||
A copy of the BSD License is distributed with
|
||||
Physics Effects under the filename: physics_effects_license.txt
|
||||
*/
|
||||
|
||||
#ifndef _SCE_PFX_SORT_DATA_H
|
||||
#define _SCE_PFX_SORT_DATA_H
|
||||
|
||||
#include "../base/pfx_common.h"
|
||||
|
||||
|
||||
|
||||
namespace sce {
|
||||
namespace PhysicsEffects {
|
||||
|
||||
#define SCE_PFX_SENTINEL_KEY 0xffffffff
|
||||
|
||||
struct SCE_PFX_ALIGNED(16) PfxSortData16 {
|
||||
union {
|
||||
PfxUInt8 i8data[16];
|
||||
PfxUInt16 i16data[8];
|
||||
PfxUInt32 i32data[4];
|
||||
};
|
||||
|
||||
void set8(int slot,PfxUInt8 data) {i8data[slot] = data;}
|
||||
void set16(int slot,PfxUInt16 data) {i16data[slot] = data;}
|
||||
void set32(int slot,PfxUInt32 data) {i32data[slot] = data;}
|
||||
PfxUInt8 get8(int slot) const {return i8data[slot];}
|
||||
PfxUInt16 get16(int slot) const {return i16data[slot];}
|
||||
PfxUInt32 get32(int slot) const {return i32data[slot];}
|
||||
};
|
||||
|
||||
struct SCE_PFX_ALIGNED(16) PfxSortData32 {
|
||||
union {
|
||||
PfxUInt8 i8data[32];
|
||||
PfxUInt16 i16data[16];
|
||||
PfxUInt32 i32data[8];
|
||||
};
|
||||
|
||||
void set8(int slot,PfxUInt8 data) {i8data[slot] = data;}
|
||||
void set16(int slot,PfxUInt16 data) {i16data[slot] = data;}
|
||||
void set32(int slot,PfxUInt32 data) {i32data[slot] = data;}
|
||||
PfxUInt8 get8(int slot) const {return i8data[slot];}
|
||||
PfxUInt16 get16(int slot) const {return i16data[slot];}
|
||||
PfxUInt32 get32(int slot) const {return i32data[slot];}
|
||||
};
|
||||
|
||||
SCE_PFX_FORCE_INLINE
|
||||
void pfxSetKey(PfxSortData16 &sortData,PfxUInt32 key) {sortData.set32(3,key);}
|
||||
|
||||
SCE_PFX_FORCE_INLINE
|
||||
PfxUInt32 pfxGetKey(const PfxSortData16 &sortData) {return sortData.get32(3);}
|
||||
|
||||
SCE_PFX_FORCE_INLINE
|
||||
void pfxSetKey(PfxSortData32 &sortData,PfxUInt32 key) {sortData.set32(7,key);}
|
||||
|
||||
SCE_PFX_FORCE_INLINE
|
||||
PfxUInt32 pfxGetKey(const PfxSortData32 &sortData) {return sortData.get32(7);}
|
||||
|
||||
SCE_PFX_FORCE_INLINE
|
||||
PfxUInt32 pfxCreateUniqueKey(PfxUInt32 i,PfxUInt32 j)
|
||||
{
|
||||
PfxUInt32 minIdx = SCE_PFX_MIN(i,j);
|
||||
PfxUInt32 maxIdx = SCE_PFX_MAX(i,j);
|
||||
return (maxIdx<<16)|(minIdx&0xffff);
|
||||
}
|
||||
|
||||
} // namespace PhysicsEffects
|
||||
} // namespace sce
|
||||
|
||||
#endif // _SCE_PFX_SORT_DATA_H
|
||||
Reference in New Issue
Block a user