RSS

(root)/iphone/tappity : 60 : common/source/geometry.m

To get this branch, use:
bzr branch /browse/iphone/tappity

« back to all changes in this revision

Viewing changes to common/source/geometry.m

Dömötör Gulyás
2010-01-18 09:01:40
Revision ID: dognotdog@gmail.com-20100118080140-g8bc7z6dp9ilr8rt
made tappity a standalone tree

Show diffs side-by-side

added added

removed removed

1
 
//
2
 
//  geometry.m
3
 
//
4
 
//  Created by döme on 26.07.2009.
5
 
//
6
 
 
7
 
/*
8
 
 * Copyright (c) 2009 Doemoetoer Gulyas.
9
 
 * All rights reserved.
10
 
 *
11
 
 * Redistribution and use in source and binary forms, with or without
12
 
 * modification, are permitted provided that the following conditions
13
 
 * are met:
14
 
 * 1. Redistributions of source code must retain the above copyright
15
 
 *    notice, this list of conditions and the following disclaimer.
16
 
 * 2. Redistributions in binary form must reproduce the above copyright
17
 
 *    notice, this list of conditions and the following disclaimer in the
18
 
 *    documentation and/or other materials provided with the distribution.
19
 
 * 3. The name of the author may not be used to endorse or promote products
20
 
 *    derived from this software without specific prior written permission.
21
 
 *
22
 
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23
 
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24
 
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25
 
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26
 
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27
 
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
 
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
 
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
 
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31
 
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
 
 */
33
 
 
34
 
#import "geometry.h"
35
 
 
36
 
m16 computeAlignedBasesFromDownVector(v3 acc)
37
 
{
38
 
        v3 up = vnormalize(vnegate(acc));
39
 
        
40
 
        v3 X = {{1.0,0.0,0.0}};
41
 
        v3 Y = {{0.0,1.0,0.0}};
42
 
//      v3 Z = {{0.0,0.0,1.0}};
43
 
 
44
 
        float udx = vdot(up, X);
45
 
        float udy = vdot(up, Y);
46
 
        
47
 
//      float upalignx = fabs(udx);
48
 
//      float upaligny = fabs(udy);
49
 
 
50
 
                
51
 
        
52
 
        v3 forwardax = vmul(vcross(up,X), 1.0);
53
 
 
54
 
        v3 rightay = vmul(vcross(Y,up), 1.0);
55
 
        v3 forwarday = vcross(up, rightay);
56
 
 
57
 
        float weightx = 1.0 - udx;
58
 
        float weighty = 1.0 - udy;
59
 
 
60
 
        v3 forward = vnormalize(vadd(vmul(forwardax, weightx), vmul(forwarday, weighty)));
61
 
        v3 right = vnormalize(vcross(forward, up));
62
 
 
63
 
        
64
 
        m16 m = {{right.v.x, right.v.y, right.v.z, 0.0f,
65
 
                        forward.v.x, forward.v.y, forward.v.z, 0.0f,
66
 
                        up.v.x, up.v.y, up.v.z, 0.0f,
67
 
                        0.0f, 0.0f, 0.0f, 1.0f}};
68
 
        
69
 
        return m;
70
 
}
71
 
 
72
 
m16 computeAlignedBasesFromDownVector2(v3 acc, v3 pf)
73
 
{
74
 
        if (vdot(acc,acc) < FLT_EPSILON)
75
 
                acc = vcreate(0.0,0.0,-1.0);
76
 
        if (vdot(pf,pf) < FLT_EPSILON)
77
 
                pf = vcreate(0.0,1.0,0.0);
78
 
        v3 up = vnormalize(vnegate(acc));
79
 
        
80
 
        v3 right = vnormalize(vcross(pf, up));
81
 
        v3 forward = vnormalize(vcross(up,right));
82
 
 
83
 
        
84
 
        m16 m = {{right.v.x, right.v.y, right.v.z, 0.0f,
85
 
                        forward.v.x, forward.v.y, forward.v.z, 0.0f,
86
 
                        up.v.x, up.v.y, up.v.z, 0.0f,
87
 
                        0.0f, 0.0f, 0.0f, 1.0f}};
88
 
        
89
 
        return m;
90
 
}
91
 
 
92
 
 
93
 
CGPoint CGPointTransform(CGPoint a, CGAffineTransform m)
94
 
