Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/physics/src/bullet/BulletCollision/GIMPACT/gim_contact.h @ 1983

Last change on this file since 1983 was 1963, checked in by rgrieder, 16 years ago

Added Bullet physics engine.

  • Property svn:eol-style set to native
File size: 4.8 KB
Line 
1#ifndef GIM_CONTACT_H_INCLUDED
2#define GIM_CONTACT_H_INCLUDED
3
4/*! \file gim_contact.h
5\author Francisco Len Nßjera
6*/
7/*
8-----------------------------------------------------------------------------
9This source file is part of GIMPACT Library.
10
11For the latest info, see http://gimpact.sourceforge.net/
12
13Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371.
14email: projectileman@yahoo.com
15
16 This library is free software; you can redistribute it and/or
17 modify it under the terms of EITHER:
18   (1) The GNU Lesser General Public License as published by the Free
19       Software Foundation; either version 2.1 of the License, or (at
20       your option) any later version. The text of the GNU Lesser
21       General Public License is included with this library in the
22       file GIMPACT-LICENSE-LGPL.TXT.
23   (2) The BSD-style license that is included with this library in
24       the file GIMPACT-LICENSE-BSD.TXT.
25   (3) The zlib/libpng license that is included with this library in
26       the file GIMPACT-LICENSE-ZLIB.TXT.
27
28 This library is distributed in the hope that it will be useful,
29 but WITHOUT ANY WARRANTY; without even the implied warranty of
30 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files
31 GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
32
33-----------------------------------------------------------------------------
34*/
35#include "gim_geometry.h"
36#include "gim_radixsort.h"
37#include "gim_array.h"
38
39/*! \defgroup CONTACTS
40\brief
41Functions for managing and sorting contacts resulting from a collision query.
42<ul>
43<li> Contact lists must be create by calling \ref GIM_CREATE_CONTACT_LIST
44<li> After querys, contact lists must be destroy by calling \ref GIM_DYNARRAY_DESTROY
45<li> Contacts can be merge for avoid duplicate results by calling \ref gim_merge_contacts
46</ul>
47
48*/
49//! @{
50
51/**
52Configuration var for applying interpolation of  contact normals
53*/
54#define NORMAL_CONTACT_AVERAGE 1
55#define CONTACT_DIFF_EPSILON 0.00001f
56
57/// Structure for collision results
58class GIM_CONTACT
59{
60public:
61    btVector3 m_point;
62    btVector3 m_normal;
63    GREAL m_depth;//Positive value indicates interpenetration
64    GREAL m_distance;//Padding not for use
65    GUINT m_feature1;//Face number
66    GUINT m_feature2;//Face number
67public:
68    GIM_CONTACT()
69    {
70    }
71
72    GIM_CONTACT(const GIM_CONTACT & contact):
73                                m_point(contact.m_point),
74                                m_normal(contact.m_normal),
75                                m_depth(contact.m_depth),
76                                m_feature1(contact.m_feature1),
77                                m_feature2(contact.m_feature2)
78    {
79        m_point = contact.m_point;
80        m_normal = contact.m_normal;
81        m_depth = contact.m_depth;
82        m_feature1 = contact.m_feature1;
83        m_feature2 = contact.m_feature2;
84    }
85
86    GIM_CONTACT(const btVector3 &point,const btVector3 & normal,
87                                GREAL depth, GUINT feature1, GUINT feature2):
88                                m_point(point),
89                                m_normal(normal),
90                                m_depth(depth),
91                                m_feature1(feature1),
92                                m_feature2(feature2)
93    {
94    }
95
96        //! Calcs key for coord classification
97    SIMD_FORCE_INLINE GUINT calc_key_contact() const
98    {
99        GINT _coords[] = {
100                (GINT)(m_point[0]*1000.0f+1.0f),
101                (GINT)(m_point[1]*1333.0f),
102                (GINT)(m_point[2]*2133.0f+3.0f)};
103                GUINT _hash=0;
104                GUINT *_uitmp = (GUINT *)(&_coords[0]);
105                _hash = *_uitmp;
106                _uitmp++;
107                _hash += (*_uitmp)<<4;
108                _uitmp++;
109                _hash += (*_uitmp)<<8;
110                return _hash;
111    }
112
113    SIMD_FORCE_INLINE void interpolate_normals( btVector3 * normals,GUINT normal_count)
114    {
115        btVector3 vec_sum(m_normal);
116                for(GUINT i=0;i<normal_count;i++)
117                {
118                        vec_sum += normals[i];
119                }
120
121                GREAL vec_sum_len = vec_sum.length2();
122                if(vec_sum_len <CONTACT_DIFF_EPSILON) return;
123
124                GIM_INV_SQRT(vec_sum_len,vec_sum_len); // 1/sqrt(vec_sum_len)
125
126                m_normal = vec_sum*vec_sum_len;
127    }
128
129};
130
131
132class gim_contact_array:public gim_array<GIM_CONTACT>
133{
134public:
135        gim_contact_array():gim_array<GIM_CONTACT>(64)
136        {
137        }
138
139        SIMD_FORCE_INLINE void push_contact(const btVector3 &point,const btVector3 & normal,
140                                GREAL depth, GUINT feature1, GUINT feature2)
141        {
142                push_back_mem();
143                GIM_CONTACT & newele = back();
144                newele.m_point = point;
145                newele.m_normal = normal;
146                newele.m_depth = depth;
147                newele.m_feature1 = feature1;
148                newele.m_feature2 = feature2;
149        }
150
151        SIMD_FORCE_INLINE void push_triangle_contacts(
152                const GIM_TRIANGLE_CONTACT_DATA & tricontact,
153                GUINT feature1,GUINT feature2)
154        {
155                for(GUINT i = 0;i<tricontact.m_point_count ;i++ )
156                {
157                        push_back_mem();
158                        GIM_CONTACT & newele = back();
159                        newele.m_point = tricontact.m_points[i];
160                        newele.m_normal = tricontact.m_separating_normal;
161                        newele.m_depth = tricontact.m_penetration_depth;
162                        newele.m_feature1 = feature1;
163                        newele.m_feature2 = feature2;
164                }
165        }
166
167        void merge_contacts(const gim_contact_array & contacts, bool normal_contact_average = true);
168        void merge_contacts_unique(const gim_contact_array & contacts);
169};
170
171//! @}
172#endif // GIM_CONTACT_H_INCLUDED
Note: See TracBrowser for help on using the repository browser.