-
-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathcontroller.h
More file actions
156 lines (132 loc) · 4.25 KB
/
controller.h
File metadata and controls
156 lines (132 loc) · 4.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*
* This file is part of the gk project (https://github.com/recp/gk)
* Copyright (c) Recep Aslantas.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef gk_controller_h
#define gk_controller_h
#include "common.h"
#include "value.h"
struct GkAnimation;
struct GkScene;
struct GkNode;
struct GkChannel;
struct GkPipeline;
struct GkVertexInput;
typedef enum GkControllerType {
GK_CONTROLLER_UNKNOWN = 0,
GK_CONTROLLER_SKIN = 1,
GK_CONTROLLER_MORPH = 2
} GkControllerType;
typedef enum GkMorphMethod {
GK_MORPH_METHOD_NORMALIZED = 1,
GK_MORPH_METHOD_RELATIVE = 2,
GK_MORPH_METHOD_ADDITIVE = GK_MORPH_METHOD_RELATIVE
} GkMorphMethod;
typedef struct GkController {
struct GkController *next;
void *source; /* source geometry or controller */
GkControllerType type;
} GkController;
typedef struct GkBoneWeight {
uint32_t joint;
float weight;
} GkBoneWeight;
typedef struct GkBoneWeights {
uint16_t *pJointsCount;
size_t *pWeightsIndex;
GkBoneWeight *weights;
size_t nWeights;
size_t nVertex;
} GkBoneWeights;
typedef struct GkSkin {
GkController base;
mat4 *invBindPoses; /* inv joint matrices */
struct GkNode **joints;
GkBoneWeights **weights; /* per primitive Client buffers */
GkGpuBuffer **gbuffs; /* per primitive GPU buffers */
mat4 bindShapeMatrix;
size_t nJoints;
uint32_t nPrims;
} GkSkin;
typedef struct GkMorphTarget {
struct GkMorphTarget *next;
struct GkVertexInput *inputs;
GkGpuBuffer *bufs;
float weight;
uint32_t nInputs;
uint32_t bufc;
} GkMorphTarget;
typedef enum GkMorphOrder {
GK_IORD_P1P2N1N2 = 0,
GK_IORD_P1N1P2N2 = 1
} GkMorphOrder;
typedef struct GkMorph {
GkMorphTarget *targets;
GkGpuBuffer *buff; /* must be interleaved */
struct FList *allInputs; /* shader ready inputs, NULL to reset */
uint32_t nTargets;
GkMorphMethod method;
GkMorphOrder order;
} GkMorph;
typedef struct GkInstanceMorph {
GkGeometry *baseGeometry;
GkMorph *morph;
float *overrideWeights; /* override default weights or NULL */
uint32_t nOverrideWeights;
} GkInstanceMorph;
typedef struct GkControllerInst {
struct GkControllerInst *next;
GkController *ctlr;
struct GkNode **joints;
} GkControllerInst;
GK_EXPORT
void
gkAttachSkin(GkSkin * __restrict skin);
GK_EXPORT
void
gkAttachSkinTo(GkSkin * __restrict skin,
GkGeometryInst * __restrict modelInst);
GK_EXPORT
void
gkUniformJoints(struct GkScene * __restrict scene,
struct GkGeometryInst * __restrict modelInst);
GK_EXPORT
void
gkUniformTargetWeights(struct GkScene * __restrict scene,
struct GkGeometryInst * __restrict modelInst,
float * __restrict weights,
uint32_t nWeights);
GK_EXPORT
void
gkMakeInstanceSkin(struct GkScene * __restrict scene,
struct GkNode * __restrict node,
struct GkControllerInst * __restrict ctlrInst);
GK_EXPORT
void
gkDrawBones(struct GkScene * __restrict scene);
GK_EXPORT
void
gkPrepMorph(GkMorph * __restrict morph);
GK_EXPORT
void
gkAttachMorphTo(GkMorph * __restrict morph,
GkGeometryInst * __restrict modelInst);
GK_EXPORT
void
gkMakeInstanceMorph(struct GkScene * __restrict scene,
struct GkNode * __restrict node,
struct GkInstanceMorph * __restrict morphInst);
#endif /* gk_controller_h */