Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/CTextureAnimation.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations) (download) (as text)
Sun Aug 15 01:53:13 2010 UTC (13 years, 9 months ago) by okadu
File MIME type: text/x-c++src
File size: 9262 byte(s)


1 #include "stdafx.h"
2 #include "CCustomizerMisc.h"
3 #include "CModelPlugin.h"
4
5 // 外部グローバル
6 extern bool g_NamedObjectMipMap;
7 extern bool g_PreviewAnimation;
8
9 /*
10 * コンストラクタ
11 */
12 CTexAnimFrame::CTexAnimFrame(){
13 m_FrameTexture = NULL;
14 m_TexTrans = NULL;
15 }
16
17 /*
18 * コピーコンストラクタ
19 */
20 CTexAnimFrame::CTexAnimFrame(
21 const CTexAnimFrame &src // コピー元
22 ){
23 m_FrameLength = src.m_FrameLength;
24 m_TextureFileName = src.m_TextureFileName;
25 m_FrameTexture = src.m_FrameTexture;
26 m_TexTrans = src.m_TexTrans ? new CTextureTransformer(*src.m_TexTrans) : NULL;
27 }
28
29 /*
30 * コンストラクタ
31 */
32 CTexAnimFrame::CTexAnimFrame(
33 string tex, // テクスチャファイル名
34 int len // フレーム長
35 ){
36 m_FrameLength = len;
37 m_TextureFileName = tex;
38 m_FrameTexture = NULL;
39 m_TexTrans = NULL;
40 }
41
42 /*
43 * デストラクタ
44 */
45 CTexAnimFrame::~CTexAnimFrame(){
46 DELETE_V(m_TexTrans);
47 }
48
49 /*
50 * 読込
51 */
52 char *CTexAnimFrame::Read(
53 char *str // 対象文字列
54 ){
55 char *tmp, *eee;
56 if(!(str = Assignment(str, "Frame"))) return NULL;
57 if(!(str = StringLiteral(eee = str, &m_TextureFileName))) throw CSynErr(eee);
58 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
59 if(!(str = ConstInteger(eee = str, &m_FrameLength))) throw CSynErr(eee);
60 if(!(str = Character2(eee = str, ';'))) throw CSynErr(eee);
61 CTextureTransformer textrans;
62 if(tmp = textrans.Read(str, false)){
63 str = tmp;
64 m_TexTrans = new CTextureTransformer(textrans);
65 }
66 if(m_FrameLength<1) m_FrameLength = 1;
67 return str;
68 }
69
70 /*
71 * データ読込
72 */
73 void CTexAnimFrame::LoadData(){
74 m_FrameTexture = g_TexList.Get(FALSE, m_TextureFileName.c_str(), 0, !g_NamedObjectMipMap);
75 }
76
77 /*
78 * アニメーション適用
79 */
80 void CTexAnimFrame::Apply(
81 CMesh *mesh, // メッシュ
82 int matid // マテリアル ID
83 ){
84 mesh->SetCustomTexture(matid, m_FrameTexture);
85 if(m_TexTrans){
86 m_TexTrans->SetMaterialID(matid);
87 m_TexTrans->ApplyCustomizer(mesh);
88 }
89 }
90
91 ////////////////////////////////////////////////////////////////////////////////
92 ////////////////////////////////////////////////////////////////////////////////
93
94 /*
95 * 読込
96 */
97 char *CTexAnimState::Read(
98 char *str // 対象文字列
99 ){
100 char *eee;
101 if(!(str = Assignment(eee = str, "TexAnimState"))) return NULL;
102 if(!(str = ConstInteger(eee = str, &m_Frame))) throw CSynErr(eee);
103 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
104 if(!(str = ConstInteger(eee = str, &m_Count))) throw CSynErr(eee);
105 if(!(str = Character2(eee = str, ';'))) throw CSynErr(eee);
106 return str;
107 }
108
109 /*
110 * 保存
111 */
112 void CTexAnimState::Save(
113 FILE *df, // ファイル
114 char *ind // インデント
115 ){
116 fprintf(df, "%sTexAnimState = %d, %d;\n", ind, m_Frame, m_Count);
117 }
118
119 ////////////////////////////////////////////////////////////////////////////////
120 ////////////////////////////////////////////////////////////////////////////////
121
122 /*
123 * 読込
124 */
125 char *CTextureAnimation::Read(
126 char *str, // 対象文字列
127 CModelPlugin *mpi // モデルプラグイン
128 ){
129 char *tmp, *eee;
130 if(!(str = BeginNamedBlock(eee = str, "DefineAnimation", &m_AnimationName))) return NULL;
131
132 if(mpi->FindAnimation(m_AnimationName))
133 throw CSynErr(eee, "%s: \"%s\"", lang(OverlappedAnimation), m_AnimationName.c_str());
134
135 m_FrameList.clear();
136 while(true){
137 int i, numbegin, numend, framecount, framelength;
138 string texturefilename;
139 CTexAnimFrame frame;
140 if(tmp = frame.Read(str)){
141 str = tmp;
142 m_FrameList.push_back(frame);
143 }else if(tmp = Assignment(str, "NumberedFrame")){
144 str = tmp;
145 if(!(str = StringLiteral(eee = str, &texturefilename))) throw CSynErr(eee);
146 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
147 if(!(str = ConstInteger(eee = str, &numbegin))) throw CSynErr(eee);
148 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
149 if(!(str = ConstInteger(eee = str, &numend))) throw CSynErr(eee);
150 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
151 if(!(str = ConstInteger(eee = str, &framelength))) throw CSynErr(eee);
152 if(!(str = Character2(eee = str, ';'))) throw CSynErr(eee);
153 int delta = numbegin<numend ? 1 : -1;
154 while(true){
155 m_FrameList.push_back(CTexAnimFrame(
156 FlashIn((char *)texturefilename.c_str(), numbegin), framelength));
157 if(numbegin==numend) break;
158 numbegin += delta;
159 }
160 }else if(tmp = Assignment(str, "SlideUVFrame")){
161 str = tmp;
162 float u0, v0, du, dv;
163 if(!(str = StringLiteral(eee = str, &texturefilename))) throw CSynErr(eee);
164 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
165 if(!(str = ConstFloat(eee = str, &u0))) throw CSynErr(eee);
166 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
167 if(!(str = ConstFloat(eee = str, &v0))) throw CSynErr(eee);
168 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
169 if(!(str = ConstFloat(eee = str, &du))) throw CSynErr(eee);
170 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
171 if(!(str = ConstFloat(eee = str, &dv))) throw CSynErr(eee);
172 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
173 if(!(str = ConstInteger(eee = str, &framecount))) throw CSynErr(eee);
174 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
175 if(!(str = ConstInteger(eee = str, &framelength))) throw CSynErr(eee);
176 if(!(str = Character2(eee = str, ';'))) throw CSynErr(eee);
177 for(i = 0; i<framecount; i++){
178 m_FrameList.push_back(CTexAnimFrame(texturefilename, framelength));
179 float a[2] = {u0+du*i, v0+dv*i};
180 (m_FrameList.rbegin()->m_TexTrans
181 = new CTextureTransformer)->SetUpMatrix(1, a);
182 }
183 }else if(tmp = Assignment(str, "TiledUVFrame")){
184 str = tmp;
185 float su, sv, tw, th;
186 if(!(str = StringLiteral(eee = str, &texturefilename))) throw CSynErr(eee);
187 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
188 if(!(str = ConstFloat(eee = str, &su))) throw CSynErr(eee);
189 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
190 if(!(str = ConstFloat(eee = str, &sv))) throw CSynErr(eee);
191 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
192 if(!(str = ConstFloat(eee = str, &tw))) throw CSynErr(eee);
193 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
194 if(!(str = ConstFloat(eee = str, &th))) throw CSynErr(eee);
195 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
196 if(!(str = ConstInteger(eee = str, &framecount))) throw CSynErr(eee);
197 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
198 if(!(str = ConstInteger(eee = str, &framelength))) throw CSynErr(eee);
199 if(!(str = Character2(eee = str, ';'))) throw CSynErr(eee);
200 int cols = Round(1.0f/tw);
201 if(cols<=0) cols = 1;
202 for(i = 0; i<framecount; i++){
203 m_FrameList.push_back(CTexAnimFrame(texturefilename, framelength));
204 float a[4] = {su, sv, tw*(i%cols), th*(i/cols)};
205 (m_FrameList.rbegin()->m_TexTrans
206 = new CTextureTransformer)->SetUpMatrix(2, a);
207 }
208 }else if(tmp = Assignment(str, "RotationUVFrame")){
209 str = tmp;
210 float theta0, theta1, cu, cv;
211 if(!(str = StringLiteral(eee = str, &texturefilename))) throw CSynErr(eee);
212 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
213 if(!(str = ConstFloat(eee = str, &theta0))) throw CSynErr(eee);
214 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
215 if(!(str = ConstFloat(eee = str, &theta1))) throw CSynErr(eee);
216 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
217 if(!(str = ConstFloat(eee = str, &cu))) throw CSynErr(eee);
218 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
219 if(!(str = ConstFloat(eee = str, &cv))) throw CSynErr(eee);
220 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
221 if(!(str = ConstInteger(eee = str, &framecount))) throw CSynErr(eee);
222 if(!(str = Character2(eee = str, ','))) throw CSynErr(eee);
223 if(!(str = ConstInteger(eee = str, &framelength))) throw CSynErr(eee);
224 if(!(str = Character2(eee = str, ';'))) throw CSynErr(eee);
225 for(i = 0; i<framecount; i++){
226 m_FrameList.push_back(CTexAnimFrame(texturefilename, framelength));
227 float a[3] = {theta0+theta1*i, cu, cv};
228 (m_FrameList.rbegin()->m_TexTrans
229 = new CTextureTransformer)->SetUpMatrix(3, a);
230 }
231 }else{
232 break;
233 }
234 }
235 if(!(str = EndBlock(eee = str))) throw CSynErr(eee, ERR_ENDBLOCK);
236 return str;
237 }
238
239 /*
240 * データ読込
241 */
242 void CTextureAnimation::LoadData(){
243 int i, fn = m_FrameList.size();
244 for(i = 0; i<fn; i++) m_FrameList[i].LoadData();
245 }
246
247 /*
248 * 状態セット
249 */
250 void CTextureAnimation::SetState(
251 CTexAnimState *state // 状態変数
252 ){
253 if(!state){
254 state = &m_PreviewState;
255 if(g_PreviewAnimation) m_PreviewState.Step();
256 }
257 if(!m_FrameList.size()) return;
258 while(state->m_Count>=m_FrameList[state->m_Frame].m_FrameLength){
259 state->m_Count -= m_FrameList[state->m_Frame].m_FrameLength;
260 state->m_Frame++;
261 if(state->m_Frame>=m_FrameList.size()) state->m_Frame = 0;
262 }
263 m_CurrentFrame = state->m_Frame;
264 }
265
266 /*
267 * アニメーション適用
268 */
269 void CTextureAnimation::Apply(
270 CMesh *mesh, // メッシュ
271 int matid // マテリアル ID
272 ){
273 if(m_FrameList.size()) m_FrameList[m_CurrentFrame].Apply(mesh, matid);
274 else mesh->SetCustomTexture(matid, NULL);
275 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26