static int LABEL_GET(char *strOut, char *strBuf) { if(sys.bError) return 0; // エラーが出ている場合は処理しない int i, iLen = 0; SPACE_DEL(strBuf, &iLen); // 先頭の空白を削る for(i = 0;; iLen++) // strOut にラベルを取り出す { uchar a = strBuf[iLen]; if((uchar)(a - '0') <= 9){ strOut[i] = a; i++; continue;} // 数字か? if((uchar)(a - 'a') < 26){ strOut[i] = a; i++; continue;} // 小文字か? if((uchar)(a - 'A') < 26){ strOut[i] = a; i++; continue;} // 大文字か? if((uchar)a == '_'){ strOut[i] = a; i++; continue;} // アンダーバーか? if(ISKANJI(a)) // 全角? { strOut[i + 0] = strBuf[iLen + 0]; strOut[i + 1] = strBuf[iLen + 1]; i += 2, iLen++; continue; } break; } strOut[i] = NULL; return iLen; }
void file_catname(OEMCHAR *path, const OEMCHAR *filename, int maxlen) { for (; maxlen > 0; path++, maxlen--) { if (*path == '\0') { break; } } if (maxlen > 0) { milstr_ncpy(path, filename, maxlen); for (; *path != '\0'; path++) { if (!ISKANJI(*path)) { path++; if (*path == '\0') { break; } } else if (((*path - 0x41) & 0xff) < 26) { *path |= 0x20; } else if (*path == '\\') { *path = '/'; } } } }
/*-----------------------------------------------------------------------------------------* | <<< コマンド : Scene { >>> ※ シーンは全て読み飛ばされる *-----------------------------------------------------------------------------------------*/ static void ComScene(void) { while(MetaText[iMetaCount] != '}') { if(ISKANJI(MetaText[iMetaCount])){ iMetaCount++;} iMetaCount++; } iMetaCount++; }
/*-----------------------------------------------------------------------------------------* | <<< コマンド : Material >>> | 入力 bUV = false : uv のチェックを行わない(法線マップを作成する際に使用) *-----------------------------------------------------------------------------------------*/ static void ComMaterial(BOOL bUV) { float a; iMetaCount += PARAM_GET(&a, &MetaText[iMetaCount]); meta->iMatCount = (int)a; // マテリアル総数 iMetaCount += 1; // "{" 分移動 // テクスチャーデータの書き込み位置を設定 meta->pTex = &meta->atex[meta->iMatID]; //--- 各パラメータ抽出 ------------------------------------------ while(MetaText[iMetaCount] != '}') { // 改行を見つけたら、次へすすむ char str[512]; if(MetaText[iMetaCount] == '\r' && MetaText[iMetaCount + 1] == '\n') { meta->iMatID++; // マテリアル読み込み終了なので、次へ進める // テクスチャーデータの書き込み位置を設定 meta->pTex = &meta->atex[meta->iMatID]; iMetaCount += 2; //--- マテリアル名を得る -------------------------------- int i = GET_STRING(str, &MetaText[iMetaCount]); if(meta_obj_name_func != NULL) // オブジェ名を外部へ渡す { void(*func)(int iNum, char *str); func = (void(*)(int iNum, char *str))meta_obj_name_func; (*func)(meta->iMatID, str); } iMetaCount += i; //------------------------------------------------------- } //--- コマンドチェック -------------------------------------- BOOL bRet = CommandCheck(bUV); //--- 半角・全角チェック ------------------------------------ if(!bRet) { //char str[512]; // ダブルクォーテーション中に コマンドが入っているのを防ぐため、こうする。 int i = GET_STRING(str, &MetaText[iMetaCount]); iMetaCount += i; if(i == 0) { if(ISKANJI(MetaText[iMetaCount])){ iMetaCount += 2;} // 全角 else { iMetaCount += 1;} // 半角 } } } iMetaCount++; meta->pTex = NULL; // テクスチャーデータの書き込み位置をクリアー }
static int euckanji1st(const OEMCHAR *str, int pos) { int ret; int c; for (ret = 0; pos >= 0; ret ^= 1) { c = (UINT8)str[pos--]; if (!ISKANJI(c)) break; } return ret; }
OEMCHAR * file_getname(const OEMCHAR *path) { const OEMCHAR *ret; for (ret = path; *path != '\0'; path++) { if (ISKANJI(*path)) { path++; if (*path == '\0') { break; } } else if (*path == '/') { ret = path + 1; } } return (OEMCHAR *)ret; }
/*------------------------------------------------------------------------------* | <<< strBuf より文字列を得る >>> | ※"(ダブルクォーテーション)で始まり、" で終了 | 入力 strBuf = 対象文字列 | 出力 strOut = 取り出した文字列 | 戻り値 取り出した文字数 *------------------------------------------------------------------------------*/ static int GET_STRING(char *strOut, char *strBuf) { if(sys.bError){ return 0;} // エラーが出ている場合は処理しない int i, iLen = 0; //--- 先頭の " を探す ----------------------------------------- SPACE_DEL(strBuf, &iLen); if(strBuf[iLen] == '"') { iLen += 1; } else { return 0; } //--- 後ろの " を探す ----------------------------------------- for(i = 0;;i++, iLen += 1) { if(strBuf[iLen] == NULL) { return 0; } else if(strBuf[iLen] == '"') { iLen += 1; break; } if(ISKANJI(strBuf[iLen])) { strOut[i + 0] = strBuf[iLen + 0]; strOut[i + 1] = strBuf[iLen + 1]; i++, iLen += 1; } else { strOut[i + 0] = strBuf[iLen]; } } //--- NULL 処理 ----------------------------------------------- if(iLen > 0) strOut[i] = NULL; return iLen; }
void file_catname(char *path, const char *sjis, int maxlen) { char *p; p = path + strlen(path); milstr_ncat(path, sjis, maxlen); while(1) { if (ISKANJI(*p)) { if (*(p+1) == '\0') { break; } p++; } else if ((*p == '/') || (*p == '\\')) { *p = ':'; } else if (*p == '\0') { break; } p++; } }
/*-----------------------------------------------------------------------------------------* | <<< テキストメイン >>> | 入力 bUV = false : uv のチェックを行わない(法線マップを作成する際に使用) *-----------------------------------------------------------------------------------------*/ static void TextMain_(BOOL bUV) { while(MetaText[iMetaCount] != NULL) // 文字列の終端ならば処理しない { //--- コマンドチェック -------------------------------------- BOOL bRet = CommandCheck(bUV); //--- 半角・全角チェック ------------------------------------ if(!bRet) { char str[4096]; // ダブルクォーテーション中に コマンドが入っているのを防ぐため、こうする。 int i = GET_STRING(str, &MetaText[iMetaCount]); iMetaCount += i; if(i == 0) { if(ISKANJI(MetaText[iMetaCount])){ iMetaCount += 2;} // 全角 else { iMetaCount += 1;} // 半角 } } } }
/*------------------------------------------------------------------------------* | <<< アンチフォントをテクスチャーに直書き >>> | 入力 iID = 管理番号 | buf = VRAM のアドレス | usX, usY = 文字の描画座標 | *str = 文字(シフトJIS or Ascii) *------------------------------------------------------------------------------*/ static void AFontDraw(int iID, int iTexNum, DWORD *buf, ushort usX, ushort usY, char *str) { AFONT_WORK *a = &afont[iID]; int iW = d3.fontInfo[a->cFontNum].Width; int iH = d3.fontInfo[a->cFontNum].Height; uint uiSize = (iW * 2) * (iH * 2); TEXTMETRIC tm; //--- 文字コードよりアンチフォントを得る ------------------------ // a->pBuf に文字の情報が返ってきます if(!ISKANJI(str[0])) // 半角 { AFontPixelGet(iID, *str, &tm); } else // 全角 { AFontPixelGet(iID, (((uchar)str[0] << 8 | (uchar)str[1])), &tm); } //--- VRAM に直で書き込み --------------------------------------- uchar *p = a->pBuf; uint x, y; uint h = (uint) a->gmAnt.gmBlackBoxY; uint w = (uint)((a->gmAnt.gmBlackBoxX + 3) & 0xfffffffc); uint uiAdr = 0; uint uiTexSize = (uint)(d3.texInfo[iTexNum].fWidth * d3.texInfo[iTexNum/*TEX_AFONT + iID*/].fHeight); for(y = 0; y < h; y++) { for(x = 0; x < w; x++, uiAdr++) { // 65 階調で値が返ってくるので、適当に加工する int c = p[uiAdr]; if(c <= 1){ continue;} c = (c - 2) * 4 + 3; // 微妙な文字の位置を補正しながら描画 uint uiAdr2 = AFONT_ADR(iID, usX + x + a->gmAnt.gmptGlyphOrigin.x, usY + y + (tm.tmAscent - a->gmAnt.gmptGlyphOrigin.y)); if(uiAdr2 >= 0 && uiAdr2 < uiTexSize) { int a_ = (uint)(((float)((a->dwCol >> 24) &0xff) * (float)c) / 255.f); int r_ = (uint)(((float)((a->dwCol >> 16) &0xff) * (float)c) / 255.f); int g_ = (uint)(((float)((a->dwCol >> 8) &0xff) * (float)c) / 255.f); int b_ = (uint)(((float)((a->dwCol >> 0) &0xff) * (float)c) / 255.f); DWORD dwCol0 = D3_COL(a_, r_, g_, b_); DWORD dwCol1 = D3_COL(a_, 1, 1, 1); buf[uiAdr2] = dwCol0; // 影をつけてみる buf[uiAdr2 + 1] = dwCol1; if(buf[uiAdr2 - 1] == 0){ buf[uiAdr2 - 1] = dwCol1;} int h = (int)d3.texInfo[TEX_AFONT + iID].fWidth; if(((int)uiAdr2 - (int)h) >= 0 && buf[uiAdr2 - h] == 0){ buf[uiAdr2 - h] = dwCol1;} buf[uiAdr2 + h] = dwCol1; } } }
/*-----------------------------------------------------------------------------------------* | <<< コマンド : Object >>> ※可視、不可視をチェックし、不可視なら読み飛ばす *-----------------------------------------------------------------------------------------*/ static void ComObject(void) { char str[512]; // ダブルクォーテーション中に コマンドが入っているのを防ぐため、こうする。 //--- 最初のカッコまで文字を進める ------------------------------ //Text[iCount] = Text[iCount]; while(MetaText[iMetaCount] != '{') { int i = GET_STRING(str, &MetaText[iMetaCount]); iMetaCount += i; if(i == 0) { if(ISKANJI(MetaText[iMetaCount])){ iMetaCount += 2;} // 全角 else { iMetaCount += 1;} // 半角 } /* if(meta_obj_name_func != NULL) // オブジェ名を外部へ渡す { void(*func)(int iNum, char *str); func = (void(*)(int iNum, char *str))meta_obj_name_func; (*func)(meta->iObjNum, str); }*/ } iMetaCount++; //--- 最後のカッコまで文字を進める ------------------------------ #ifdef _DEBUG strcpy(meta->strName, str); #endif char *a = strstr(&MetaText[iMetaCount], "visible"); // visible まで文字を進める iMetaCount += (a - &MetaText[iMetaCount]) + 8; //iCount += 11; if(meta_visible_func != NULL) // 可視情報を外部へ渡す(現在、未動作) { void(*func)(int iNum, BOOL b); func = (void(*)(int iNum, BOOL b))meta_visible_func; //(*func)(meta->iObjNum, Text[iCount] != '0'); (*func)(meta->iObjNum, true); // 現在は必ず可視として渡す } if(!bVisibleSkip || MetaText[iMetaCount] != '0'){ return;}// visible をチェックする iMetaCount++; for(;;) { char str[512]; // ダブルクォーテーション中に コマンドが入っているのを防ぐため、こうする。 int i = GET_STRING(str, &MetaText[iMetaCount]); iMetaCount += i; if(i == 0) { // 全角 if(ISKANJI(MetaText[iMetaCount])) { iMetaCount += 2; } else { if(MetaText[iMetaCount] == '\r' && MetaText[iMetaCount + 1] == '\n' && MetaText[iMetaCount + 2] == '}'){ break;} iMetaCount += 1; // 半角 } } } iMetaCount += 3; }