| 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 |
} |