{
95
 
        CGPoint b;
96
 
        b.x = a.x*m.a + a.y*m.c + m.tx;
97
 
        b.y = a.x*m.b + a.y*m.d + m.ty;
98
 
        return b;
99
 
}
100
 
 
101
 
 
102
 
struct _bezierTransformerRec
103
 
{
104
 
        CGMutablePathRef                path;
105
 
        const CGAffineTransform m;
106
 
};
107
 
 
108
 
static void _pathTransformer(void *_info,
109
 
    const CGPathElement *element)
110
 
{
111
 
        struct _bezierTransformerRec* info = _info;
112
 
        CGMutablePathRef path = info->path;
113
 
 
114
 
        switch(element->type)
115
 
        {
116
 
                case kCGPathElementMoveToPoint:
117
 
                        CGPathMoveToPoint(path, &info->m, element->points[0].x, element->points[0].y);
118
 
                        break;
119
 
                case kCGPathElementAddLineToPoint:
120
 
                {
121
 
                        CGPathAddLineToPoint(path, &info->m, element->points[0].x, element->points[0].y);
122
 
                        break;
123
 
                }
124
 
                case kCGPathElementAddQuadCurveToPoint:
125
 
                {
126
 
                        CGPathAddQuadCurveToPoint(path, &info->m, element->points[0].x, element->points[0].y, element->points[1].x, element->points[1].y);
127
 
                        break;
128
 
                }
129
 
                case kCGPathElementAddCurveToPoint:
130
 
                {
131
 
                        CGPathAddCurveToPoint(path, &info->m, element->points[0].x, element->points[0].y, element->points[1].x, element->points[1].y, element->points[2].x, element->points[2].y);                      
132
 
                        break;
133
 
                }
134
 
                case kCGPathElementCloseSubpath:
135
 
                {
136
 
                        CGPathCloseSubpath(path);
137
 
                        break;
138
 
                }
139
 
        };
140
 
}
141
 
 
142
 
static void _pathTransformerM(void *_info,
143
 
    const CGPathElement *element)
144
 
{
145
 
        struct _bezierTransformerRec* info = _info;
146
 
        CGMutablePathRef path = info->path;
147
 
 
148
 
        switch(element->type)
149
 
        {
150
 
                case kCGPathElementMoveToPoint:
151
 
                {
152
 
                        CGPoint c0 = CGPointTransform(element->points[0], info->m);
153
 
                        CGPathMoveToPoint(path, NULL, c0.x, c0.y);
154
 
                        break;
155
 
                }
156
 
                case kCGPathElementAddLineToPoint:
157
 
                {
158
 
                        CGPoint c0 = CGPointTransform(element->points[0], info->m);
159
 
                        CGPathAddLineToPoint(path, NULL, c0.x, c0.y);
160
 
                        break;
161
 
                }
162
 
                case kCGPathElementAddQuadCurveToPoint:
163
 
                {
164
 
                        CGPoint c0 = CGPointTransform(element->points[0], info->m);
165
 
                        CGPoint c1 = CGPointTransform(element->points[1], info->m);
166
 
                        CGPathAddQuadCurveToPoint(path, NULL, c0.x, c0.y, c1.x, c1.y);
167
 
                        break;
168
 
                }
169
 
                case kCGPathElementAddCurveToPoint:
170
 
                {
171
 
                        CGPoint c0 = CGPointTransform(element->points[0], info->m);
172
 
                        CGPoint c1 = CGPointTransform(element->points[1], info->m);
173
 
                        CGPoint c2 = CGPointTransform(element->points[2], info->m);
174
 
                        CGPathAddCurveToPoint(path, NULL, c0.x, c0.y, c1.x, c1.y, c2.x, c2.y);                  
175
 
                        break;
176
 
                }
177
 
                case kCGPathElementCloseSubpath:
178
 
                {
179
 
                        CGPathCloseSubpath(path);
180
 
                        break;
181
 
                }
182
 
        };
183
 
}
184
 
 
185
 
 
186
 
CGPathRef CreateTransformedPathFromCGPath(CGPathRef cpath, CGAffineTransform m)
187
 
{
188
 
        struct _bezierTransformerRec rec = {CGPathCreateMutable(), m};
189
 
        CGPathApply(cpath, &rec, _pathTransformerM);
190
 
        
191
 
        return rec.path;
192
 
}

Loggerhead 1.17 is a web-based interface for Bazaar branches