diff --git a/DxASyncLoad.cpp b/DxASyncLoad.cpp index 27e7ac3..6b91254 100644 --- a/DxASyncLoad.cpp +++ b/DxASyncLoad.cpp @@ -2,7 +2,7 @@ // // DXライブラリ 非同期読み込み処理プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -789,6 +789,41 @@ extern int ResumeASyncLoadThread( int AddMaxThreadNum ) // クリティカルセクションの取得 CRITICALSECTION_LOCK( &GASyncLoadData.CriticalSection ) ; + // メインスレッドによる処理完了待ちでスレッドを止めていて、且つメインスレッドによる処理が完了しているスレッドを一つ起こす + AInfo = GASyncLoadData.Thread ; + for( i = 0 ; i < GASyncLoadData.ThreadNum ; i ++, AInfo ++ ) + { + if( AInfo->ExitFlag == TRUE || + AInfo->SuspendFlag == FALSE || + AInfo->JobFlag == FALSE ) + continue ; + + if( AInfo->MainThreadRequestSuspend == TRUE && AInfo->MainThreadRequest == FALSE ) + { + // 起こす + AInfo = &GASyncLoadData.Thread[ i ] ; + if( Thread_Resume( &AInfo->ThreadInfo ) == 0 ) + { + // 既に起きていたら何もせず次のループへ + continue ; + } + + // メインスレッドによる処理完了待ちでスレッドを止めているフラグを倒す + if( AInfo->MainThreadRequestSuspend ) + { + AInfo->MainThreadRequestSuspend = FALSE ; + GASyncLoadData.MainThreadRequestSuspendThreadNum -- ; + } + + // 寝ているフラグを倒す + AInfo->SuspendFlag = FALSE ; + GASyncLoadData.ThreadResumeNum ++ ; + + // 起こすのは一つだけなのでここでループを抜ける + break ; + } + } + // 起きているスレッドが一定数以上だったら起こさない if( GASyncLoadData.ThreadResumeNum >= GASyncLoadData.ThreadMaxResumeNum + AddMaxThreadNum ) { @@ -1016,6 +1051,12 @@ extern int AddASyncLoadRequestMainThreadInfo( ASYNCLOAD_MAINTHREAD_REQUESTINFO * AInfo->SuspendStartTime = NS_GetNowCount() ; GASyncLoadData.ThreadResumeNum -- ; + // メインスレッドへのリクエストを行うからスレッドを止めているかのフラグを立てる + AInfo->MainThreadRequestSuspend = TRUE ; + + // メインスレッドへのリクエストを行うから止めているスレッドの数をインクリメント + GASyncLoadData.MainThreadRequestSuspendThreadNum ++ ; + // クリティカルセクションの解放 CriticalSection_Unlock( &GASyncLoadData.CriticalSection ) ; diff --git a/DxASyncLoad.h b/DxASyncLoad.h index 2903d84..e65ac26 100644 --- a/DxASyncLoad.h +++ b/DxASyncLoad.h @@ -2,7 +2,7 @@ // // DXライブラリ 非同期読み込み処理プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -66,6 +66,7 @@ struct ASYNCLOADTHREADINFO DWORD ExitFlag ; // スレッドが終了時に立てるフラグ int JobFlag ; // 現在仕事をしているかどうかのフラグ int MainThreadRequest ; // メインスレッドへのリクエストを行っている最中かのフラグ + int MainThreadRequestSuspend ; // メインスレッドへのリクエストを行うためにスレッドが止まっているかのフラグ int SuspendFlag ; // スレッドがとまっているかどうかのフラグ int SuspendStartTime ; // スレッドがとまったときの時間 struct ASYNCLOADDATA_COMMON *Data ; // 処理中のデータ @@ -86,6 +87,7 @@ struct ASYNCLOADDATA ASYNCLOAD_MAINTHREAD_REQUESTINFO *MainThreadRequestInfo[ ASYNCLOADTHREAD_MAXNUM ] ; // メインスレッドへの処理依頼 volatile int MainThreadRequestInfoNum ; // メインスレッドへの処理依頼の数 + volatile int MainThreadRequestSuspendThreadNum ; // メインスレッドへの処理依頼をしているから止まっているスレッドの数 ASYNCLOADDATA_COMMON *Data[ ASYNCLOADDATA_MAXNUM ] ; // 非同期読み込みデータのポインタ配列へのポインタ int DataNum ; // 非同期読み込みデータの数 diff --git a/DxArchive_.cpp b/DxArchive_.cpp index 6de1644..b35c7c9 100644 --- a/DxArchive_.cpp +++ b/DxArchive_.cpp @@ -2,7 +2,7 @@ // // DXライブラリ アーカイブ制御プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -200,7 +200,7 @@ BYTE BitStream_GetBitNum( ULONGLONG Data ) DWORD i ; for( i = 1 ; i < 64 ; i ++ ) { - if( Data < ( 1ULL << i ) ) + if( Data < ( ULL_NUM( 1 ) << i ) ) { return ( BYTE )i ; } diff --git a/DxArchive_.h b/DxArchive_.h index 7fe5821..1848cec 100644 --- a/DxArchive_.h +++ b/DxArchive_.h @@ -2,7 +2,7 @@ // // DXライブラリ 通信プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxBaseFunc.cpp b/DxBaseFunc.cpp index cce6e10..ceda152 100644 --- a/DxBaseFunc.cpp +++ b/DxBaseFunc.cpp @@ -2,7 +2,7 @@ // // DXライブラリ 標準関数の互換関数プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxBaseFunc.h b/DxBaseFunc.h index 18fe130..96e7a0b 100644 --- a/DxBaseFunc.h +++ b/DxBaseFunc.h @@ -2,7 +2,7 @@ // // DXライブラリ 標準関数の互換関数プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxBaseImage.cpp b/DxBaseImage.cpp index 32e17a5..ad938e6 100644 --- a/DxBaseImage.cpp +++ b/DxBaseImage.cpp @@ -2,7 +2,7 @@ // // DXライブラリ BaseImageプログラム // -// Ver 3.21d +// Ver 3.21f // // ---------------------------------------------------------------------------- @@ -25,6 +25,8 @@ #ifdef WINDOWS_DESKTOP_OS #include "Windows/DxBaseImageWin.h" #include "Windows/DxWinAPI.h" +#include "Windows/DxGraphicsWin.h" +#include "Windows/DxGraphicsD3D11.h" #endif // WINDOWS_DESKTOP_OS #ifdef __ANDROID__ @@ -6640,6 +6642,17 @@ extern int NS_GetDesktopScreenBaseImage( int x1, int y1, int x2, int y2, BASEIMA SETUP_WIN_API +#ifndef DX_NON_DIRECT3D11 + // Direct3D11 の場合は別処理 + if( GRAWIN.Setting.UseGraphicsAPI == GRAPHICS_API_DIRECT3D11_WIN32 ) + { + if( Graphics_Hardware_D3D11_GetDesktopScreenBaseImage_PF( x1, y1, x2, y2, BaseImage, DestX, DestY ) == 0 ) + { + return 0 ; + } + } +#endif // DX_NON_DIRECT3D11 + // デスクトップウインドウハンドルを取得 DesktopHWND = WinAPIData.Win32Func.GetDesktopWindowFunc() ; diff --git a/DxBaseImage.h b/DxBaseImage.h index fb919b1..4c18d21 100644 --- a/DxBaseImage.h +++ b/DxBaseImage.h @@ -2,7 +2,7 @@ // // DXライブラリ BaseImageプログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxChar.cpp b/DxChar.cpp index 61bdcce..44a90a5 100644 --- a/DxChar.cpp +++ b/DxChar.cpp @@ -2,7 +2,7 @@ // // DXライブラリ 文字コード関係プログラム // -// Ver 3.21d +// Ver 3.21f // // ---------------------------------------------------------------------------- @@ -19,7 +19,10 @@ #include "DxChar.h" #include #include -//#include "DxSystem.h" + +#ifdef WINDOWS_DESKTOP_OS +#include "Windows/DxWinAPI.h" +#endif // WINDOWS_DESKTOP_OS #ifndef DX_NON_NAMESPACE @@ -3275,6 +3278,144 @@ extern DWORD GetStringCharCode( const char *String, int CharCodeFormat, int Inde return CharCode ; } +// 指定の文字コードに適合する文字の数を取得する +extern DWORD CheckCharCodeFormat( const char *String, int CharCodeFormat, int *IsAllSuccess ) +{ + size_t i ; + size_t j ; + int CharCount = 0 ; + int SuccessCount = 0 ; + int CharBytes ; + DWORD CharCode ; + DWORD UTFCode ; + + switch( CharCodeFormat ) + { + case DX_CHARCODEFORMAT_SHIFTJIS : + case DX_CHARCODEFORMAT_GB2312 : + case DX_CHARCODEFORMAT_UHC : + case DX_CHARCODEFORMAT_BIG5 : + case DX_CHARCODEFORMAT_WINDOWS_1252 : + case DX_CHARCODEFORMAT_ISO_IEC_8859_15 : + case DX_CHARCODEFORMAT_ASCII : + for( i = 0 ; ( ( BYTE * )String )[ i ] != 0 ; ) + { + j = i ; + CharCode = GetCharCode_inline( &String[ i ], CharCodeFormat, &CharBytes, i ) ; + UTFCode = ConvCharCode_inline( CharCode, CharCodeFormat, DX_CHARCODEFORMAT_UTF32LE ) ; + if( UTFCode == 0 ) + { + i = j + 1 ; + } + else + { + SuccessCount ++ ; + } + CharCount ++ ; + } + break ; + + case DX_CHARCODEFORMAT_UTF8 : + for( i = 0 ; ( ( BYTE * )String )[ i ] != 0 ; ) + { + j = i ; + UTFCode = GetCharCode_inline( &String[ i ], CharCodeFormat, &CharBytes, i ) ; + CharCode = ConvCharCode_inline( UTFCode, CharCodeFormat, DX_CHARCODEFORMAT_SHIFTJIS ) ; + if( CharCode == 0 ) + { + CharCode = ConvCharCode_inline( UTFCode, CharCodeFormat, DX_CHARCODEFORMAT_GB2312 ) ; + } + if( CharCode == 0 ) + { + CharCode = ConvCharCode_inline( UTFCode, CharCodeFormat, DX_CHARCODEFORMAT_UHC ) ; + } + if( CharCode == 0 ) + { + CharCode = ConvCharCode_inline( UTFCode, CharCodeFormat, DX_CHARCODEFORMAT_BIG5 ) ; + } + if( CharCode == 0 ) + { + i = j + 1 ; + } + else + { + SuccessCount ++ ; + } + CharCount ++ ; + } + break ; + + case DX_CHARCODEFORMAT_UTF16LE : + case DX_CHARCODEFORMAT_UTF16BE : + for( i = 0 ; ( ( WORD * )String )[ i ] != 0 ; ) + { + j = i ; + UTFCode = GetCharCode_inline( &String[ i * 2 ], CharCodeFormat, &CharBytes, i ) ; + CharCode = ConvCharCode_inline( UTFCode, CharCodeFormat, DX_CHARCODEFORMAT_SHIFTJIS ) ; + if( CharCode == 0 ) + { + CharCode = ConvCharCode_inline( UTFCode, CharCodeFormat, DX_CHARCODEFORMAT_GB2312 ) ; + } + if( CharCode == 0 ) + { + CharCode = ConvCharCode_inline( UTFCode, CharCodeFormat, DX_CHARCODEFORMAT_UHC ) ; + } + if( CharCode == 0 ) + { + CharCode = ConvCharCode_inline( UTFCode, CharCodeFormat, DX_CHARCODEFORMAT_BIG5 ) ; + } + if( CharCode == 0 ) + { + i = j + 1 ; + } + else + { + SuccessCount ++ ; + } + CharCount ++ ; + } + break ; + + case DX_CHARCODEFORMAT_UTF32LE : + case DX_CHARCODEFORMAT_UTF32BE : + for( i = 0 ; ( ( DWORD * )String )[ i ] != 0 ; ) + { + j = i ; + UTFCode = GetCharCode_inline( &String[ i * 4 ], CharCodeFormat, &CharBytes, i ) ; + CharCode = ConvCharCode_inline( UTFCode, CharCodeFormat, DX_CHARCODEFORMAT_SHIFTJIS ) ; + if( CharCode == 0 ) + { + CharCode = ConvCharCode_inline( UTFCode, CharCodeFormat, DX_CHARCODEFORMAT_GB2312 ) ; + } + if( CharCode == 0 ) + { + CharCode = ConvCharCode_inline( UTFCode, CharCodeFormat, DX_CHARCODEFORMAT_UHC ) ; + } + if( CharCode == 0 ) + { + CharCode = ConvCharCode_inline( UTFCode, CharCodeFormat, DX_CHARCODEFORMAT_BIG5 ) ; + } + if( CharCode == 0 ) + { + i = j + 1 ; + } + else + { + SuccessCount ++ ; + } + CharCount ++ ; + } + break ; + } + + if( IsAllSuccess != NULL ) + { + *IsAllSuccess = CharCount == SuccessCount ? TRUE : FALSE ; + } + + return SuccessCount ; +} + @@ -4834,6 +4975,65 @@ extern char * CL_strupr( int CharCodeFormat, char *Str ) return Str ; } +extern char *CL_strlwr( int CharCodeFormat, char *Str ) +{ + DWORD StrCharCode ; + int CodeBytes ; + int i ; + size_t j = 0 ; + + switch( GetCharCodeFormatUnitSize_inline( CharCodeFormat ) ) + { + case 1 : + for( i = 0 ; ( ( BYTE * )Str )[ i ] != 0 ; i ++ ) + { + StrCharCode = GetCharCode_inline( ( const char * )&( ( BYTE * )Str )[ i ], CharCodeFormat, &CodeBytes, j ) ; + if( StrCharCode >= 0x41 && StrCharCode <= 0x5a ) + { + StrCharCode = StrCharCode - 0x41 + 0x61 ; + PutCharCode_inline( StrCharCode, CharCodeFormat, ( char * )&( ( BYTE * )Str )[ i ] ) ; + } + + if( CodeBytes > 1 ) + { + i ++ ; + } + } + break ; + + case 2 : + for( i = 0 ; ( ( WORD * )Str )[ i ] != 0 ; i ++ ) + { + StrCharCode = GetCharCode_inline( ( const char * )&( ( WORD * )Str )[ i ], CharCodeFormat, &CodeBytes, j ) ; + if( StrCharCode >= 0x41 && StrCharCode <= 0x5a ) + { + StrCharCode = StrCharCode - 0x41 + 0x61 ; + PutCharCode_inline( StrCharCode, CharCodeFormat, ( char * )&( ( WORD * )Str )[ i ] ) ; + } + + if( CodeBytes > 2 ) + { + i ++ ; + } + } + break ; + + case 4 : + for( i = 0 ; ( ( DWORD * )Str )[ i ] != 0 ; i ++ ) + { + StrCharCode = GetCharCode_inline( ( const char * )&( ( DWORD * )Str )[ i ], CharCodeFormat, &CodeBytes, j ) ; + if( StrCharCode >= 0x41 && StrCharCode <= 0x5a ) + { + StrCharCode = StrCharCode - 0x41 + 0x61 ; + PutCharCode_inline( StrCharCode, CharCodeFormat, ( char * )&( ( DWORD * )Str )[ i ] ) ; + } + } + break ; + } + + return Str ; +} + static DWORD CL_vsnprintf_help_getnumber( const DWORD *CharCode, int *UseCharNum ) { DWORD Result ; diff --git a/DxChar.h b/DxChar.h index 4d84f97..967806a 100644 --- a/DxChar.h +++ b/DxChar.h @@ -2,7 +2,7 @@ // // DXライブラリ 文字コード関係プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -103,6 +103,7 @@ extern CHARCODESYSTEM g_CharCodeSystem ; extern int GetStringCharNum( const char *String, int CharCodeFormat ) ; // 文字列に含まれる文字数を取得する extern const char * GetStringCharAddress( const char *String, int CharCodeFormat, int Index ) ; // 指定番号の文字のアドレスを取得する extern DWORD GetStringCharCode( const char *String, int CharCodeFormat, int Index ) ; // 指定番号の文字のコードを取得する +extern DWORD CheckCharCodeFormat( const char *String, int CharCodeFormat, int *IsAllSuccess ) ; // 指定の文字コードに適合する文字の数を取得する extern void CL_strcpy( int CharCodeFormat, char *Dest, const char *Src ) ; extern void CL_strcpy_s( int CharCodeFormat, char *Dest, size_t BufferBytes, const char *Src ) ; @@ -148,6 +149,7 @@ extern int CL_strchr2( int CharCodeFormat, const char *Str, DWORD C extern const char * CL_strrchr( int CharCodeFormat, const char *Str, DWORD CharCode ) ; extern int CL_strrchr2( int CharCodeFormat, const char *Str, DWORD CharCode ) ; extern char * CL_strupr( int CharCodeFormat, char *Str ) ; +extern char * CL_strlwr( int CharCodeFormat, char *Str ) ; extern int CL_vsprintf( int CharCodeFormat, int IsWChar, int CharCharCodeFormat, int WCharCharCodeFormat, char *Buffer, const char *FormatString, va_list Arg ) ; extern int CL_vsnprintf( int CharCodeFormat, int IsWChar, int CharCharCodeFormat, int WCharCharCodeFormat, char *Buffer, size_t BufferSize, const char *FormatString, va_list Arg ) ; extern int CL_sprintf( int CharCodeFormat, int IsWChar, int CharCharCodeFormat, int WCharCharCodeFormat, char *Buffer, const char *FormatString, ... ) ; diff --git a/DxCharCodeTable.cpp b/DxCharCodeTable.cpp index 49383e6..8a78169 100644 --- a/DxCharCodeTable.cpp +++ b/DxCharCodeTable.cpp @@ -2,7 +2,7 @@ // // DXライブラリ キャラクタコードテーブル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxCompileConfig.h b/DxCompileConfig.h index 39e6ce5..46b4569 100644 --- a/DxCompileConfig.h +++ b/DxCompileConfig.h @@ -2,7 +2,7 @@ // // DXライブラリ コンパイルコンフィグヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ---------------------------------------------------------------------------- diff --git a/DxDataType.h b/DxDataType.h index 59ca731..4b9bdca 100644 --- a/DxDataType.h +++ b/DxDataType.h @@ -2,7 +2,7 @@ // // DXライブラリ データタイプ定義ヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxDataTypeAndroid.h b/DxDataTypeAndroid.h index 80873fd..6b1c886 100644 --- a/DxDataTypeAndroid.h +++ b/DxDataTypeAndroid.h @@ -2,7 +2,7 @@ // // DXライブラリ Nintendo Switch用データタイプ定義ヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxDataTypeWin.h b/DxDataTypeWin.h index 4b9e752..81cc40f 100644 --- a/DxDataTypeWin.h +++ b/DxDataTypeWin.h @@ -2,7 +2,7 @@ // // DXライブラリ Windows用データタイプ定義ヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxDataTypeiOS.h b/DxDataTypeiOS.h index 83fb8d4..c437748 100644 --- a/DxDataTypeiOS.h +++ b/DxDataTypeiOS.h @@ -2,7 +2,7 @@ // // DXライブラリ iOS用データタイプ定義ヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxFile.cpp b/DxFile.cpp index a50ded2..42e67cb 100644 --- a/DxFile.cpp +++ b/DxFile.cpp @@ -2,7 +2,7 @@ // // DXライブラリ ファイルアクセスプログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -1377,7 +1377,79 @@ static int FileRead_CheckFormat( FILEACCESSINFO *FileInfo ) } else { + char *Buffer = NULL ; + DWORD BufferSize ; + LONGLONG FileSize ; + int CharCodeFormat[][ 2 ] = + { + { DX_CHARCODEFORMAT_UTF32LE, 0 }, + { DX_CHARCODEFORMAT_UTF32BE, 0 }, + { DX_CHARCODEFORMAT_UTF16LE, 0 }, + { DX_CHARCODEFORMAT_UTF16BE, 0 }, + { DX_CHARCODEFORMAT_SHIFTJIS, 0 }, + { DX_CHARCODEFORMAT_UTF8, 0 }, + { DX_CHARCODEFORMAT_GB2312, 0 }, + { DX_CHARCODEFORMAT_UHC, 0 }, + { DX_CHARCODEFORMAT_BIG5, 0 }, + { -1, 0 }, + } ; + int IsAllSuccess = FALSE ; + int i ; + + // 自動判定のためファイルを読み込む( 最大1MB ) + FileInfo->StreamData.ReadShred.Seek( FileInfo->StreamData.DataPoint, 0, SEEK_END ) ; + STREAM_FSYNC( &FileInfo->StreamData ) + FileSize = FileInfo->StreamData.ReadShred.Tell( FileInfo->StreamData.DataPoint ) ; FileInfo->StreamData.ReadShred.Seek( FileInfo->StreamData.DataPoint, 0, SEEK_SET ) ; + STREAM_FSYNC( &FileInfo->StreamData ) + + BufferSize = ( DWORD )( FileSize > 1024 * 1024 ? 1024 * 1024 : FileSize ) ; + + Buffer = ( char * )DXALLOC( BufferSize + 4 ) ; + if( Buffer != NULL ) + { + _MEMSET( Buffer, 0, BufferSize + 4 ) ; + + FileInfo->StreamData.ReadShred.Read( Buffer, BufferSize, 1, FileInfo->StreamData.DataPoint ) ; + STREAM_FSYNC( &FileInfo->StreamData ) + FileInfo->StreamData.ReadShred.Seek( FileInfo->StreamData.DataPoint, 0, SEEK_SET ) ; + + // 各文字コードで一致している文字の数を取得 + for( i = 0 ; CharCodeFormat[ i ][ 0 ] >= 0 ; i ++ ) + { + CharCodeFormat[ i ][ 1 ] = CheckCharCodeFormat( Buffer, CharCodeFormat[ i ][ 0 ], &IsAllSuccess ) ; + + // 完全一致していたらループを抜ける + if( IsAllSuccess ) + { + break ; + } + } + + // 完全一致した文字コードがあったら、完全一致した文字コードをファイルのフォーマットとする + if( IsAllSuccess ) + { + FileInfo->CharCodeFormat = CharCodeFormat[ i ][ 0 ] ; + } + else + { + int MaxSuccessIndex = 0 ; + + // 完全一致した文字コードが無い場合は一番一致した文字数が多い文字コードをファイルのフォーマットとする + for( i = 1 ; CharCodeFormat[ i ][ 0 ] >= 0 ; i ++ ) + { + if( CharCodeFormat[ MaxSuccessIndex ][ 1 ] < CharCodeFormat[ i ][ 1 ] ) + { + MaxSuccessIndex = i ; + } + } + + FileInfo->CharCodeFormat = CharCodeFormat[ MaxSuccessIndex ][ 0 ] ; + } + + DXFREE( Buffer ) ; + Buffer = NULL ; + } } } @@ -5313,6 +5385,362 @@ static int StreamTCHAR_FindClose( DWORD_PTR FindHandle ) // return 0 ; //} +// フルパスではないパス文字列をフルパスに変換する +// ( CurrentDir はフルパスである必要がある(語尾に『\』があっても無くても良い) ) +// ( CurrentDir が NULL の場合は現在のカレントディレクトリを使用する ) +extern int ConvertFullPathA_( const char *Src, char *Dest, size_t BufferBytes, const char *CurrentDir ) +{ + int i, j, k ; + char iden[ FILEPATH_MAX ] ; + char cur[ FILEPATH_MAX ] ; + int CharNum ; + char *LastCharAddress ; + DWORD LastCharCode ; + int LastCharBytes ; + int FirstCheckEnd = FALSE ; +// size_t DestSize ; + int RootFolder = FALSE ; + +// DestSize = 0 ; + + if( CurrentDir == NULL ) + { + wchar_t curW[ FILEPATH_MAX ] ; + DX_FGETDIR( curW, sizeof( curW ) ) ; + ConvString( ( char * )curW, -1, WCHAR_T_CHARCODEFORMAT, cur, sizeof( cur ), CHAR_CHARCODEFORMAT ) ; + CurrentDir = cur ; + } + + if( Src == NULL ) + { + _STRCPY_S( Dest, BufferBytes, CurrentDir ) ; + goto END ; + } + + i = 0 ; + j = 0 ; + k = 0 ; + + // 最初に『\』又は『/』が2回連続で続いている場合はネットワークを介していると判断 + if( ( Src[0] == '\\' && Src[1] == '\\' ) || + ( Src[0] == '/' && Src[1] == '/' ) ) + { + Dest[0] = '\\'; + Dest[1] = '\0'; + + i += 2; + j ++ ; + + FirstCheckEnd = TRUE ; + } + + // ドライブ名が書かれていたらそのドライブへ + if( FirstCheckEnd == FALSE ) + { + int l ; + int m, n = 0 ; + + // 追加のドライブ名か調べる + for( m = 0 ; m < g_AddDriveNameNum ; m ++ ) + { + for( n = 0 ; ; n ++ ) + { + if( Src[ n ] == '\0' || g_AddDriveName[ m ][ n ] == '\0' ) + { + break ; + } + + char SrcC ; + char CheckC ; + + if( Src[ n ] == '\\' || Src[ n ] == '/' ) + { + SrcC = '\\' ; + } + else + { + SrcC = Src[ n ] ; + } + + if( g_AddDriveName[ m ][ n ] == '\\' || g_AddDriveName[ m ][ n ] == '/' ) + { + CheckC = '\\' ; + } + else + { + CheckC = ( char )g_AddDriveName[ m ][ n ] ; + } + + if( SrcC != CheckC ) + { + break ; + } + } + + if( g_AddDriveName[ m ][ n ] == '\0' ) + { + break ; + } + } + if( g_AddDriveNameNum != 0 && m != g_AddDriveNameNum ) + { + // 落ちない場合は適合した文字列をそのまま残す + _MEMCPY( Dest, Src, sizeof( char ) * n ) ; + Dest[ n ] = '\0' ; + + j = n ; + i = n ; + + FirstCheckEnd = TRUE ; + } + else + { + // 通常のドライブ名のチェック + l = 0 ; + for(;;) + { + if( Src[ l ] == '\0' ) + { + break ; + } + + if( CHECK_SHIFTJIS_2BYTE( Src[ l ] ) ) + { + l += 2 ; + } + else + { + if( Src[ l ] == ':' ) + { + break ; + } + + if( ( Src[ l ] < 'a' || Src[ l ] > 'z' ) && + ( Src[ l ] < 'A' || Src[ l ] > 'Z' ) && + ( Src[ l ] < '0' || Src[ l ] > '9' ) ) + { + break ; + } + + l ++ ; + } + } + if( Src[ l ] == ':' ) + { + _MEMCPY( Dest, Src, sizeof( char ) * ( l + 1 ) ) ; + Dest[ l + 1 ] = '\0' ; + + i = l + 1 ; + j = l + 1 ; + + if( Src[ i ] == '\\' || Src[ i ] == '/' ) + { + i ++ ; + } + + FirstCheckEnd = TRUE ; + } + } + } + + // 最初が『\』又は『/』の場合はカレントドライブのルートディレクトリまで落ちる + if( g_EnableRootDirName == 1 && FirstCheckEnd == FALSE && ( Src[0] == '\\' || Src[0] == '/' ) ) + { +// int m, n ; +// +// // カレントドライブのルートディレクトリに落とさない文字列かどうかを判定 +// for( m = 0 ; m < g_CancelCurrentDirNameNum ; m ++ ) +// { +// for( n = 0 ; ; n ++ ) +// { +// if( Src[ n ] == '\0' || g_CancelCurrentDirName[ m ][ n ] == '\0' ) +// { +// break ; +// } +// +// char SrcC ; +// char CheckC ; +// +// if( Src[ n ] == '\\' || Src[ n ] == '/' ) +// { +// SrcC = '\\' ; +// } +// else +// { +// SrcC = Src[ n ] ; +// } +// +// if( g_CancelCurrentDirName[ m ][ n ] == '\\' || g_CancelCurrentDirName[ m ][ n ] == '/' ) +// { +// CheckC = '\\' ; +// } +// else +// { +// CheckC = ( char )g_CancelCurrentDirName[ m ][ n ] ; +// } +// +// if( SrcC != CheckC ) +// { +// break ; +// } +// } +// +// if( g_CancelCurrentDirName[ m ][ n ] == '\0' ) +// { +// break ; +// } +// } +// +// if( g_CancelCurrentDirNameNum != 0 && m != g_CancelCurrentDirNameNum ) +// { +// // 落ちない場合は適合した文字列をそのまま残す +// _MEMCPY( Dest, Src, sizeof( char ) * n ) ; +// Dest[ n ] = '\0' ; +// +// j = n ; +// i = j ; +// +// FirstCheckEnd = TRUE ; +// } +// else + { + Dest[0] = CurrentDir[0] ; + Dest[1] = CurrentDir[1] ; + Dest[2] = '\0' ; + + i ++ ; + j = 2 ; + + FirstCheckEnd = TRUE ; + } + + RootFolder = TRUE ; + } + + // それ以外の場合はカレントディレクトリ + if( FirstCheckEnd == FALSE ) + { + _STRCPY_S( Dest, BufferBytes, CurrentDir ) ; + j = ( int )_STRLEN( Dest ) ; + + CharNum = GetStringCharNum( ( const char * )CurrentDir, WCHAR_T_CHARCODEFORMAT ) ; + if( CharNum != 0 ) + { + LastCharAddress = ( char * )GetStringCharAddress( ( const char * )CurrentDir, WCHAR_T_CHARCODEFORMAT, CharNum - 1 ) ; + LastCharCode = GetCharCode( ( const char * )LastCharAddress, WCHAR_T_CHARCODEFORMAT, &LastCharBytes ) ; + if( LastCharCode == '\\' || LastCharCode == '/' ) + { + *LastCharAddress = '\0' ; + j -- ; + } + } + + FirstCheckEnd = TRUE ; + } + + for(;;) + { + switch( Src[i] ) + { + case '\0' : + if( k != 0 ) + { + if( j != 0 ) + { + Dest[j] = '\\' ; + j ++ ; + } + _STRCPY_S( &Dest[j], BufferBytes - j * sizeof( char ), iden ) ; + j = ( int )_STRLEN( Dest ) ; + k = 0 ; + } + goto END ; + + case '\\' : + case '/' : + // 文字列が無かったらスキップ + if( k == 0 ) + { + i ++ ; + break ; + } + + if( _STRCMP( iden, "." ) == 0 ) + { + // なにもしない + } + else + if( _STRCMP( iden, ".." ) == 0 ) + { + // 一つ浅いディレクトリへ + Dest[ j ] = '\0' ; + CharNum = GetStringCharNum( ( const char * )Dest, WCHAR_T_CHARCODEFORMAT ) ; + LastCharAddress = ( char * )GetStringCharAddress( ( const char * )Dest, WCHAR_T_CHARCODEFORMAT, CharNum - 1 ) ; + LastCharCode = GetCharCode( ( const char * )LastCharAddress, WCHAR_T_CHARCODEFORMAT, &LastCharBytes ) ; + j -= LastCharBytes / sizeof( char ) ; + for(;;) + { + if( Dest[j] == '\\' || Dest[j] == '/' || Dest[j] == ':' ) + { + break ; + } + + Dest[ j ] = '\0' ; + CharNum -- ; + LastCharAddress = ( char * )GetStringCharAddress( ( const char * )Dest, WCHAR_T_CHARCODEFORMAT, CharNum - 1 ) ; + LastCharCode = GetCharCode( ( const char * )LastCharAddress, WCHAR_T_CHARCODEFORMAT, &LastCharBytes ) ; + j -= LastCharBytes / sizeof( char ) ; + } + if( Dest[j] != ':' ) + { + Dest[j] = '\0' ; + } + else + { + j ++ ; + } + } + else + { + if( ( RootFolder == FALSE && ( Src[ 0 ] == '\\' || Src[ 0 ] == '/' ) ) || j != 0 ) + { + Dest[ j ] = '\\' ; + j ++ ; + } + + _STRCPY_S( &Dest[j], BufferBytes - j * sizeof( char ), iden ) ; + j = ( int )_STRLEN( Dest ) ; + } + + k = 0 ; + i ++ ; + break ; + + default : + if( CHECK_SHIFTJIS_2BYTE( Src[i] ) == FALSE ) + { + iden[k] = Src[i] ; + iden[k+1] = 0 ; + k ++ ; + i ++ ; + } + else + { + iden[k] = Src[i] ; + iden[k+1] = Src[i+1] ; + iden[k+2] = '\0' ; + k += 2 ; + i += 2 ; + } + break ; + } + } + +END : + // 正常終了 + return 0 ; +} + // フルパスではないパス文字列をフルパスに変換する // ( CurrentDir はフルパスである必要がある(語尾に『\』があっても無くても良い) ) // ( CurrentDir が NULL の場合は現在のカレントディレクトリを使用する ) diff --git a/DxFile.h b/DxFile.h index da7d109..b5d4638 100644 --- a/DxFile.h +++ b/DxFile.h @@ -2,7 +2,7 @@ // // DXライブラリ ファイルアクセスプログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -237,6 +237,7 @@ extern int MemStreamClose( DWORD_PTR StreamDataPoint ) ; // ( CurrentDir はフルパスである必要がある(語尾に『\』があっても無くても良い) ) // ( CurrentDir が NULL の場合は現在のカレントディレクトリを使用する ) //extern int ConvertFullPath_( const char *Src, char *Dest, const char *CurrentDir = NULL ) ; +extern int ConvertFullPathA_( const char *Src, char *Dest, size_t BufferBytes, const char *CurrentDir = NULL ) ; extern int ConvertFullPathW_( const wchar_t *Src, wchar_t *Dest, size_t BufferBytes, const wchar_t *CurrentDir = NULL ) ; extern int ConvertFullPathT_( const TCHAR *Src, TCHAR *Dest, size_t BufferBytes, const TCHAR *CurrentDir = NULL ) ; diff --git a/DxFont.cpp b/DxFont.cpp index 7e9a78d..ddb641f 100644 --- a/DxFont.cpp +++ b/DxFont.cpp @@ -2,7 +2,7 @@ // // DXライブラリ DirectDraw制御プログラム // -// Ver 3.21d +// Ver 3.21f // // ---------------------------------------------------------------------------- diff --git a/DxFont.h b/DxFont.h index 66928db..719be71 100644 --- a/DxFont.h +++ b/DxFont.h @@ -2,7 +2,7 @@ // // DXライブラリ フォント処理用プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxFunctionAndroid.h b/DxFunctionAndroid.h index 7aec20b..ea5f30b 100644 --- a/DxFunctionAndroid.h +++ b/DxFunctionAndroid.h @@ -2,7 +2,7 @@ // // DXライブラリ Android専用関数プロトタイプ宣言用ヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxFunctionWin.h b/DxFunctionWin.h index 57653c7..5128835 100644 --- a/DxFunctionWin.h +++ b/DxFunctionWin.h @@ -2,7 +2,7 @@ // // DXライブラリ Windows専用関数プロトタイプ宣言用ヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -38,7 +38,8 @@ namespace DxLib extern int GetActiveFlag( void ) ; // GetWindowActiveFlag の別名関数 extern HWND GetMainWindowHandle( void ) ; // メインウインドウのウインドウハンドルを取得する extern int GetWindowModeFlag( void ) ; // ウインドウモードで起動しているかどうかを取得する( 戻り値 TRUE:ウインドウモード FALSE:フルスクリーンモード ) -extern int GetDefaultState( int *SizeX, int *SizeY, int *ColorBitDepth, int *RefreshRate = NULL , int *LeftTopX = NULL , int *LeftTopY = NULL , int *PixelSizeX = NULL , int *PixelSizeY = NULL ) ; // 起動時のデスクトップの画面情報を取得する( SizeX:デスクトップの横解像度を格納する変数のポインタ SizeY:縦解像度を格納する変数のポインタ ColorBitDepth:画面カラービット数を格納する変数のポインタ RefreshRate:デスクトップのリフレッシュレートを格納する変数のポインタ LeftTopX:デスクトップの左上X座標を格納する変数のポインタ LeftTopY:デスクトップの左上Y座標を格納する変数のポインタ PixelSizeX:OSの拡大率設定の影響を受けないデスクトップの横解像度を格納する変数のポインタ PixelSizeY:OSの拡大率設定の影響を受けないデスクトップの縦解像度を格納する変数のポインタ ) +extern int GetDefaultState( int *SizeX, int *SizeY, int *ColorBitDepth, int *RefreshRate = NULL , int *LeftTopX = NULL , int *LeftTopY = NULL , int *PixelSizeX = NULL , int *PixelSizeY = NULL , int *XDpi = NULL , int *YDpi = NULL ) ; // 起動時のデスクトップの画面情報を取得する( SizeX:デスクトップの横解像度を格納する変数のポインタ SizeY:縦解像度を格納する変数のポインタ ColorBitDepth:画面カラービット数を格納する変数のポインタ RefreshRate:デスクトップのリフレッシュレートを格納する変数のポインタ LeftTopX:デスクトップの左上X座標を格納する変数のポインタ LeftTopY:デスクトップの左上Y座標を格納する変数のポインタ PixelSizeX:OSの拡大率設定の影響を受けないデスクトップの横解像度を格納する変数のポインタ PixelSizeY:OSの拡大率設定の影響を受けないデスクトップの縦解像度を格納する変数のポインタ XDpi:X軸のDPI YDpi:Y軸のDPI ) +extern int GetMonitorDpi( int *XDpi, int *YDpi, int MonitorIndex = -1 ) ; // モニターのDPIを取得する extern int GetNoActiveState( int ResetFlag = TRUE ) ; // メインウインドウが非アクティブになり、処理が一時停止していたかどうかを取得する(引数 ResetFlag=TRUE:状態をリセット FALSE:状態をリセットしない 戻り値: 0=一時停止はしていない 1=一時停止していた ) extern int GetMouseDispFlag( void ) ; // マウスポインタを表示するかどうかの設定を取得する( 戻り値 TRUE:表示する FALSE:表示しない ) extern int GetAlwaysRunFlag( void ) ; // メインウインドウが非アクティブになっても処理を実行し続けるかどうかの設定を取得する( TRUE:実行する FALSE:停止する ) @@ -114,6 +115,7 @@ namespace DxLib extern int SetUseUpdateLayerdWindowFlag( int Flag ) ; // UpdateLayerdWindowForBaseImage や UpdateLayerdWindowForSoftImage を使用するかどうかを設定する( TRUE:使用する FALSE:使用しない ) extern int SetResourceModule( HMODULE ResourceModule ) ; // リソースを読み込む際に使用するモジュールを設定する( NULL を指定すると初期状態に戻ります、デフォルトでは NULL ) extern int SetUseDxLibWM_PAINTProcess( int Flag ) ; // WM_PAINT メッセージが来た際に『DXライブラリの WM_PAINTメッセージが来た際の処理』を行うかどうかを設定する( 別スレッドで描画処理を行う場合などで使用 ) +extern int SetWindows10_WM_CHAR_CancelTime( int MilliSecond ) ; // Windows10 で WM_CHAR で短時間に連続して同じ文字が入力された場合の無効扱いにする時間を設定する( MilliSecond のミリ秒以内に連続して同じ文字が入力された場合に無効にする、MilliSecond の値をマイナスにするとデフォルトの設定に戻る ) // ドラッグ&ドロップされたファイル関係 extern int SetDragFileValidFlag( int Flag ) ; // ファイルのメインウインドウへのドラッグ&ドロップ機能を有効にするかどうかのフラグをセットする @@ -257,7 +259,8 @@ namespace DxLib extern int SetKeyExclusiveCooperativeLevelFlag( int Flag ) ; // DirectInput のキーボードの協調レベルを排他レベルにするかどうかを設定する( TRUE:排他レベルにする FALSE:標準レベルにする( デフォルト ) )、DxLib_Init の呼び出し前でのみ実行可能  extern int SetKeyboardNotDirectInputFlag( int Flag ) ; // キーボードの入力処理に DirectInput を使わないかどうかを設定する( TRUE:DirectInput を使わず、Windows標準機能を使用する  FALSE:DirectInput を使用する ) -extern int SetUseDirectInputFlag( int Flag ) ; // 入力処理に DirectInput を使用するかどうかを設定する( TRUE:DirectInput を使用する  FALSE:DirectInput を使わず、Windows標準機能を使用する ) +extern int SetUseDirectInputFlag( int UseFlag ) ; // 入力処理に DirectInput を使用するかどうかを設定する( TRUE:DirectInput を使用する  FALSE:DirectInput を使わず、Windows標準機能を使用する ) +extern int SetDirectInputMouseMode( int Mode ) ; // マウスの入力処理に DirectInput を使用する場合の動作モードを設定する( 0:ウィンドウがアクティブな場合のみ DirectInput を使用する 1:ウィンドウのアクティブ状態に関係なく DirectInput を使用する ) extern int SetUseXInputFlag( int Flag ) ; // Xbox360コントローラの入力処理に XInput を使用するかどうかを設定する( TRUE:XInput を使用する( デフォルト )  FALSE:XInput を使用しない ) extern int SetUseXboxControllerDirectInputFlag( int Flag ) ; // Xbox360コントローラや Xbox Oneコントローラを DirectInputコントローラとしても検出するかどうかを設定する( TRUE:DirectInputコントローラとしても検出する FALSE:DirectInputコントローラとしては検出しない(デフォルト) )、DxLib_Init の呼び出し前でのみ実行可能 extern int GetJoypadGUID( int PadIndex, GUID *GuidInstanceBuffer, GUID *GuidProductBuffer = NULL ) ; // ジョイパッドのGUIDを得る diff --git a/DxFunctioniOS.h b/DxFunctioniOS.h index eb3cc67..3d3db1e 100644 --- a/DxFunctioniOS.h +++ b/DxFunctioniOS.h @@ -2,7 +2,7 @@ // // シ、シク繝ゥ繧、繝悶Λ繝ェ iOS蟆ら畑髢「謨ー繝励Ο繝医ち繧、繝怜ョ」險逕ィ繝倥ャ繝繝輔ぃ繧、繝ォ // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxGateway.cpp b/DxGateway.cpp index c11305c..5dc1581 100644 --- a/DxGateway.cpp +++ b/DxGateway.cpp @@ -2,7 +2,7 @@ // // DXライブラリ 内部との出入り口プログラムファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -1270,11 +1270,19 @@ extern int GetWindowModeFlag( void ) DXFUNC_END return Result ; } -extern int GetDefaultState( int *SizeX, int *SizeY, int *ColorBitDepth, int *RefreshRate , int *LeftTopX, int *LeftTopY, int *PixelSizeX, int *PixelSizeY ) +extern int GetDefaultState( int *SizeX, int *SizeY, int *ColorBitDepth, int *RefreshRate , int *LeftTopX, int *LeftTopY, int *PixelSizeX, int *PixelSizeY, int *XDpi, int *YDpi ) { int Result ; DXFUNC_BEGIN - Result = NS_GetDefaultState( SizeX, SizeY, ColorBitDepth, RefreshRate , LeftTopX , LeftTopY, PixelSizeX, PixelSizeY ) ; + Result = NS_GetDefaultState( SizeX, SizeY, ColorBitDepth, RefreshRate , LeftTopX , LeftTopY, PixelSizeX, PixelSizeY, XDpi, YDpi ) ; + DXFUNC_END + return Result ; +} +extern int GetMonitorDpi( int *XDpi, int *YDpi, int MonitorIndex ) +{ + int Result ; + DXFUNC_BEGIN + Result = NS_GetMonitorDpi( XDpi, YDpi, MonitorIndex ) ; DXFUNC_END return Result ; } @@ -2032,6 +2040,15 @@ extern int SetUseDxLibWM_PAINTProcess( int Flag ) DXFUNC_END return Result ; } +extern int SetWindows10_WM_CHAR_CancelTime( int MilliSecond ) +{ + int Result ; + DXFUNC_BEGIN + Result = NS_SetWindows10_WM_CHAR_CancelTime( MilliSecond ) ; + DXFUNC_END + return Result ; +} + #ifndef DX_NON_ASYNCLOAD extern int SetUseASyncLoadFlag( int Flag ) { @@ -4409,6 +4426,15 @@ extern int SetUseDirectInputFlag( int Flag ) return Result ; } +extern int SetDirectInputMouseMode( int Mode ) +{ + int Result ; + DXFUNC_BEGIN + Result = NS_SetDirectInputMouseMode( Mode ) ; + DXFUNC_END + return Result ; +} + extern int SetUseXInputFlag( int Flag ) { int Result ; @@ -5760,6 +5786,14 @@ extern int DrawCircleGauge( int CenterX, int CenterY, double Percent, int GrHand DXFUNC_END return Result ; } +extern int DrawCircleGaugeF( float CenterX, float CenterY, double Percent, int GrHandle, double StartPercent, double Scale, int ReverseX, int ReverseY ) +{ + int Result ; + DXFUNC_BEGIN + Result = NS_DrawCircleGaugeF( CenterX, CenterY, Percent, GrHandle, StartPercent, Scale, ReverseX, ReverseY ) ; + DXFUNC_END + return Result ; +} extern int DrawGraphToZBuffer( int X, int Y, int GrHandle, int WriteZMode ) { int Result ; @@ -6352,6 +6386,14 @@ extern int DrawCube3DD( VECTOR_D Pos1, VECTOR_D Pos2, unsigned int DifColor, uns DXFUNC_END return Result ; } +extern int DrawCubeSet3D( CUBEDATA *CubeDataArray, int Num, int FillFlag ) +{ + int Result ; + DXFUNC_BEGIN + Result = NS_DrawCubeSet3D( CubeDataArray, Num, FillFlag ) ; + DXFUNC_END + return Result ; +} extern int DrawSphere3D( VECTOR CenterPos, float r, int DivNum, unsigned int DifColor, unsigned int SpcColor, int FillFlag ) { int Result ; @@ -8501,6 +8543,14 @@ extern int SetMaxAnisotropy( int MaxAnisotropy ) DXFUNC_END return Result ; } +extern int GetMaxAnisotropy( void ) +{ + int Result ; + DXFUNC_BEGIN + Result = NS_GetMaxAnisotropy() ; + DXFUNC_END + return Result ; +} extern int SetUseLarge3DPositionSupport( int UseFlag ) { int Result ; @@ -15928,7 +15978,6 @@ extern LONGLONG GetSoundTotalTime( int SoundHandle ) DXFUNC_END return Result ; } - extern int SetLoopPosSoundMem( LONGLONG LoopTime, int SoundHandle ) { int Result ; @@ -16336,6 +16385,22 @@ extern int SetUseOldVolumeCalcFlag( int Flag ) DXFUNC_END return Result ; } +extern int SetSoundCurrentTimeType( int Type /* DX_SOUNDCURRENTTIME_TYPE_LOW_LEVEL など */ ) +{ + int Result ; + DXFUNC_BEGIN + Result = NS_SetSoundCurrentTimeType( Type ) ; + DXFUNC_END + return Result ; +} +extern int GetSoundCurrentTimeType( void ) +{ + int Result ; + DXFUNC_BEGIN + Result = NS_GetSoundCurrentTimeType() ; + DXFUNC_END + return Result ; +} extern int SetCreate3DSoundFlag( int Flag ) { int Result ; diff --git a/DxGraphics.cpp b/DxGraphics.cpp index af256d9..ad91905 100644 --- a/DxGraphics.cpp +++ b/DxGraphics.cpp @@ -2,7 +2,7 @@ // // DXライブラリ 描画プログラム // -// Ver 3.21d +// Ver 3.21f // // ---------------------------------------------------------------------------- @@ -360,6 +360,7 @@ GRAPHICSSYSTEMDATA GraphicsSysData ; // 画面関係関数 static int Graphics_Screen_CheckDisplaySetting( int ScreenSizeX, int ScreenSizeY, int ColorBitDepth ) ; // 指定の解像度が対応しているかどうかを調べる関数 +static void Graphics_Screen_UpdateFlipTime( void ) ; // ScreenFlipTimeの更新 @@ -10742,6 +10743,432 @@ extern int NS_DrawCube3DD( VECTOR_D Pos1, VECTOR_D Pos2, unsigned int DifColor, return 0 ; } +// 3Dの立方体の集合を描画する +extern int NS_DrawCubeSet3D( CUBEDATA *CubeDataArray, int Num, int FillFlag ) +{ + int i, j, k ; + VERTEX3D *Vertex ; + WORD *Index ; + + if( GSYS.Light.ProcessDisable == FALSE && FillFlag == TRUE ) + { + // 指定の数の頂点を収められるバッファが確保されていなかったら確保 + if( GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 1 ] < Num && + GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 1 ] < 2730 ) + { + GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 1 ] = Num * 3 / 2 ; + if( GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 1 ] > 2730 ) + { + GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 1 ] = 2730 ; + } + + if( GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 1 ] == NULL ) + { + GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 1 ] = ( VERTEX3D * )DXALLOC( GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 1 ] * sizeof( VERTEX3D ) * 24 ) ; + } + else + { + GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 1 ] = ( VERTEX3D * )DXREALLOC( GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 1 ], GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 1 ] * sizeof( VERTEX3D ) * 24 ) ; + } + + // 頂点データの固定値をセット + Vertex = GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 1 ] ; + for( i = 0 ; i < GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 1 ] ; i ++ ) + { + Vertex[ 0 ].norm.x = 0.0f ; + Vertex[ 0 ].norm.y = 0.0f ; + Vertex[ 0 ].norm.z = -1.0f ; + Vertex[ 1 ].norm = Vertex[ 0 ].norm ; + Vertex[ 2 ].norm = Vertex[ 0 ].norm ; + Vertex[ 3 ].norm = Vertex[ 0 ].norm ; + Vertex[ 0 ].u = 0.0f ; Vertex[ 0 ].v = 0.0f ; Vertex[ 0 ].su = 0.0f ; Vertex[ 0 ].sv = 0.0f ; + Vertex[ 1 ].u = 0.0f ; Vertex[ 1 ].v = 0.0f ; Vertex[ 1 ].su = 0.0f ; Vertex[ 1 ].sv = 0.0f ; + Vertex[ 2 ].u = 0.0f ; Vertex[ 2 ].v = 0.0f ; Vertex[ 2 ].su = 0.0f ; Vertex[ 2 ].sv = 0.0f ; + Vertex[ 3 ].u = 0.0f ; Vertex[ 3 ].v = 0.0f ; Vertex[ 3 ].su = 0.0f ; Vertex[ 3 ].sv = 0.0f ; + + Vertex[ 4 + 0 ].norm.x = 0.0f ; + Vertex[ 4 + 0 ].norm.y = 0.0f ; + Vertex[ 4 + 0 ].norm.z = 1.0f ; + Vertex[ 4 + 1 ].norm = Vertex[ 4 ].norm ; + Vertex[ 4 + 2 ].norm = Vertex[ 4 ].norm ; + Vertex[ 4 + 3 ].norm = Vertex[ 4 ].norm ; + Vertex[ 4 + 0 ].u = 0.0f ; Vertex[ 4 + 0 ].v = 0.0f ; Vertex[ 4 + 0 ].su = 0.0f ; Vertex[ 4 + 0 ].sv = 0.0f ; + Vertex[ 4 + 1 ].u = 0.0f ; Vertex[ 4 + 1 ].v = 0.0f ; Vertex[ 4 + 1 ].su = 0.0f ; Vertex[ 4 + 1 ].sv = 0.0f ; + Vertex[ 4 + 2 ].u = 0.0f ; Vertex[ 4 + 2 ].v = 0.0f ; Vertex[ 4 + 2 ].su = 0.0f ; Vertex[ 4 + 2 ].sv = 0.0f ; + Vertex[ 4 + 3 ].u = 0.0f ; Vertex[ 4 + 3 ].v = 0.0f ; Vertex[ 4 + 3 ].su = 0.0f ; Vertex[ 4 + 3 ].sv = 0.0f ; + + Vertex[ 8 + 0 ].norm.x = -1.0f ; + Vertex[ 8 + 0 ].norm.y = 0.0f ; + Vertex[ 8 + 0 ].norm.z = 0.0f ; + Vertex[ 8 + 1 ].norm = Vertex[ 8 ].norm ; + Vertex[ 8 + 2 ].norm = Vertex[ 8 ].norm ; + Vertex[ 8 + 3 ].norm = Vertex[ 8 ].norm ; + Vertex[ 8 + 0 ].u = 0.0f ; Vertex[ 8 + 0 ].v = 0.0f ; Vertex[ 8 + 0 ].su = 0.0f ; Vertex[ 8 + 0 ].sv = 0.0f ; + Vertex[ 8 + 1 ].u = 0.0f ; Vertex[ 8 + 1 ].v = 0.0f ; Vertex[ 8 + 1 ].su = 0.0f ; Vertex[ 8 + 1 ].sv = 0.0f ; + Vertex[ 8 + 2 ].u = 0.0f ; Vertex[ 8 + 2 ].v = 0.0f ; Vertex[ 8 + 2 ].su = 0.0f ; Vertex[ 8 + 2 ].sv = 0.0f ; + Vertex[ 8 + 3 ].u = 0.0f ; Vertex[ 8 + 3 ].v = 0.0f ; Vertex[ 8 + 3 ].su = 0.0f ; Vertex[ 8 + 3 ].sv = 0.0f ; + + Vertex[ 12 + 0 ].norm.x = 1.0f ; + Vertex[ 12 + 0 ].norm.y = 0.0f ; + Vertex[ 12 + 0 ].norm.z = 0.0f ; + Vertex[ 12 + 1 ].norm = Vertex[ 12 ].norm ; + Vertex[ 12 + 2 ].norm = Vertex[ 12 ].norm ; + Vertex[ 12 + 3 ].norm = Vertex[ 12 ].norm ; + Vertex[ 12 + 0 ].u = 0.0f ; Vertex[ 12 + 0 ].v = 0.0f ; Vertex[ 12 + 0 ].su = 0.0f ;Vertex[ 12 + 0 ].sv = 0.0f ; + Vertex[ 12 + 1 ].u = 0.0f ; Vertex[ 12 + 1 ].v = 0.0f ; Vertex[ 12 + 1 ].su = 0.0f ;Vertex[ 12 + 1 ].sv = 0.0f ; + Vertex[ 12 + 2 ].u = 0.0f ; Vertex[ 12 + 2 ].v = 0.0f ; Vertex[ 12 + 2 ].su = 0.0f ;Vertex[ 12 + 2 ].sv = 0.0f ; + Vertex[ 12 + 3 ].u = 0.0f ; Vertex[ 12 + 3 ].v = 0.0f ; Vertex[ 12 + 3 ].su = 0.0f ;Vertex[ 12 + 3 ].sv = 0.0f ; + + Vertex[ 16 + 0 ].norm.x = 0.0f ; + Vertex[ 16 + 0 ].norm.y = 1.0f ; + Vertex[ 16 + 0 ].norm.z = 0.0f ; + Vertex[ 16 + 1 ].norm = Vertex[ 16 ].norm ; + Vertex[ 16 + 2 ].norm = Vertex[ 16 ].norm ; + Vertex[ 16 + 3 ].norm = Vertex[ 16 ].norm ; + Vertex[ 16 + 0 ].u = 0.0f ; Vertex[ 16 + 0 ].v = 0.0f ; Vertex[ 16 + 0 ].su = 0.0f ;Vertex[ 16 + 0 ].sv = 0.0f ; + Vertex[ 16 + 1 ].u = 0.0f ; Vertex[ 16 + 1 ].v = 0.0f ; Vertex[ 16 + 1 ].su = 0.0f ;Vertex[ 16 + 1 ].sv = 0.0f ; + Vertex[ 16 + 2 ].u = 0.0f ; Vertex[ 16 + 2 ].v = 0.0f ; Vertex[ 16 + 2 ].su = 0.0f ;Vertex[ 16 + 2 ].sv = 0.0f ; + Vertex[ 16 + 3 ].u = 0.0f ; Vertex[ 16 + 3 ].v = 0.0f ; Vertex[ 16 + 3 ].su = 0.0f ;Vertex[ 16 + 3 ].sv = 0.0f ; + + Vertex[ 20 + 0 ].norm.x = 0.0f ; + Vertex[ 20 + 0 ].norm.y = -1.0f ; + Vertex[ 20 + 0 ].norm.z = 0.0f ; + Vertex[ 20 + 1 ].norm = Vertex[ 20 ].norm ; + Vertex[ 20 + 2 ].norm = Vertex[ 20 ].norm ; + Vertex[ 20 + 3 ].norm = Vertex[ 20 ].norm ; + Vertex[ 20 + 0 ].u = 0.0f ; Vertex[ 20 + 0 ].v = 0.0f ; Vertex[ 20 + 0 ].su = 0.0f ;Vertex[ 20 + 0 ].sv = 0.0f ; + Vertex[ 20 + 1 ].u = 0.0f ; Vertex[ 20 + 1 ].v = 0.0f ; Vertex[ 20 + 1 ].su = 0.0f ;Vertex[ 20 + 1 ].sv = 0.0f ; + Vertex[ 20 + 2 ].u = 0.0f ; Vertex[ 20 + 2 ].v = 0.0f ; Vertex[ 20 + 2 ].su = 0.0f ;Vertex[ 20 + 2 ].sv = 0.0f ; + Vertex[ 20 + 3 ].u = 0.0f ; Vertex[ 20 + 3 ].v = 0.0f ; Vertex[ 20 + 3 ].su = 0.0f ;Vertex[ 20 + 3 ].sv = 0.0f ; + + Vertex += 24 ; + } + } + + // 指定の数のインデックスを収められるバッファが確保されていなかったら確保 + if( GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] < Num && + GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] < 2730 ) + { + GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] = Num * 3 / 2 ; + if( GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] > 2730 ) + { + GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] = 2730 ; + } + + if( GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 2 ] == NULL ) + { + GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 2 ] = ( WORD * )DXALLOC( GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] * sizeof( WORD ) * 36 ) ; + } + else + { + GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 2 ] = ( WORD * )DXREALLOC( GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 2 ], GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] * sizeof( WORD ) * 36 ) ; + } + + // インデックスの固定値をセット + Index = GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 2 ] ; + j = 0 ; + for( i = 0 ; i < GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] ; i ++ ) + { + Index[ 0 ] = ( WORD )( j + 0 ) ; Index[ 1 ] = ( WORD )( j + 1 ) ; Index[ 2 ] = ( WORD )( j + 2 ) ; + Index[ 3 ] = ( WORD )( j + 3 ) ; Index[ 4 ] = ( WORD )( j + 2 ) ; Index[ 5 ] = ( WORD )( j + 1 ) ; + Index[ 6 ] = ( WORD )( j + 4 ) ; Index[ 7 ] = ( WORD )( j + 5 ) ; Index[ 8 ] = ( WORD )( j + 6 ) ; + Index[ 9 ] = ( WORD )( j + 7 ) ; Index[ 10 ] = ( WORD )( j + 6 ) ; Index[ 11 ] = ( WORD )( j + 5 ) ; + Index[ 12 ] = ( WORD )( j + 8 ) ; Index[ 13 ] = ( WORD )( j + 9 ) ; Index[ 14 ] = ( WORD )( j + 10 ) ; + Index[ 15 ] = ( WORD )( j + 11 ) ; Index[ 16 ] = ( WORD )( j + 10 ) ; Index[ 17 ] = ( WORD )( j + 9 ) ; + Index[ 18 ] = ( WORD )( j + 12 ) ; Index[ 19 ] = ( WORD )( j + 13 ) ; Index[ 20 ] = ( WORD )( j + 14 ) ; + Index[ 21 ] = ( WORD )( j + 15 ) ; Index[ 22 ] = ( WORD )( j + 14 ) ; Index[ 23 ] = ( WORD )( j + 13 ) ; + Index[ 24 ] = ( WORD )( j + 16 ) ; Index[ 25 ] = ( WORD )( j + 17 ) ; Index[ 26 ] = ( WORD )( j + 18 ) ; + Index[ 27 ] = ( WORD )( j + 19 ) ; Index[ 28 ] = ( WORD )( j + 18 ) ; Index[ 29 ] = ( WORD )( j + 17 ) ; + Index[ 30 ] = ( WORD )( j + 20 ) ; Index[ 31 ] = ( WORD )( j + 21 ) ; Index[ 32 ] = ( WORD )( j + 22 ) ; + Index[ 33 ] = ( WORD )( j + 23 ) ; Index[ 34 ] = ( WORD )( j + 22 ) ; Index[ 35 ] = ( WORD )( j + 21 ) ; + + Index += 36 ; + j += 24 ; + } + } + + // 立方体の数だけ繰り返し + Vertex = GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 1 ] ; + j = 0 ; + for( k = 0 ; k < Num ; k ++, CubeDataArray ++ ) + { + // 頂点データの作成 + Vertex[ 0 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 0 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 0 ].pos.z = CubeDataArray->Pos1.z ; + Vertex[ 1 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 1 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 1 ].pos.z = CubeDataArray->Pos1.z ; + Vertex[ 2 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 2 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 2 ].pos.z = CubeDataArray->Pos1.z ; + Vertex[ 3 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 3 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 3 ].pos.z = CubeDataArray->Pos1.z ; + + Vertex[ 4 + 0 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 4 + 0 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 4 + 0 ].pos.z = CubeDataArray->Pos2.z ; + Vertex[ 4 + 1 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 4 + 1 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 4 + 1 ].pos.z = CubeDataArray->Pos2.z ; + Vertex[ 4 + 2 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 4 + 2 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 4 + 2 ].pos.z = CubeDataArray->Pos2.z ; + Vertex[ 4 + 3 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 4 + 3 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 4 + 3 ].pos.z = CubeDataArray->Pos2.z ; + + Vertex[ 8 + 0 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 8 + 0 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 8 + 0 ].pos.z = CubeDataArray->Pos2.z ; + Vertex[ 8 + 1 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 8 + 1 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 8 + 1 ].pos.z = CubeDataArray->Pos1.z ; + Vertex[ 8 + 2 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 8 + 2 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 8 + 2 ].pos.z = CubeDataArray->Pos2.z ; + Vertex[ 8 + 3 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 8 + 3 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 8 + 3 ].pos.z = CubeDataArray->Pos1.z ; + + Vertex[ 12 + 0 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 12 + 0 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 12 + 0 ].pos.z = CubeDataArray->Pos1.z ; + Vertex[ 12 + 1 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 12 + 1 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 12 + 1 ].pos.z = CubeDataArray->Pos2.z ; + Vertex[ 12 + 2 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 12 + 2 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 12 + 2 ].pos.z = CubeDataArray->Pos1.z ; + Vertex[ 12 + 3 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 12 + 3 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 12 + 3 ].pos.z = CubeDataArray->Pos2.z ; + + Vertex[ 16 + 0 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 16 + 0 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 16 + 0 ].pos.z = CubeDataArray->Pos2.z ; + Vertex[ 16 + 1 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 16 + 1 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 16 + 1 ].pos.z = CubeDataArray->Pos2.z ; + Vertex[ 16 + 2 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 16 + 2 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 16 + 2 ].pos.z = CubeDataArray->Pos1.z ; + Vertex[ 16 + 3 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 16 + 3 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 16 + 3 ].pos.z = CubeDataArray->Pos1.z ; + + Vertex[ 20 + 0 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 20 + 0 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 20 + 0 ].pos.z = CubeDataArray->Pos1.z ; + Vertex[ 20 + 1 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 20 + 1 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 20 + 1 ].pos.z = CubeDataArray->Pos1.z ; + Vertex[ 20 + 2 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 20 + 2 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 20 + 2 ].pos.z = CubeDataArray->Pos2.z ; + Vertex[ 20 + 3 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 20 + 3 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 20 + 3 ].pos.z = CubeDataArray->Pos2.z ; + + for( i = 0 ; i < 24 ; i ++ ) + { + Vertex[ i ].dif = CubeDataArray->DifColor ; + Vertex[ i ].spc = CubeDataArray->SpcColor ; + } + + // 頂点データが一杯になったら描画 + j ++ ; + if( j >= 2730 ) + { + NS_DrawPrimitiveIndexed3D( + GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 1 ], 24 * j, + GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 2 ], 36 * j, + DX_PRIMTYPE_TRIANGLELIST, DX_NONE_GRAPH, TRUE ) ; + + Vertex = GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 1 ] ; + j = 0 ; + } + else + { + Vertex += 24 ; + } + } + + // 頂点データが残っていたら描画 + if( j > 0 ) + { + NS_DrawPrimitiveIndexed3D( + GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 1 ], 24 * j, + GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 2 ], 36 * j, + DX_PRIMTYPE_TRIANGLELIST, DX_NONE_GRAPH, TRUE ) ; + } + } + else + { + // 指定の数の頂点を収められるバッファが確保されていなかったら確保 + if( GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 0 ] < Num && + GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 0 ] < 8191 ) + { + GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 0 ] = Num * 3 / 2 ; + if( GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 0 ] > 8191 ) + { + GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 0 ] = 8191 ; + } + + if( GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 0 ] == NULL ) + { + GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 0 ] = ( VERTEX3D * )DXALLOC( GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 0 ] * sizeof( VERTEX3D ) * 8 ) ; + } + else + { + GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 0 ] = ( VERTEX3D * )DXREALLOC( GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 0 ], GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 0 ] * sizeof( VERTEX3D ) * 8 ) ; + } + + // 頂点データの固定値をセット + Vertex = GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 0 ] ; + for( i = 0 ; i < GSYS.Resource.DrawCubeSet3DWorkVertexBufferSize[ 0 ] ; i ++ ) + { + Vertex[ 0 ].norm.x = 0.0f ; + Vertex[ 0 ].norm.y = 0.0f ; + Vertex[ 0 ].norm.z = 0.0f ; + Vertex[ 1 ].norm = Vertex[ 0 ].norm ; + Vertex[ 2 ].norm = Vertex[ 0 ].norm ; + Vertex[ 3 ].norm = Vertex[ 0 ].norm ; + Vertex[ 4 ].norm = Vertex[ 0 ].norm ; + Vertex[ 5 ].norm = Vertex[ 0 ].norm ; + Vertex[ 6 ].norm = Vertex[ 0 ].norm ; + Vertex[ 7 ].norm = Vertex[ 0 ].norm ; + Vertex[ 0 ].u = 0.0f ; Vertex[ 0 ].v = 0.0f ; Vertex[ 0 ].su = 0.0f ; Vertex[ 0 ].sv = 0.0f ; + Vertex[ 1 ].u = 0.0f ; Vertex[ 1 ].v = 0.0f ; Vertex[ 1 ].su = 0.0f ; Vertex[ 1 ].sv = 0.0f ; + Vertex[ 2 ].u = 0.0f ; Vertex[ 2 ].v = 0.0f ; Vertex[ 2 ].su = 0.0f ; Vertex[ 2 ].sv = 0.0f ; + Vertex[ 3 ].u = 0.0f ; Vertex[ 3 ].v = 0.0f ; Vertex[ 3 ].su = 0.0f ; Vertex[ 3 ].sv = 0.0f ; + Vertex[ 4 ].u = 0.0f ; Vertex[ 4 ].v = 0.0f ; Vertex[ 4 ].su = 0.0f ; Vertex[ 4 ].sv = 0.0f ; + Vertex[ 5 ].u = 0.0f ; Vertex[ 5 ].v = 0.0f ; Vertex[ 5 ].su = 0.0f ; Vertex[ 5 ].sv = 0.0f ; + Vertex[ 6 ].u = 0.0f ; Vertex[ 6 ].v = 0.0f ; Vertex[ 6 ].su = 0.0f ; Vertex[ 6 ].sv = 0.0f ; + Vertex[ 7 ].u = 0.0f ; Vertex[ 7 ].v = 0.0f ; Vertex[ 7 ].su = 0.0f ; Vertex[ 7 ].sv = 0.0f ; + + Vertex += 8 ; + } + } + + if( FillFlag == TRUE ) + { + // 指定の数のインデックスを収められるバッファが確保されていなかったら確保 + if( GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 1 ] < Num && + GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 1 ] < 8191 ) + { + GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 1 ] = Num * 3 / 2 ; + if( GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 1 ] > 8191 ) + { + GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 1 ] = 8191 ; + } + + if( GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 1 ] == NULL ) + { + GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 1 ] = ( WORD * )DXALLOC( GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 1 ] * sizeof( WORD ) * 36 ) ; + } + else + { + GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 1 ] = ( WORD * )DXREALLOC( GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 1 ], GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 1 ] * sizeof( WORD ) * 36 ) ; + } + + // インデックスの固定値をセット + Index = GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 1 ] ; + j = 0 ; + for( i = 0 ; i < GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 1 ] ; i ++ ) + { + Index[ 0 ] = ( WORD )( j + 0 ) ; Index[ 1 ] = ( WORD )( j + 1 ) ; Index[ 2 ] = ( WORD )( j + 3 ) ; + Index[ 3 ] = ( WORD )( j + 3 ) ; Index[ 4 ] = ( WORD )( j + 1 ) ; Index[ 5 ] = ( WORD )( j + 2 ) ; + Index[ 6 ] = ( WORD )( j + 3 ) ; Index[ 7 ] = ( WORD )( j + 2 ) ; Index[ 8 ] = ( WORD )( j + 7 ) ; + Index[ 9 ] = ( WORD )( j + 7 ) ; Index[ 10 ] = ( WORD )( j + 2 ) ; Index[ 11 ] = ( WORD )( j + 6 ) ; + Index[ 12 ] = ( WORD )( j + 2 ) ; Index[ 13 ] = ( WORD )( j + 1 ) ; Index[ 14 ] = ( WORD )( j + 6 ) ; + Index[ 15 ] = ( WORD )( j + 6 ) ; Index[ 16 ] = ( WORD )( j + 1 ) ; Index[ 17 ] = ( WORD )( j + 5 ) ; + Index[ 18 ] = ( WORD )( j + 1 ) ; Index[ 19 ] = ( WORD )( j + 0 ) ; Index[ 20 ] = ( WORD )( j + 5 ) ; + Index[ 21 ] = ( WORD )( j + 5 ) ; Index[ 22 ] = ( WORD )( j + 0 ) ; Index[ 23 ] = ( WORD )( j + 4 ) ; + Index[ 24 ] = ( WORD )( j + 0 ) ; Index[ 25 ] = ( WORD )( j + 3 ) ; Index[ 26 ] = ( WORD )( j + 4 ) ; + Index[ 27 ] = ( WORD )( j + 4 ) ; Index[ 28 ] = ( WORD )( j + 3 ) ; Index[ 29 ] = ( WORD )( j + 7 ) ; + Index[ 30 ] = ( WORD )( j + 7 ) ; Index[ 31 ] = ( WORD )( j + 6 ) ; Index[ 32 ] = ( WORD )( j + 4 ) ; + Index[ 33 ] = ( WORD )( j + 4 ) ; Index[ 34 ] = ( WORD )( j + 6 ) ; Index[ 35 ] = ( WORD )( j + 5 ) ; + + Index += 36 ; + j += 8 ; + } + } + } + else + { + // 指定の数のインデックスを収められるバッファが確保されていなかったら確保 + if( GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] < Num && + GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] < 8191 ) + { + GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] = Num * 3 / 2 ; + if( GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] > 8191 ) + { + GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] = 8191 ; + } + + if( GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 2 ] == NULL ) + { + GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 2 ] = ( WORD * )DXALLOC( GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] * sizeof( WORD ) * 24 ) ; + } + else + { + GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 2 ] = ( WORD * )DXREALLOC( GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 2 ], GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] * sizeof( WORD ) * 24 ) ; + } + + // インデックスの固定値をセット + Index = GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 2 ] ; + j = 0 ; + for( i = 0 ; i < GSYS.Resource.DrawCubeSet3DWorkIndexBufferSize[ 2 ] ; i ++ ) + { + Index[ 0 ] = ( WORD )( j + 0 ) ; Index[ 1 ] = ( WORD )( j + 1 ) ; + Index[ 2 ] = ( WORD )( j + 1 ) ; Index[ 3 ] = ( WORD )( j + 2 ) ; + Index[ 4 ] = ( WORD )( j + 2 ) ; Index[ 5 ] = ( WORD )( j + 3 ) ; + Index[ 6 ] = ( WORD )( j + 3 ) ; Index[ 7 ] = ( WORD )( j + 0 ) ; + Index[ 8 ] = ( WORD )( j + 0 ) ; Index[ 9 ] = ( WORD )( j + 4 ) ; + Index[ 10 ] = ( WORD )( j + 1 ) ; Index[ 11 ] = ( WORD )( j + 5 ) ; + Index[ 12 ] = ( WORD )( j + 2 ) ; Index[ 13 ] = ( WORD )( j + 6 ) ; + Index[ 14 ] = ( WORD )( j + 3 ) ; Index[ 15 ] = ( WORD )( j + 7 ) ; + Index[ 16 ] = ( WORD )( j + 4 ) ; Index[ 17 ] = ( WORD )( j + 5 ) ; + Index[ 18 ] = ( WORD )( j + 5 ) ; Index[ 19 ] = ( WORD )( j + 6 ) ; + Index[ 20 ] = ( WORD )( j + 6 ) ; Index[ 21 ] = ( WORD )( j + 7 ) ; + Index[ 22 ] = ( WORD )( j + 7 ) ; Index[ 23 ] = ( WORD )( j + 4 ) ; + + Index += 24 ; + j += 8 ; + } + } + } + + // 立方体の数だけ繰り返し + Vertex = GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 0 ] ; + j = 0 ; + for( k = 0 ; k < Num ; k ++, CubeDataArray ++ ) + { + // 頂点データの作成 + Vertex[ 0 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 0 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 0 ].pos.z = CubeDataArray->Pos2.z ; + Vertex[ 1 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 1 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 1 ].pos.z = CubeDataArray->Pos2.z ; + Vertex[ 2 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 2 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 2 ].pos.z = CubeDataArray->Pos1.z ; + Vertex[ 3 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 3 ].pos.y = CubeDataArray->Pos2.y ; Vertex[ 3 ].pos.z = CubeDataArray->Pos1.z ; + Vertex[ 4 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 4 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 4 ].pos.z = CubeDataArray->Pos2.z ; + Vertex[ 5 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 5 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 5 ].pos.z = CubeDataArray->Pos2.z ; + Vertex[ 6 ].pos.x = CubeDataArray->Pos2.x ; Vertex[ 6 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 6 ].pos.z = CubeDataArray->Pos1.z ; + Vertex[ 7 ].pos.x = CubeDataArray->Pos1.x ; Vertex[ 7 ].pos.y = CubeDataArray->Pos1.y ; Vertex[ 7 ].pos.z = CubeDataArray->Pos1.z ; + + Vertex[ 0 ].dif = CubeDataArray->DifColor ; Vertex[ 0 ].spc = CubeDataArray->SpcColor ; + Vertex[ 1 ].dif = CubeDataArray->DifColor ; Vertex[ 1 ].spc = CubeDataArray->SpcColor ; + Vertex[ 2 ].dif = CubeDataArray->DifColor ; Vertex[ 2 ].spc = CubeDataArray->SpcColor ; + Vertex[ 3 ].dif = CubeDataArray->DifColor ; Vertex[ 3 ].spc = CubeDataArray->SpcColor ; + Vertex[ 4 ].dif = CubeDataArray->DifColor ; Vertex[ 4 ].spc = CubeDataArray->SpcColor ; + Vertex[ 5 ].dif = CubeDataArray->DifColor ; Vertex[ 5 ].spc = CubeDataArray->SpcColor ; + Vertex[ 6 ].dif = CubeDataArray->DifColor ; Vertex[ 6 ].spc = CubeDataArray->SpcColor ; + Vertex[ 7 ].dif = CubeDataArray->DifColor ; Vertex[ 7 ].spc = CubeDataArray->SpcColor ; + + // 頂点データが一杯になったら描画 + j ++ ; + if( j >= 8191 ) + { + if( FillFlag == TRUE ) + { + NS_DrawPrimitiveIndexed3D( + GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 0 ], 8 * j, + GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 1 ], 36 * j, + DX_PRIMTYPE_TRIANGLELIST, DX_NONE_GRAPH, TRUE ) ; + } + else + { + NS_DrawPrimitiveIndexed3D( + GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 0 ], 8 * j, + GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 0 ], 24 * j, + DX_PRIMTYPE_LINELIST, DX_NONE_GRAPH, TRUE ) ; + } + + Vertex = GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 0 ] ; + j = 0 ; + } + else + { + Vertex += 8 ; + } + } + + // 頂点データが残っていたら描画 + if( j > 0 ) + { + if( FillFlag == TRUE ) + { + NS_DrawPrimitiveIndexed3D( + GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 0 ], 8 * j, + GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 1 ], 36 * j, + DX_PRIMTYPE_TRIANGLELIST, DX_NONE_GRAPH, TRUE ) ; + } + else + { + NS_DrawPrimitiveIndexed3D( + GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ 0 ], 8 * j, + GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ 0 ], 24 * j, + DX_PRIMTYPE_LINELIST, DX_NONE_GRAPH, TRUE ) ; + } + } + } + + // 終了 + return 0 ; +} + // 3Dの球体を描画する extern int NS_DrawSphere3D( VECTOR CenterPos, float r, int DivNum, unsigned int DifColor, unsigned int SpcColor, int FillFlag ) { @@ -13550,6 +13977,160 @@ int NS_DrawCircleGauge( int CenterX, int CenterY, double Percent, int GrHandle, return 0; } +// 円グラフ的な描画を行う +int NS_DrawCircleGaugeF( float CenterX, float CenterY, double Percent, int GrHandle, double StartPercent , double Scale, int ReverseX, int ReverseY ) +{ + VECTOR vertex[3] ; + VECTOR position[4] ; + VECTOR positionR ; + VECTOR positionR2 ; + float radian ; + float radian2 ; + float length ; + float Sin ; + float Cos ; + float CenterXF ; + float CenterYF ; + float SizeR ; + int SizeX ; + int SizeY ; + int i ; + float StartRad ; + float EndRad ; + IMAGEDATA *Image ; + float UScale ; + float VScale ; + float UStart ; + float VStart ; + RECT DrawRect ; + RECT GaugeDrawRect ; + + Image = Graphics_Image_GetData( GrHandle ) ; + if( Image == NULL ) + { + return -1 ; + } + + if( Image->Orig->FormatDesc.TextureFlag ) + { + UStart = ( float )Image->Hard.Draw[ 0 ].UsePosXF / Image->Hard.Draw[ 0 ].Tex->TexWidth ; + VStart = ( float )Image->Hard.Draw[ 0 ].UsePosYF / Image->Hard.Draw[ 0 ].Tex->TexHeight ; + UScale = ( float )Image->WidthF / Image->Hard.Draw[ 0 ].Tex->TexWidth ; + VScale = ( float )Image->HeightF / Image->Hard.Draw[ 0 ].Tex->TexHeight ; + } + else + { + UScale = 1.0f ; + VScale = 1.0f ; + UStart = 0.0f ; + VStart = 0.0f ; + } + + if( StartPercent > 200.0 ) + { + StartPercent = 200.0 ; + } + else + if( StartPercent < -100.0 ) + { + StartPercent = -100.0 ; + } + + if( Percent > 200.0 ) + { + Percent = 200.0 ; + } + else + if( Percent < -100.0 ) + { + Percent = -100.0 ; + } + + if( Percent - StartPercent > 100.0 ) + { + StartPercent = 0.0 ; + Percent = 100.0 ; + } + + if( StartPercent == Percent || + StartPercent > Percent ) + { + return 0 ; + } + + NS_GetGraphSize( GrHandle, &SizeX, &SizeY ); + + radian = ( float )( Percent * 2 * DX_PI / 100.0 ); + radian2 = ( float )( StartPercent * 2 * DX_PI / 100.0 ); + length = ( float )( SizeX * Scale * 0.75f ) ; + CenterXF = ( float )CenterX; + CenterYF = ( float )CenterY; + SizeR = ( float )( 1.0f / ( SizeX * Scale ) ) ; + + vertex[0].x = 0.0f; + vertex[0].y = 0.0f; + vertex[1] = vertex[0]; + vertex[2] = vertex[0]; + + position[0].x = 0.0f; + position[0].y = -length; + + position[1].x = length; + position[1].y = 0.0f; + + position[2].x = 0.0f; + position[2].y = length; + + position[3].x = -length; + position[3].y = 0.0f; + + _SINCOS_PLATFORM( radian2 - DX_PI_F * 0.5f, &Sin, &Cos ) ; + positionR2.x = Cos * length; + positionR2.y = Sin * length; + + _SINCOS_PLATFORM( radian - DX_PI_F * 0.5f, &Sin, &Cos ) ; + positionR.x = Cos * length; + positionR.y = Sin * length; + + DrawRect = GSYS.DrawSetting.DrawArea ; + if( Scale != 1.0 ) + { + GaugeDrawRect.left = _FTOL( CenterX ) - _DTOL( SizeX * Scale ) / 2 - 2 ; + GaugeDrawRect.top = _FTOL( CenterY ) - _DTOL( SizeY * Scale ) / 2 - 2 ; + GaugeDrawRect.right = _FTOL( CenterX ) + _DTOL( SizeX * Scale ) / 2 + 2 ; + GaugeDrawRect.bottom = _FTOL( CenterY ) + _DTOL( SizeY * Scale ) / 2 + 2 ; + } + else + { + GaugeDrawRect.left = _FTOL( CenterX ) - SizeX / 2 - 2 ; + GaugeDrawRect.top = _FTOL( CenterY ) - SizeY / 2 - 2 ; + GaugeDrawRect.right = _FTOL( CenterX ) + SizeX / 2 + 2 ; + GaugeDrawRect.bottom = _FTOL( CenterY ) + SizeY / 2 + 2 ; + } + RectClipping_Inline( &GaugeDrawRect, &DrawRect ) ; + NS_SetDrawArea( GaugeDrawRect.left, GaugeDrawRect.top, GaugeDrawRect.right, GaugeDrawRect.bottom ) ; + + // 90度分筒描画 + for( i = 0 ; i < 12 ; i ++ ) + { + StartRad = DX_PI_F * 0.5f * ( i - 4 ) ; + EndRad = DX_PI_F * 0.5f * ( i - 4 + 1 ) ; + + if( ( radian2 >= StartRad && radian2 <= EndRad ) || ( StartRad >= radian2 && StartRad <= radian ) ) + { + vertex[1] = radian2 <= StartRad ? position[ i % 4 ] : positionR2; + vertex[2] = radian >= EndRad ? position[ ( i + 1 ) % 4 ] : positionR; + DrawCircleGaugePolygon( GrHandle, CenterXF, CenterYF, vertex, SizeR, UScale, VScale, UStart, VStart, ReverseX, ReverseY ); + } + } + + // 描画可能範囲を元に戻す + NS_SetDrawArea( DrawRect.left, DrawRect.top, DrawRect.right, DrawRect.bottom ) ; + + // 終了 + return 0; +} + static struct { float DrawZ; @@ -15785,6 +16366,13 @@ extern int NS_SetMaxAnisotropy( int MaxAnisotropy ) return 0 ; } +// 最大異方性値を取得する +extern int NS_GetMaxAnisotropy( void ) +{ + // 最大異方性値を返す + return GSYS.DrawSetting.MaxAnisotropy ; +} + // 3D処理で使用する座標値が 10000000.0f などの大きな値になっても描画の崩れを小さく抑える処理を使用するかどうかを設定する、DxLib_Init の呼び出し前でのみ使用可能( TRUE:描画の崩れを抑える処理を使用する( CPU負荷が上がります )  FALSE:描画の崩れを抑える処理は使用しない( デフォルト ) ) extern int NS_SetUseLarge3DPositionSupport( int UseFlag ) { @@ -18765,7 +19353,11 @@ extern int NS_GetDrawCallCount( void ) // フレームレート( 1秒間に呼ばれる ScreenFlip の回数 )を取得する extern float NS_GetFPS( void ) { +#if defined( _MSC_VER ) && _MSC_VER == 1200 + return ( float )( ( double )( LONGLONG )NS_GetSysPerformanceFrequency() / ( LONGLONG )( GSYS.PerformanceInfo.ScreenFlipTime[ 0 ] - GSYS.PerformanceInfo.ScreenFlipTime[ 1 ] ) ) ; +#else return ( float )( ( double )NS_GetSysPerformanceFrequency() / ( GSYS.PerformanceInfo.ScreenFlipTime[ 0 ] - GSYS.PerformanceInfo.ScreenFlipTime[ 1 ] ) ) ; +#endif } @@ -24623,6 +25215,23 @@ extern int Graphics_Initialize( void ) goto ERR ; } + // GetFPS の値の安定化の為にScreenFlipを6回ほど実行する + { + int i ; + for( i = 0 ; i < 6 ; i ++ ) + { + NS_ClearDrawScreen() ; + + // まだDXライブラリの初期化が終わっていないので環境依存関数を直接呼ぶ + GSYS.Screen.ScreenFlipFlag = TRUE ; + Graphics_ScreenFlipBase_PF() ; + GSYS.Screen.ScreenFlipFlag = FALSE ; + + // ScreenFlip が呼ばれた時間を保存 + Graphics_Screen_UpdateFlipTime() ; + } + } + // 終了 return 0 ; @@ -24692,6 +25301,27 @@ extern int Graphics_Terminate( void ) GSYS.Resource.TempVertexBufferSize = 0 ; } + // DrawCubeSet3D用の頂点を一時的に保存するメモリ領域の解放 + { + int i ; + for( i = 0 ; i < 2 ; i ++ ) + { + if( GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ i ] ) + { + DXFREE( GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ i ] ) ; + GSYS.Resource.DrawCubeSet3DWorkVertexBuffer[ i ] = NULL ; + } + } + for( i = 0 ; i < 3 ; i ++ ) + { + if( GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ i ] ) + { + DXFREE( GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ i ] ) ; + GSYS.Resource.DrawCubeSet3DWorkIndexBuffer[ i ] = NULL ; + } + } + } + // シャドウマップハンドル管理情報の後始末 TerminateHandleManage( DX_HANDLETYPE_SHADOWMAP ) ; @@ -25612,6 +26242,14 @@ extern int Graphics_Screen_UnlockDrawScreen( void ) return 0 ; } +// ScreenFlipTimeの更新 +static void Graphics_Screen_UpdateFlipTime( void ) +{ + // ScreenFlip が呼ばれた時間を保存 + GSYS.PerformanceInfo.ScreenFlipTime[ 1 ] = GSYS.PerformanceInfo.ScreenFlipTime[ 0 ] ; + GSYS.PerformanceInfo.ScreenFlipTime[ 0 ] = NS_GetNowSysPerformanceCount() ; +} + // 裏画面と表画面を交換する // 表画面が裏画面からのスケーリングの場合は、CopyRect はコピー先矩形 ) extern int Graphics_Screen_FlipBase( void ) @@ -25678,8 +26316,7 @@ extern int Graphics_Screen_FlipBase( void ) Result = Graphics_ScreenFlipBase_PF() ; // ScreenFlip が呼ばれた時間を保存 - GSYS.PerformanceInfo.ScreenFlipTime[ 1 ] = GSYS.PerformanceInfo.ScreenFlipTime[ 0 ] ; - GSYS.PerformanceInfo.ScreenFlipTime[ 0 ] = NS_GetNowSysPerformanceCount() ; + Graphics_Screen_UpdateFlipTime() ; // 描画コール回数の処理 GSYS.PerformanceInfo.PrevFrameDrawCallCount = GSYS.PerformanceInfo.NowFrameDrawCallCount ; diff --git a/DxGraphics.h b/DxGraphics.h index 559a261..60ad941 100644 --- a/DxGraphics.h +++ b/DxGraphics.h @@ -2,7 +2,7 @@ // // DXライブラリ 描画プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -1006,6 +1006,11 @@ struct GRAPHICSSYS_CREATEIMAGEDATA struct GRAPHICSSYS_DISPLAYINFO { int IsPrimary ; // プライマリモニタかどうか( TRUE:プライマリモニタ FALSE:サブモニタ ) + + void * MonitorHandle ; // モニターハンドル + DWORD XDpi ; // x軸のDPI + DWORD YDpi ; // y軸のDPI + RECT DesktopRect ; // デスクトップ上でのモニタ領域 int DesktopSizeX ; // デスクトップ上での幅 int DesktopSizeY ; // デスクトップ上での高さ @@ -1087,6 +1092,12 @@ struct GRAPHICSSYS_SETTINGDATA // 処理実行用リソース関係の構造体 struct GRAPHICSSYS_RESOURCE { + int DrawCubeSet3DWorkVertexBufferSize[ 2 ] ;// DrawCubeSet3D用の頂点バッファのサイズ( 0:ライティング無し 1:ライティングあり ) + VERTEX3D *DrawCubeSet3DWorkVertexBuffer[ 2 ] ; // DrawCubeSet3D用の頂点バッファ( 0:ライティング無し 1:ライティングあり ) + + int DrawCubeSet3DWorkIndexBufferSize[ 3 ] ; // DrawCubeSet3D用のインデックスバッファのサイズ( 0:ライティング無し+ライン 1:ライティング無し+塗りつぶし 2:ライティングあり+塗りつぶし ) + WORD *DrawCubeSet3DWorkIndexBuffer[ 3 ] ; // DrawCubeSet3D用のインデックスバッファのサイズ( 0:ライティング無し+ライン 1:ライティング無し+塗りつぶし 2:ライティングあり+塗りつぶし ) + int TempVertexBufferSize ; // 一時的に頂点データを格納するためのバッファのサイズ void *TempVertexBuffer ; // 一時的に頂点データを格納するためのバッファ diff --git a/DxGraphicsFilter.cpp b/DxGraphicsFilter.cpp index e7da61a..bffd59f 100644 --- a/DxGraphicsFilter.cpp +++ b/DxGraphicsFilter.cpp @@ -2,7 +2,7 @@ // // DXライブラリ GraphFilter系プログラム // -// Ver 3.21d +// Ver 3.21f // //----------------------------------------------------------------------------- diff --git a/DxGraphicsFilter.h b/DxGraphicsFilter.h index 929c6bb..2e3eba5 100644 --- a/DxGraphicsFilter.h +++ b/DxGraphicsFilter.h @@ -2,7 +2,7 @@ // // DXライブラリ GraphFilter系プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxHandle.cpp b/DxHandle.cpp index 8f25616..b318877 100644 --- a/DxHandle.cpp +++ b/DxHandle.cpp @@ -2,7 +2,7 @@ // // DXライブラリ ハンドル管理プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxHandle.h b/DxHandle.h index 81667dc..90b5de9 100644 --- a/DxHandle.h +++ b/DxHandle.h @@ -2,7 +2,7 @@ // // DXライブラリ ハンドル管理プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxHeap.cpp b/DxHeap.cpp index 8bc1429..fe3234f 100644 --- a/DxHeap.cpp +++ b/DxHeap.cpp @@ -2,7 +2,7 @@ // // DXライブラリ ヒープ関連プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxHeap.h b/DxHeap.h index 9028f2f..502b868 100644 --- a/DxHeap.h +++ b/DxHeap.h @@ -2,7 +2,7 @@ // // DXライブラリ ヒープ関係プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxInput.cpp b/DxInput.cpp index f0c8fb8..48d70ca 100644 --- a/DxInput.cpp +++ b/DxInput.cpp @@ -2,7 +2,7 @@ // // DXライブラリ DirectInput制御プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxInput.h b/DxInput.h index 1d7d945..60f8453 100644 --- a/DxInput.h +++ b/DxInput.h @@ -2,7 +2,7 @@ // // DXライブラリ 入力情報プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxInputString.cpp b/DxInputString.cpp index 19f3f38..30d5cc0 100644 --- a/DxInputString.cpp +++ b/DxInputString.cpp @@ -2,7 +2,7 @@ // // DXライブラリ 文字列入力プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -964,7 +964,7 @@ extern LRESULT IMEProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) // IME無視状態だった場合はなにもせず終了 /* if( CharBuf.IMEUseFlag == FALSE ) { -// WinAPIData.Win32Func.DefWindowProcWFunc( hWnd , message , wParam , lParam ) ; +// DefWindowProcWFunc( hWnd , message , wParam , lParam ) ; return 0; } */ @@ -1074,7 +1074,7 @@ extern LRESULT IMEProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) } else { - WinAPIData.Win32Func.DefWindowProcWFunc( hWnd , message , wParam , lParam ) ; + DefWindowProcWFunc( hWnd , message , wParam , lParam ) ; } break ; @@ -1082,7 +1082,7 @@ extern LRESULT IMEProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) case WM_IME_SETCONTEXT : // lParam &= ~ISC_SHOWUICANDIDATEWINDOW ; lParam = 0; - return WinAPIData.Win32Func.DefWindowProcWFunc( hWnd , message , wParam , lParam ) ; + return DefWindowProcWFunc( hWnd , message , wParam , lParam ) ; // IME入力開始メッセージ case WM_IME_STARTCOMPOSITION : @@ -1206,13 +1206,13 @@ extern LRESULT IMEProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) Flag = TRUE ; - WinAPIData.Win32Func.DefWindowProcWFunc( hWnd , message , wParam , lParam ) ; + DefWindowProcWFunc( hWnd , message , wParam , lParam ) ; // キーが押されている間ここで止まる { ULONGLONG Time = NS_GetNowSysPerformanceCount() ; - while( NS_ProcessMessage() == 0 && NS_ConvSysPerformanceCountToMilliSeconds( NS_GetNowSysPerformanceCount() - Time ) < 2000 ){} + while( NS_ProcessMessage() == 0 && NS_ConvSysPerformanceCountToMicroSeconds( NS_GetNowSysPerformanceCount() - Time ) < 2000 ){} } Flag = FALSE ; @@ -1309,7 +1309,7 @@ extern LRESULT IMEProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) default : // return 0; - return WinAPIData.Win32Func.DefWindowProcWFunc( hWnd , message , wParam , lParam ) ; + return DefWindowProcWFunc( hWnd , message , wParam , lParam ) ; } break; } diff --git a/DxInputString.h b/DxInputString.h index cbcf7ea..a7d9a57 100644 --- a/DxInputString.h +++ b/DxInputString.h @@ -2,7 +2,7 @@ // // DXライブラリ 文字列入力プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxLib.h b/DxLib.h index f5e8afd..98b6c5b 100644 --- a/DxLib.h +++ b/DxLib.h @@ -2,7 +2,7 @@ // // DXライブラリ ヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -12,9 +12,9 @@ #include "DxCompileConfig.h" // DXライブラリのバージョン -#define DXLIB_VERSION 0x321d -#define DXLIB_VERSION_STR_T _T( "3.21d" ) -#define DXLIB_VERSION_STR_W L"3.21d" +#define DXLIB_VERSION 0x321f +#define DXLIB_VERSION_STR_T _T( "3.21f" ) +#define DXLIB_VERSION_STR_W L"3.21f" // 設定 ----------------------------------------------------------------------- @@ -61,7 +61,7 @@ #define MAX_SOCKET_NUM (8192) // 同時に持てる通信ハンドルの最大数 #define MAX_LIGHT_NUM (4096) // 同時に持てるライトハンドルの最大数 #define MAX_SHADER_NUM (4096) // 同時に持てるシェーダーハンドルの最大数 -#define MAX_CONSTANT_BUFFER_NUM (8192) // 同時に持てる定数バッファハンドルの最大数 +#define MAX_CONSTANT_BUFFER_NUM (32768) // 同時に持てる定数バッファハンドルの最大数 #define MAX_MODEL_BASE_NUM (32768) // 同時に持てる3Dモデル基本データハンドルの最大数 #define MAX_MODEL_NUM (32768) // 同時に持てる3Dモデルデータハンドルの最大数 #define MAX_VERTEX_BUFFER_NUM (16384) // 同時に持てる頂点バッファハンドルの最大数 @@ -428,6 +428,10 @@ #define DX_SOUNDDATATYPE_MEMPRESS (2) // 圧縮された全データはシステムメモリに格納され、再生する部分だけ逐次解凍しながらサウンドメモリに格納する(鳴らし終わると解凍したデータは破棄されるので何度も解凍処理が行われる) #define DX_SOUNDDATATYPE_FILE (3) // 圧縮されたデータの再生する部分だけファイルから逐次読み込み解凍され、サウンドメモリに格納される(鳴らし終わると解凍したデータは破棄されるので何度も解凍処理が行われる) +// サウンドの取得する再生時間タイプ +#define DX_SOUNDCURRENTTIME_TYPE_LOW_LEVEL (0) // 低レベルAPIを使用してより正確な再生時間を取得する +#define DX_SOUNDCURRENTTIME_TYPE_SOFT (1) // APIは使用せず、ソフトウェア処理レベルでの再生時間を取得する + // 読み込み処理のタイプ #define DX_READSOUNDFUNCTION_PCM (1 << 0) // PCM の読み込み処理 #define DX_READSOUNDFUNCTION_OGG (1 << 1) // Ogg Vorbis の読み込み処理 @@ -1699,6 +1703,15 @@ typedef struct tagPOINTDATA int pal ; // パラメータ } POINTDATA, *LPPOINTDATA ; +// 立方体データ型 +typedef struct tagCUBEDATA +{ + VECTOR Pos1 ; // 座標1 + VECTOR Pos2 ; // 座標2 + COLOR_U8 DifColor ; // ディフューズカラー + COLOR_U8 SpcColor ; // スペキュラカラー +} CUBEDATA, *LPCUBEDATA ; + #ifndef DX_NOTUSE_DRAWFUNCTION // イメージフォーマットデータ @@ -2716,6 +2729,7 @@ extern DXLIBAPI int MailApp_SendWithStrLen( const TCHAR *MailAddr = NULL , siz extern DXLIBAPI int DrawTriangle3DD( VECTOR_D Pos1, VECTOR_D Pos2, VECTOR_D Pos3, unsigned int Color, int FillFlag ) ; // 3Dの三角形を描画する extern DXLIBAPI int DrawCube3D( VECTOR Pos1, VECTOR Pos2, unsigned int DifColor, unsigned int SpcColor, int FillFlag ) ; // 3Dの立方体を描画する extern DXLIBAPI int DrawCube3DD( VECTOR_D Pos1, VECTOR_D Pos2, unsigned int DifColor, unsigned int SpcColor, int FillFlag ) ; // 3Dの立方体を描画する +extern DXLIBAPI int DrawCubeSet3D( CUBEDATA *CubeDataArray, int Num, int FillFlag ) ; // 3Dの立方体の集合を描画する extern DXLIBAPI int DrawSphere3D( VECTOR CenterPos, float r, int DivNum, unsigned int DifColor, unsigned int SpcColor, int FillFlag ) ; // 3Dの球体を描画する extern DXLIBAPI int DrawSphere3DD( VECTOR_D CenterPos, double r, int DivNum, unsigned int DifColor, unsigned int SpcColor, int FillFlag ) ; // 3Dの球体を描画する extern DXLIBAPI int DrawCapsule3D( VECTOR Pos1, VECTOR Pos2, float r, int DivNum, unsigned int DifColor, unsigned int SpcColor, int FillFlag ) ; // 3Dのカプセルを描画する @@ -2778,7 +2792,8 @@ extern DXLIBAPI int MailApp_SendWithStrLen( const TCHAR *MailAddr = NULL , siz extern DXLIBAPI int DrawBlendGraph( int x, int y, int GrHandle, int TransFlag, int BlendGraph, int BorderParam, int BorderRange ) ; // ブレンド画像と合成して画像を等倍描画する extern DXLIBAPI int DrawBlendGraphPos( int x, int y, int GrHandle, int TransFlag, int bx, int by, int BlendGraph, int BorderParam, int BorderRange ) ; // ブレンド画像と合成して画像を等倍描画する( ブレンド画像の起点座標を指定する引数付き ) -extern DXLIBAPI int DrawCircleGauge( int CenterX, int CenterY, double Percent, int GrHandle, double StartPercent = 0.0 , double Scale = 1.0 , int ReverseX = FALSE , int ReverseY = FALSE ) ; // 円グラフ的な描画を行う( GrHandle の画像の上下左右の端は透過色にしておく必要があります ) +extern DXLIBAPI int DrawCircleGauge( int CenterX, int CenterY, double Percent, int GrHandle, double StartPercent = 0.0 , double Scale = 1.0 , int ReverseX = FALSE , int ReverseY = FALSE ) ; // 円グラフ的な描画を行う( GrHandle の画像の上下左右の端は透過色にしておく必要があります ) +extern DXLIBAPI int DrawCircleGaugeF( float CenterX, float CenterY, double Percent, int GrHandle, double StartPercent = 0.0 , double Scale = 1.0 , int ReverseX = FALSE , int ReverseY = FALSE ) ; // 円グラフ的な描画を行う( GrHandle の画像の上下左右の端は透過色にしておく必要があります )( 座標指定が float 版 ) extern DXLIBAPI int DrawGraphToZBuffer( int X, int Y, int GrHandle, int WriteZMode /* DX_ZWRITE_MASK 等 */ ) ; // Zバッファに対して画像の等倍描画 extern DXLIBAPI int DrawTurnGraphToZBuffer( int x, int y, int GrHandle, int WriteZMode /* DX_ZWRITE_MASK 等 */ ) ; // Zバッファに対して画像の左右反転描画 @@ -2848,6 +2863,7 @@ extern DXLIBAPI int MailApp_SendWithStrLen( const TCHAR *MailAddr = NULL , siz extern DXLIBAPI int CheckSeparateAlphaBlendEnable( void ) ; // 描画先のアルファチャンネルの内容を書き換えないことができるかどうかを取得する( TRUE:書き換えないことができる FALSE:書き換えないことができない ) extern DXLIBAPI int SetIgnoreDrawGraphColor( int EnableFlag ) ; // 描画する画像のRGB成分を無視するかどうかを指定する( EnableFlag:この機能を使うかどうか( TRUE:使う FALSE:使わない( デフォルト ) ) ) extern DXLIBAPI int SetMaxAnisotropy( int MaxAnisotropy ) ; // 最大異方性値を設定する +extern DXLIBAPI int GetMaxAnisotropy( void ) ; // 最大異方性値を取得する extern DXLIBAPI int SetUseLarge3DPositionSupport( int UseFlag ) ; // 3D処理で使用する座標値が 10000000.0f などの大きな値になっても描画の崩れを小さく抑える処理を使用するかどうかを設定する、DxLib_Init の呼び出し前でのみ使用可能( TRUE:描画の崩れを抑える処理を使用する( CPU負荷が上がります )  FALSE:描画の崩れを抑える処理は使用しない( デフォルト ) ) extern DXLIBAPI int SetUseZBufferFlag( int Flag ) ; // Zバッファを使用するかどうかを設定する( 2Dと3D描画に影響 )( TRUE:Zバッファを使用する FALSE:Zバッファを使用しない( デフォルト ) ) @@ -4674,6 +4690,8 @@ extern DXLIBAPI int CreateColorData( COLORDATA *ColorDataBuf, int Col extern DXLIBAPI int GetDisableReadSoundFunctionMask( void ) ; // 使用しないサウンドデータ読み込み処理のマスクを取得する( DX_READSOUNDFUNCTION_PCM 等 ) extern DXLIBAPI int SetEnableSoundCaptureFlag( int Flag ) ; // サウンドキャプチャを前提とした動作をするかどうかを設定する extern DXLIBAPI int SetUseOldVolumeCalcFlag( int Flag ) ; // ChangeVolumeSoundMem, ChangeNextPlayVolumeSoundMem, ChangeMovieVolumeToGraph の音量計算式を Ver3.10c以前のものを使用するかどうかを設定する( TRUE:Ver3.10c以前の計算式を使用 FALSE:3.10d以降の計算式を使用( デフォルト ) ) +extern DXLIBAPI int SetSoundCurrentTimeType( int Type /* DX_SOUNDCURRENTTIME_TYPE_LOW_LEVEL など */ ) ; // GetSoundCurrentTime などを使用した場合に取得できる再生時間のタイプを設定する +extern DXLIBAPI int GetSoundCurrentTimeType( void ) ; // GetSoundCurrentTime などを使用した場合に取得できる再生時間のタイプを取得する extern DXLIBAPI int SetCreate3DSoundFlag( int Flag ) ; // 次に作成するサウンドハンドルを3Dサウンド用にするかどうかを設定する( TRUE:3Dサウンド用にする FALSE:3Dサウンド用にしない( デフォルト ) ) extern DXLIBAPI int Set3DSoundOneMetre( float Distance ) ; // 3D空間の1メートルに相当する距離を設定する、DxLib_Init を呼び出す前でのみ呼び出し可能( デフォルト:1.0f ) @@ -5277,7 +5295,7 @@ extern DXLIBAPI int CreateColorData( COLORDATA *ColorDataBuf, int Col extern DXLIBAPI const TCHAR *Live2D_Model_GetPhysicsFileName( int Live2DModelHandle ) ; // Live2D のモデルの物理演算設定ファイルの名前を取得する extern DXLIBAPI const TCHAR *Live2D_Model_GetPoseFileName( int Live2DModelHandle ) ; // Live2D のモデルのパーツ切り替え設定ファイルの名前を取得する extern DXLIBAPI int Live2D_Model_GetExpressionCount( int Live2DModelHandle ) ; // Live2D のモデルの表情設定ファイルの数を取得する -extern DXLIBAPI const TCHAR *Live2D_Model_GetExpressionName( int Live2DModelHandle, int index ) ; // Live2D のモデルの表情設定ファイルを識別する名前(別名)を取得する +extern DXLIBAPI const TCHAR *Live2D_Model_GetExpressionName( int Live2DModelHandle, int index ) ; // Live2D のモデルの表情設定ファイルを識別するIDを取得する extern DXLIBAPI const TCHAR *Live2D_Model_GetExpressionFileName( int Live2DModelHandle, int index ) ; // Live2D のモデルの表情設定ファイルの名前を取得する extern DXLIBAPI int Live2D_Model_GetMotionGroupCount( int Live2DModelHandle ) ; // Live2D のモデルのモーショングループの数を取得する extern DXLIBAPI const TCHAR *Live2D_Model_GetMotionGroupName( int Live2DModelHandle, int index ) ; // Live2D のモデルのモーショングループの名前を取得する diff --git a/DxLib.txt b/DxLib.txt index aab3ec3..68f7f6a 100644 --- a/DxLib.txt +++ b/DxLib.txt @@ -2,7 +2,7 @@ // // DXライブラリ さわり // -// Ver 3.21d By 山田 巧 +// Ver 3.21f By 山田 巧 // //=============================================================================================== diff --git a/DxLive2DCubism4.cpp b/DxLive2DCubism4.cpp index ff99acc..5d49243 100644 --- a/DxLive2DCubism4.cpp +++ b/DxLive2DCubism4.cpp @@ -2,7 +2,7 @@ // // DXライブラリ Live2D Cubism4 関係プログラム // -// Ver 3.21d +// Ver 3.21f // // ---------------------------------------------------------------------------- @@ -18,6 +18,7 @@ #include "DxHandle.h" #include "DxLive2DCubism4.h" #include "DxSystem.h" +#include "DxLog.h" #include "DxASyncLoad.h" #include "DxUseCLibLive2DCubism4.h" @@ -453,6 +454,7 @@ extern int Live2DCubism4_LoadModel_Static( SetEnMarkW_( DirPath, sizeof( DirPath ) ) ; if( Model->AppModel->LoadAssets( ( BYTE * )DirPath, ( BYTE * )FileName, ASyncThread ) == false ) { + DXST_LOGFILEFMT_ADDUTF16LE(( "\x4c\x00\x69\x00\x76\x00\x65\x00\x32\x00\x44\x00\x20\x00\x45\x00\x72\x00\x72\x00\x6f\x00\x72\x00\x20\x00\x3a\x00\x20\x00\xe2\x30\xc7\x30\xeb\x30\xd5\x30\xa1\x30\xa4\x30\xeb\x30\x20\x00\x25\x00\x73\x00\x20\x00\x6e\x30\xad\x8a\x7f\x30\xbc\x8f\x7f\x30\x6b\x30\x31\x59\x57\x65\x57\x30\x7e\x30\x57\x30\x5f\x30\x00"/*@ L"Live2D Error : モデルファイル %s の読み込みに失敗しました" @*/, DirPath )) ; return -1 ; } @@ -908,7 +910,7 @@ extern const TCHAR *NS_Live2D_Model_GetParameterId( int Live2DModelHandle, int i #ifdef UNICODE return ( wchar_t * )( IdHandle != NULL ? IdHandle->GetString().GetRawStringW() : NULL ) ; #else - return IdHandle != NULL ? IdHandle->GetString().GetRawString() : NULL ; + return IdHandle != NULL ? IdHandle->GetString().GetRawStringA() : NULL ; #endif } @@ -1082,7 +1084,7 @@ extern const TCHAR *NS_Live2D_Model_GetHitAreaName( int Live2DModelHandle, int i #ifdef UNICODE return ( wchar_t * )Model->AppModel->_modelSetting->GetHitAreaNameW( index ) ; #else - return Model->AppModel->_modelSetting->GetHitAreaName( index ) ; + return Model->AppModel->_modelSetting->GetHitAreaNameA( index ) ; #endif } @@ -1098,7 +1100,7 @@ extern const TCHAR *NS_Live2D_Model_GetPhysicsFileName( int Live2DModelHandle ) #ifdef UNICODE return ( wchar_t * )Model->AppModel->_modelSetting->GetPhysicsFileNameW() ; #else - return Model->AppModel->_modelSetting->GetPhysicsFileName() ; + return Model->AppModel->_modelSetting->GetPhysicsFileNameA() ; #endif } @@ -1114,7 +1116,7 @@ extern const TCHAR *NS_Live2D_Model_GetPoseFileName( int Live2DModelHandle ) #ifdef UNICODE return ( wchar_t * )Model->AppModel->_modelSetting->GetPoseFileNameW() ; #else - return Model->AppModel->_modelSetting->GetPoseFileName() ; + return Model->AppModel->_modelSetting->GetPoseFileNameA() ; #endif } @@ -1131,7 +1133,7 @@ extern int NS_Live2D_Model_GetExpressionCount( int Live2DModelHandle ) return Model->AppModel->_modelSetting->GetExpressionCount() ; } -// Live2D のモデルの表情設定ファイルを識別する名前(別名)を取得する +// Live2D のモデルの表情設定ファイルを識別するIDを取得する extern const TCHAR *NS_Live2D_Model_GetExpressionName( int Live2DModelHandle, int index ) { LIVE2DCUBISM4MODEL * Model ; @@ -1143,7 +1145,7 @@ extern const TCHAR *NS_Live2D_Model_GetExpressionName( int Live2DModelHandle, in #ifdef UNICODE return ( wchar_t * )Model->AppModel->_modelSetting->GetExpressionNameW( index ) ; #else - return Model->AppModel->_modelSetting->GetExpressionName( index ) ; + return Model->AppModel->_modelSetting->GetExpressionNameA( index ) ; #endif } @@ -1159,7 +1161,7 @@ extern const TCHAR *NS_Live2D_Model_GetExpressionFileName( int Live2DModelHandle #ifdef UNICODE return ( wchar_t * )Model->AppModel->_modelSetting->GetExpressionFileNameW( index ) ; #else - return Model->AppModel->_modelSetting->GetExpressionFileName( index ) ; + return Model->AppModel->_modelSetting->GetExpressionFileNameA( index ) ; #endif } @@ -1188,7 +1190,7 @@ extern const TCHAR *NS_Live2D_Model_GetMotionGroupName( int Live2DModelHandle, i #ifdef UNICODE return ( wchar_t * )Model->AppModel->_modelSetting->GetMotionGroupNameW( index ) ; #else - return Model->AppModel->_modelSetting->GetMotionGroupName( index ) ; + return Model->AppModel->_modelSetting->GetMotionGroupNameA( index ) ; #endif } @@ -1298,7 +1300,7 @@ extern const TCHAR *Live2D_Model_GetMotionFileName_WCHAR_T( int Live2DModelHandl #ifdef UNICODE Result = ( wchar_t * )Model->AppModel->_modelSetting->GetMotionFileNameW( UsegroupNameBuffer, index ) ; #else - Result = Model->AppModel->_modelSetting->GetMotionFileName( UsegroupNameBuffer, index ) ; + Result = Model->AppModel->_modelSetting->GetMotionFileNameA( UsegroupNameBuffer, index ) ; #endif WCHAR_T_TO_CHAR_STRING_END( groupName ) @@ -1356,7 +1358,7 @@ extern const TCHAR *Live2D_Model_GetMotionSoundFileName_WCHAR_T( int Live2DModel #ifdef UNICODE Result = ( wchar_t * )Model->AppModel->_modelSetting->GetMotionSoundFileNameW( UsegroupNameBuffer, index ) ; #else - Result = Model->AppModel->_modelSetting->GetMotionSoundFileName( UsegroupNameBuffer, index ) ; + Result = Model->AppModel->_modelSetting->GetMotionSoundFileNameA( UsegroupNameBuffer, index ) ; #endif WCHAR_T_TO_CHAR_STRING_END( groupName ) @@ -1485,7 +1487,7 @@ extern const TCHAR *NS_Live2D_Model_GetUserDataFile( int Live2DModelHandle ) #ifdef UNICODE return ( wchar_t * )Model->AppModel->_modelSetting->GetUserDataFileW() ; #else - return Model->AppModel->_modelSetting->GetUserDataFile() ; + return Model->AppModel->_modelSetting->GetUserDataFileA() ; #endif } @@ -1514,7 +1516,7 @@ extern const TCHAR *NS_Live2D_Model_GetEyeBlinkParameterId( int Live2DModelHandl #ifdef UNICODE return ( wchar_t * )Model->AppModel->_modelSetting->GetEyeBlinkParameterId( index )->GetString().GetRawStringW() ; #else - return Model->AppModel->_modelSetting->GetEyeBlinkParameterId( index )->GetString().GetRawString() ; + return Model->AppModel->_modelSetting->GetEyeBlinkParameterId( index )->GetString().GetRawStringA() ; #endif } @@ -1543,7 +1545,7 @@ extern const TCHAR *NS_Live2D_Model_GetLipSyncParameterId( int Live2DModelHandle #ifdef UNICODE return ( wchar_t * )Model->AppModel->_modelSetting->GetLipSyncParameterId( index )->GetString().GetRawStringW() ; #else - return Model->AppModel->_modelSetting->GetLipSyncParameterId( index )->GetString().GetRawString() ; + return Model->AppModel->_modelSetting->GetLipSyncParameterId( index )->GetString().GetRawStringA() ; #endif } diff --git a/DxLive2DCubism4.h b/DxLive2DCubism4.h index 94fe859..39d631d 100644 --- a/DxLive2DCubism4.h +++ b/DxLive2DCubism4.h @@ -2,7 +2,7 @@ // // DXライブラリ Live2D Cubism4 関係プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxLog.cpp b/DxLog.cpp index 6f8a026..aae185b 100644 --- a/DxLog.cpp +++ b/DxLog.cpp @@ -2,7 +2,7 @@ // // DXライブラリ ログプログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxLog.h b/DxLog.h index 48369d3..4659219 100644 --- a/DxLog.h +++ b/DxLog.h @@ -2,7 +2,7 @@ // // DXライブラリ ログプログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxLog.txt b/DxLog.txt index 586cbd0..934ebb1 100644 --- a/DxLog.txt +++ b/DxLog.txt @@ -3,9 +3,96 @@ // DXライブラリ 非公式ログ // // Creator : 山田 巧 -// Last Access : 2019/1/5 +// Last Access : 2020/5/10 // ============================================================================ +Ver 3.21f  正式公開のためにバージョン番号を変更。 +Ver 3.21e  符号付き24bitの WAVファイルが正常に再生できないバグを修正。 +  同じサウンドハンドルを連続して PlaySoundMem を呼び続けると + PlaySoundMem を呼んでいるにも関わらず音が再生されないバグを修正。 +  Windows版:DXライブラリ内のサウンド処理で GetRand を呼んで + しまっていたバグを修正。 +  Windows版:GetPcInfo でグラフィックスデバイス名と使用している + DirectX の名前が取得できるようにプログラムを修正。 +  SetCreate3DSoundFlag などを使用した3Dサウンドの効果が無くなって + しまっていたバグを修正。 +  Windows版:KeyInputString などの文字列入力機能で、IME入力の + ON/OFF を切り替えると2秒間アプリが応答無しになるバグを修正。 +  関数 GetFPS が、起動直後は0に近い値が返るバグを修正。 +  Windows版:DxLib_Init の呼び出し後に SetWindowSizeExtendRate を + 使用すると正常に動作しないバグを修正。 +  Live2D の読み込み処理にエラー出力処理を追加。 +  Windows版:サウンドの出力に WASAPI や ASIO を使用した場合、 + ChangeVolumeSoundMem などの音量変更機能が正常に動作しない + ことがあるバグを修正。 +  自前ミキシングによるサウンド再生の場合、StopSoundMem を実行して + 音の再生を止めても GetCurrentPositionSoundMem などの再生位置取得 + 関数で取得できる値が変化し続けるバグを修正。 +  テキストファイルを FileRead_gets や FileRead_scanf で読み込んだ + 際のテキストファイルの文字コード形式の自動判別処理を追加。 +  Windows版:SetGraphMode や SetWindowSizeExtendRate などの関数で + ウィンドウのサイズの変更が正常に行われないことがあるバグを修正。 +  Windows版:タスクバーが隠れている状態でウィンドウモードで + 起動するとウィンドウがデスクトップ画面の左上端に表示されてしまう + バグを修正。 +  Windows版:CubismSdkForNative-4-r.1 に含まれる 32bit版 + Live2DCubismCore.dll を使用するとクラッシュするバグを修正。 +  Live2D_LoadModel で必要なファイルが存在しなかった場合にメモリの + 不正なアクセスが発生するバグを修正。 +  SetUseASyncLoadFlag( TRUE ) ; を実行した非同期読み込み設定で + Live2D_LoadModel で Live2D モデルを複数同時に読み込むと + メモリの不正なアクセスが発生してしまうことがあるバグを修正。 +  Live2D 用の Live2D_Model_GetExpressionName などの文字列を + 取得する関数で、取得できる文字列に全角文字が含まれていると + 取得する文字列が文字化けしてしまうバグを修正。 +  Windows版:Direct3D 11 を使用する場合、Live2D のマスク処理が + 正常に行われないことがあるバグを修正。 +  SetUseASyncLoadFlag( TRUE ) ; を実行した非同期読み込み設定で + LoadGraph などの読み込み関数で大量のファイルを同時に非同期 + 読み込みすると、偶に読み込みが途中で止まってしまい、どれだけ + 待っても読み込みが終了しないことがあるバグを修正。 +  定数バッファハンドルの最大数を 8192個から 32768個に変更。 +  DrawCircleGauge の引数 CenterX, CenterY の型が float になった + 関数 DrawCircleGaugeF を追加。 +  最大異方性値を取得するための関数 GetMaxAnisotropy を追加。 +  Live2D のモデル描画で異方性フィルタリングが有効になって + いなかったバグを修正。 +  Android版:oggファイルを読み込もうとするとクラッシュする + ことがある不具合を修正。 +  Live2D の Cubism Sdk For Native 4-r.1 の変更内容を反映。 +  GetSoundCurrentTime などの再生時間取得関数を使用した場合に + 取得できる再生時間のタイプを設定するための関数 + SetSoundCurrentTimeType を追加。 +  PlaySoundMem で再生中のサウンドハンドルに対して + SetFrequencySoundMem で再生周波数を変更すると、GetSoundCurrentTime等 + で取得できる再生時間が正しくなくなることがあるバグを修正。 +  Windows版:有効ビット深度24bitのWASAPI対応のサウンドデバイス + で排他モードで音を再生すると、音量が異様に小さくなってしまう + バグを修正。 +  立方体を一度に複数描画するための関数 DrawCubeSet3D を追加。 +  Graphics_Hardware_D3D11_GetUseDirect3D11BackBufferTexture2D + を使用した際に、取得できる Texture2D に直前に行った描画結果が反映 + されないバグを修正。 +  GetDesktopScreenGraph などのデスクトップの画像を取得する + 関数を高速化。 +  Windows版:Windows10 以降で行っている『短時間に連続して + 同じ文字がキー入力された場合には無視する』処理の判定に使用する + 時間を設定するための関数 SetWindows10_WM_CHAR_CancelTime を追加。 +  3Dモデルにアタッチしているアニメーションが1つだけの場合は + MV1SetAttachAnimBlendRate でブレンド率を 0.5f など 1.0f 以外に + しても 1.0f を指定した場合と同じ描画結果になってしまうバグを修正。 +  Windows版:モニタが高DPI設定になっていた場合も従来のDPI96を + 前提としたサイズでウィンドウが表示されるように処理を変更。 +  Windows版:モニタのDPIを取得する為の関数 GetMonitorDpi を追加。 +  Windows版:FileRead_open の第二引数を TRUE にすると + FileRead_close を実行しても確保したメモリが解放されないバグを修正。 +  Segment_Triangle_Analyse で三角形と線分が接触していないのに + 線分と三角形の距離が 0 という結果が出力されることがあるバグを修正。 +  HitCheck_Line_Triangle で三角形と同一平面上にある線分との + 当たり判定が正常に行われないバグを修正。 +  Windows版:SetUseDirectInputFlag( TRUE ); を実行した場合に + ウィンドウが非アクティブな状態でもマウスの入力に DirectInput を + 使用するかどうかを設定するための関数 SetDirectInputMouseMode を追加。 Ver 3.21d  正式公開のためにバージョン番号を変更。 Ver 3.21c  Windows版:GetDesktopScreenGraphMemImage にカラービット深度を 指定するための引数 ColorBitDepth を追加。 diff --git a/DxMask.cpp b/DxMask.cpp index 0b9c785..3d369d5 100644 --- a/DxMask.cpp +++ b/DxMask.cpp @@ -2,7 +2,7 @@ // // DXライブラリ マスクデータ管理プログラム // -// Ver 3.21d +// Ver 3.21f // //----------------------------------------------------------------------------- diff --git a/DxMask.h b/DxMask.h index 8960551..1b99975 100644 --- a/DxMask.h +++ b/DxMask.h @@ -2,7 +2,7 @@ // // DXライブラリ マスク処理ヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxMath.cpp b/DxMath.cpp index a069ef2..7963619 100644 --- a/DxMath.cpp +++ b/DxMath.cpp @@ -2,7 +2,7 @@ // // DXライブラリ 演算プログラム // -// Ver 3.21d +// Ver 3.21f // // ---------------------------------------------------------------------------- @@ -3723,16 +3723,14 @@ extern int Segment_Triangle_Analyse( const VECTOR *SegmentPos1, const VECTOR *Se VECTOR Tri1_2, Tri1_3 ; float Seg1_TriProSeg1_Dist = 0.0f ; float Seg2_TriProSeg2_Dist = 0.0f ; + float Seg1_TriProSeg1_DistBase = 0.0f ; + float Seg2_TriProSeg2_DistBase = 0.0f ; int MinType ; float MinLen ; + int ZeroLenCount ; SEGMENT_SEGMENT_RESULT Seg_Tri1_2_Res ; SEGMENT_SEGMENT_RESULT Seg_Tri2_3_Res ; SEGMENT_SEGMENT_RESULT Seg_Tri3_1_Res ; - float TriPos_SegPos1_2_t ; - VECTOR Seg_TriPos ; - float Seg_TriPos_TriPos1_w ; - float Seg_TriPos_TriPos2_w ; - float Seg_TriPos_TriPos3_w ; VectorSub( &Seg1_2, SegmentPos2, SegmentPos1 ) ; VectorSub( &Tri1_2, TrianglePos2, TrianglePos1 ) ; @@ -3742,10 +3740,10 @@ extern int Segment_Triangle_Analyse( const VECTOR *SegmentPos1, const VECTOR *Se // 三角形が示す平面状に頂点を投影する VectorSub( &Tri1_Seg1, SegmentPos1, TrianglePos1 ) ; - Seg1_TriProSeg1_Dist = VectorInnerProduct( &Tri1_Seg1, &TriNorm ) ; - VectorScale( &tv, &TriNorm, Seg1_TriProSeg1_Dist ) ; + Seg1_TriProSeg1_DistBase = VectorInnerProduct( &Tri1_Seg1, &TriNorm ) ; + VectorScale( &tv, &TriNorm, Seg1_TriProSeg1_DistBase ) ; VectorSub( &Seg1_TriPro, SegmentPos1, &tv ) ; - if( Seg1_TriProSeg1_Dist < 0.0f ) Seg1_TriProSeg1_Dist = -Seg1_TriProSeg1_Dist ; + Seg1_TriProSeg1_Dist = Seg1_TriProSeg1_DistBase < 0.0f ? -Seg1_TriProSeg1_DistBase : Seg1_TriProSeg1_DistBase ; // NS_DrawCube3D( Seg1_TriPro.x - 10.0f, Seg1_TriPro.y - 10.0f, Seg1_TriPro.z - 10.0f, @@ -3757,48 +3755,62 @@ extern int Segment_Triangle_Analyse( const VECTOR *SegmentPos1, const VECTOR *Se // 三角形が示す平面状に頂点を投影する VectorSub( &Tri1_Seg2, SegmentPos2, TrianglePos1 ) ; - Seg2_TriProSeg2_Dist = VectorInnerProduct( &Tri1_Seg2, &TriNorm ) ; - VectorScale( &tv, &TriNorm, Seg2_TriProSeg2_Dist ) ; + Seg2_TriProSeg2_DistBase = VectorInnerProduct( &Tri1_Seg2, &TriNorm ) ; + VectorScale( &tv, &TriNorm, Seg2_TriProSeg2_DistBase ) ; VectorSub( &Seg2_TriPro, SegmentPos2, &tv ) ; - if( Seg2_TriProSeg2_Dist < 0.0f ) Seg2_TriProSeg2_Dist = -Seg2_TriProSeg2_Dist ; + Seg2_TriProSeg2_Dist = Seg2_TriProSeg2_DistBase < 0.0f ? -Seg2_TriProSeg2_DistBase : Seg2_TriProSeg2_DistBase ; // 三角形内に頂点が存在するかどうかを調べる TriangleBarycenter_Base( TrianglePos1, TrianglePos2, TrianglePos3, &Seg2_TriPro, &Seg2_TriPro_w1, &Seg2_TriPro_w2, &Seg2_TriPro_w3 ) ; Project2 = Seg2_TriPro_w1 >= 0.0f && Seg2_TriPro_w1 <= 1.0f && Seg2_TriPro_w2 >= 0.0f && Seg2_TriPro_w2 <= 1.0f && Seg2_TriPro_w3 >= 0.0f && Seg2_TriPro_w3 <= 1.0f ; - // 三角形が表す平面と線分との接点と重心を算出する - TriPos_SegPos1_2_t = Seg1_TriProSeg1_Dist / ( Seg1_TriProSeg1_Dist + Seg2_TriProSeg2_Dist ) ; - VectorScale( &Seg_TriPos, &Seg1_2, TriPos_SegPos1_2_t ) ; - VectorAdd( &Seg_TriPos, &Seg_TriPos, SegmentPos1 ) ; + // 三角形と線分が交差又は接している可能性がある場合は分岐 + if( ( Seg1_TriProSeg1_Dist >= 0.00000001f || Seg2_TriProSeg2_Dist >= 0.00000001f ) && + ( Seg1_TriProSeg1_Dist < 0.00000001f || Seg2_TriProSeg2_Dist < 0.00000001f || + ( Seg1_TriProSeg1_DistBase > 0.0f && Seg2_TriProSeg2_DistBase < 0.0f ) || + ( Seg1_TriProSeg1_DistBase < 0.0f && Seg2_TriProSeg2_DistBase > 0.0f ) ) ) + { + float Seg_TriPos_TriPos1_w ; + float Seg_TriPos_TriPos2_w ; + float Seg_TriPos_TriPos3_w ; + VECTOR Seg_TriPos ; + float TriPos_SegPos1_2_t ; - TriangleBarycenter_Base( TrianglePos1, TrianglePos2, TrianglePos3, &Seg_TriPos, - &Seg_TriPos_TriPos1_w, &Seg_TriPos_TriPos2_w, &Seg_TriPos_TriPos3_w ) ; + // 三角形が表す平面と線分との接点と重心を算出する + TriPos_SegPos1_2_t = Seg1_TriProSeg1_Dist / ( Seg1_TriProSeg1_Dist + Seg2_TriProSeg2_Dist ) ; + VectorScale( &Seg_TriPos, &Seg1_2, TriPos_SegPos1_2_t ) ; + VectorAdd( &Seg_TriPos, &Seg_TriPos, SegmentPos1 ) ; + TriangleBarycenter_Base( TrianglePos1, TrianglePos2, TrianglePos3, &Seg_TriPos, + &Seg_TriPos_TriPos1_w, &Seg_TriPos_TriPos2_w, &Seg_TriPos_TriPos3_w ) ; - // 線分と三角形が接しているかチェック - if( Seg_TriPos_TriPos1_w >= 0.0f && Seg_TriPos_TriPos1_w <= 1.0f && - Seg_TriPos_TriPos2_w >= 0.0f && Seg_TriPos_TriPos2_w <= 1.0f && - Seg_TriPos_TriPos3_w >= 0.0f && Seg_TriPos_TriPos3_w <= 1.0f ) - { - Result->Seg_Tri_MinDist_Square = 0.0f ; - Result->Seg_MinDist_Pos1_Pos2_t = TriPos_SegPos1_2_t ; - Result->Seg_MinDist_Pos = Seg_TriPos ; + // 線分と三角形が接しているかチェック + if( Seg_TriPos_TriPos1_w >= 0.0f && Seg_TriPos_TriPos1_w <= 1.0f && + Seg_TriPos_TriPos2_w >= 0.0f && Seg_TriPos_TriPos2_w <= 1.0f && + Seg_TriPos_TriPos3_w >= 0.0f && Seg_TriPos_TriPos3_w <= 1.0f ) + { + Result->Seg_Tri_MinDist_Square = 0.0f ; - Result->Tri_MinDist_Pos1_w = Seg_TriPos_TriPos1_w ; - Result->Tri_MinDist_Pos2_w = Seg_TriPos_TriPos2_w ; - Result->Tri_MinDist_Pos3_w = Seg_TriPos_TriPos3_w ; + Result->Seg_MinDist_Pos1_Pos2_t = TriPos_SegPos1_2_t ; + Result->Seg_MinDist_Pos = Seg_TriPos ; - Result->Tri_MinDist_Pos = Result->Seg_MinDist_Pos ; - return 0 ; + Result->Tri_MinDist_Pos1_w = Seg_TriPos_TriPos1_w ; + Result->Tri_MinDist_Pos2_w = Seg_TriPos_TriPos2_w ; + Result->Tri_MinDist_Pos3_w = Seg_TriPos_TriPos3_w ; + + Result->Tri_MinDist_Pos = Result->Seg_MinDist_Pos ; + return 0 ; + } } // どちらも三角形の範囲にあった場合 if( Project1 && Project2 ) { // 片方の側にどちらの頂点もある場合は、より近いほうの頂点と平面との距離を結果にする - if( Seg1_TriProSeg1_Dist < Seg2_TriProSeg2_Dist ) + if( Seg1_TriProSeg1_Dist < Seg2_TriProSeg2_Dist || + Seg1_TriProSeg1_Dist == Seg2_TriProSeg2_Dist ) { Result->Seg_Tri_MinDist_Square = Seg1_TriProSeg1_Dist * Seg1_TriProSeg1_Dist ; Result->Seg_MinDist_Pos1_Pos2_t = 0.0f ; @@ -3821,32 +3833,85 @@ extern int Segment_Triangle_Analyse( const VECTOR *SegmentPos1, const VECTOR *Se return 0 ; } + // 線分が三角形と同一平面上にあった場合で、且つ線分の始点が三角形の範囲にある場合は始点を接触点とする + if( Seg1_TriProSeg1_Dist < 0.00000001f && Seg2_TriProSeg2_Dist < 0.00000001f && Project1 ) + { + Result->Seg_Tri_MinDist_Square = 0.0f ; + Result->Seg_MinDist_Pos1_Pos2_t = 0.0f ; + Result->Seg_MinDist_Pos = *SegmentPos1 ; + Result->Tri_MinDist_Pos1_w = Seg1_TriPro_w1 ; + Result->Tri_MinDist_Pos2_w = Seg1_TriPro_w2 ; + Result->Tri_MinDist_Pos3_w = Seg1_TriPro_w3 ; + Result->Tri_MinDist_Pos = Seg1_TriPro ; + return 0 ; + } + // そうではない場合は三角形の3辺と線分の距離を測り、一番距離が短い辺を探す Segment_Segment_Analyse( SegmentPos1, SegmentPos2, TrianglePos1, TrianglePos2, &Seg_Tri1_2_Res ) ; Segment_Segment_Analyse( SegmentPos1, SegmentPos2, TrianglePos2, TrianglePos3, &Seg_Tri2_3_Res ) ; Segment_Segment_Analyse( SegmentPos1, SegmentPos2, TrianglePos3, TrianglePos1, &Seg_Tri3_1_Res ) ; - MinLen = Seg_Tri1_2_Res.SegA_SegB_MinDist_Square ; - MinType = 0 ; - if( Seg_Tri2_3_Res.SegA_SegB_MinDist_Square < MinLen ) + ZeroLenCount = 0 ; + if( Seg_Tri1_2_Res.SegA_SegB_MinDist_Square < 0.00000001f ) { - MinType = 1 ; - MinLen = Seg_Tri2_3_Res.SegA_SegB_MinDist_Square ; + ZeroLenCount ++ ; } - if( Seg_Tri3_1_Res.SegA_SegB_MinDist_Square < MinLen ) + if( Seg_Tri2_3_Res.SegA_SegB_MinDist_Square < 0.00000001f ) { - MinType = 2 ; - MinLen = Seg_Tri3_1_Res.SegA_SegB_MinDist_Square ; + ZeroLenCount ++ ; } - if( Project1 && Seg1_TriProSeg1_Dist * Seg1_TriProSeg1_Dist < MinLen ) + if( Seg_Tri3_1_Res.SegA_SegB_MinDist_Square < 0.00000001f ) { - MinType = 3 ; - MinLen = Seg1_TriProSeg1_Dist * Seg1_TriProSeg1_Dist ; + ZeroLenCount ++ ; } - if( Project2 && Seg2_TriProSeg2_Dist * Seg2_TriProSeg2_Dist < MinLen ) + if( ZeroLenCount >= 1 ) { - MinType = 4 ; - MinLen = Seg2_TriProSeg2_Dist * Seg2_TriProSeg2_Dist ; + MinLen = 0.0f ; + MinType = -1 ; + if( Seg_Tri1_2_Res.SegA_SegB_MinDist_Square < 0.00000001f && + ( MinType < 0 || MinLen > Seg_Tri1_2_Res.SegA_MinDist_Pos1_Pos2_t ) ) + { + MinLen = Seg_Tri1_2_Res.SegA_MinDist_Pos1_Pos2_t ; + MinType = 0 ; + } + if( Seg_Tri2_3_Res.SegA_SegB_MinDist_Square < 0.00000001f && + ( MinType < 0 || MinLen > Seg_Tri2_3_Res.SegA_MinDist_Pos1_Pos2_t ) ) + { + MinLen = Seg_Tri2_3_Res.SegA_MinDist_Pos1_Pos2_t ; + MinType = 1 ; + } + if( Seg_Tri3_1_Res.SegA_SegB_MinDist_Square < 0.00000001f && + ( MinType < 0 || MinLen > Seg_Tri3_1_Res.SegA_MinDist_Pos1_Pos2_t ) ) + { + MinLen = Seg_Tri3_1_Res.SegA_MinDist_Pos1_Pos2_t ; + MinType = 2 ; + } + MinLen = 0.0f ; + } + else + { + MinLen = Seg_Tri1_2_Res.SegA_SegB_MinDist_Square ; + MinType = 0 ; + if( Seg_Tri2_3_Res.SegA_SegB_MinDist_Square < MinLen ) + { + MinType = 1 ; + MinLen = Seg_Tri2_3_Res.SegA_SegB_MinDist_Square ; + } + if( Seg_Tri3_1_Res.SegA_SegB_MinDist_Square < MinLen ) + { + MinType = 2 ; + MinLen = Seg_Tri3_1_Res.SegA_SegB_MinDist_Square ; + } + if( Project1 && Seg1_TriProSeg1_Dist * Seg1_TriProSeg1_Dist < MinLen ) + { + MinType = 3 ; + MinLen = Seg1_TriProSeg1_Dist * Seg1_TriProSeg1_Dist ; + } + if( Project2 && Seg2_TriProSeg2_Dist * Seg2_TriProSeg2_Dist < MinLen ) + { + MinType = 4 ; + MinLen = Seg2_TriProSeg2_Dist * Seg2_TriProSeg2_Dist ; + } } Result->Seg_Tri_MinDist_Square = MinLen ; @@ -3921,16 +3986,14 @@ extern int Segment_Triangle_AnalyseD( const VECTOR_D *SegmentPos1, const VECTOR_ VECTOR_D Tri1_2, Tri1_3 ; double Seg1_TriProSeg1_Dist = 0.0 ; double Seg2_TriProSeg2_Dist = 0.0 ; + double Seg1_TriProSeg1_DistBase = 0.0 ; + double Seg2_TriProSeg2_DistBase = 0.0 ; int MinType ; double MinLen ; + int ZeroLenCount ; SEGMENT_SEGMENT_RESULT_D Seg_Tri1_2_Res ; SEGMENT_SEGMENT_RESULT_D Seg_Tri2_3_Res ; SEGMENT_SEGMENT_RESULT_D Seg_Tri3_1_Res ; - double TriPos_SegPos1_2_t ; - VECTOR_D Seg_TriPos ; - double Seg_TriPos_TriPos1_w ; - double Seg_TriPos_TriPos2_w ; - double Seg_TriPos_TriPos3_w ; VectorSubD( &Seg1_2, SegmentPos2, SegmentPos1 ) ; VectorSubD( &Tri1_2, TrianglePos2, TrianglePos1 ) ; @@ -3940,10 +4003,10 @@ extern int Segment_Triangle_AnalyseD( const VECTOR_D *SegmentPos1, const VECTOR_ // 三角形が示す平面状に頂点を投影する VectorSubD( &Tri1_Seg1, SegmentPos1, TrianglePos1 ) ; - Seg1_TriProSeg1_Dist = VectorInnerProductD( &Tri1_Seg1, &TriNorm ) ; - VectorScaleD( &tv, &TriNorm, Seg1_TriProSeg1_Dist ) ; + Seg1_TriProSeg1_DistBase = VectorInnerProductD( &Tri1_Seg1, &TriNorm ) ; + VectorScaleD( &tv, &TriNorm, Seg1_TriProSeg1_DistBase ) ; VectorSubD( &Seg1_TriPro, SegmentPos1, &tv ) ; - if( Seg1_TriProSeg1_Dist < 0.0 ) Seg1_TriProSeg1_Dist = -Seg1_TriProSeg1_Dist ; + Seg1_TriProSeg1_Dist = Seg1_TriProSeg1_DistBase < 0.0 ? -Seg1_TriProSeg1_DistBase : Seg1_TriProSeg1_DistBase ; // 三角形内に頂点が存在するかどうかを調べる @@ -3952,41 +4015,54 @@ extern int Segment_Triangle_AnalyseD( const VECTOR_D *SegmentPos1, const VECTOR_ // 三角形が示す平面状に頂点を投影する VectorSubD( &Tri1_Seg2, SegmentPos2, TrianglePos1 ) ; - Seg2_TriProSeg2_Dist = VectorInnerProductD( &Tri1_Seg2, &TriNorm ) ; - VectorScaleD( &tv, &TriNorm, Seg2_TriProSeg2_Dist ) ; + Seg2_TriProSeg2_DistBase = VectorInnerProductD( &Tri1_Seg2, &TriNorm ) ; + VectorScaleD( &tv, &TriNorm, Seg2_TriProSeg2_DistBase ) ; VectorSubD( &Seg2_TriPro, SegmentPos2, &tv ) ; - if( Seg2_TriProSeg2_Dist < 0.0 ) Seg2_TriProSeg2_Dist = -Seg2_TriProSeg2_Dist ; + Seg2_TriProSeg2_Dist = Seg2_TriProSeg2_DistBase < 0.0 ? -Seg2_TriProSeg2_DistBase : Seg2_TriProSeg2_DistBase ; // 三角形内に頂点が存在するかどうかを調べる TriangleBarycenter_BaseD( TrianglePos1, TrianglePos2, TrianglePos3, &Seg2_TriPro, &Seg2_TriPro_w1, &Seg2_TriPro_w2, &Seg2_TriPro_w3 ) ; Project2 = Seg2_TriPro_w1 >= 0.0 && Seg2_TriPro_w1 <= 1.0 && Seg2_TriPro_w2 >= 0.0 && Seg2_TriPro_w2 <= 1.0 && Seg2_TriPro_w3 >= 0.0 && Seg2_TriPro_w3 <= 1.0 ; - // 三角形が表す平面と線分との接点と重心を算出する - TriPos_SegPos1_2_t = Seg1_TriProSeg1_Dist / ( Seg1_TriProSeg1_Dist + Seg2_TriProSeg2_Dist ) ; - VectorScaleD( &Seg_TriPos, &Seg1_2, TriPos_SegPos1_2_t ) ; - VectorAddD( &Seg_TriPos, &Seg_TriPos, SegmentPos1 ) ; + // 三角形と線分が交差又は接している可能性がある場合は分岐 + if( ( Seg1_TriProSeg1_Dist >= 0.00000001 || Seg2_TriProSeg2_Dist >= 0.00000001 ) && + ( Seg1_TriProSeg1_Dist < 0.00000001 || Seg2_TriProSeg2_Dist < 0.00000001 || + ( Seg1_TriProSeg1_DistBase > 0.0 && Seg2_TriProSeg2_DistBase < 0.0 ) || + ( Seg1_TriProSeg1_DistBase < 0.0 && Seg2_TriProSeg2_DistBase > 0.0 ) ) ) + { + double Seg_TriPos_TriPos1_w ; + double Seg_TriPos_TriPos2_w ; + double Seg_TriPos_TriPos3_w ; + VECTOR_D Seg_TriPos ; + double TriPos_SegPos1_2_t ; - TriangleBarycenter_BaseD( TrianglePos1, TrianglePos2, TrianglePos3, &Seg_TriPos, - &Seg_TriPos_TriPos1_w, &Seg_TriPos_TriPos2_w, &Seg_TriPos_TriPos3_w ) ; + // 三角形が表す平面と線分との接点と重心を算出する + TriPos_SegPos1_2_t = Seg1_TriProSeg1_Dist / ( Seg1_TriProSeg1_Dist + Seg2_TriProSeg2_Dist ) ; + VectorScaleD( &Seg_TriPos, &Seg1_2, TriPos_SegPos1_2_t ) ; + VectorAddD( &Seg_TriPos, &Seg_TriPos, SegmentPos1 ) ; + TriangleBarycenter_BaseD( TrianglePos1, TrianglePos2, TrianglePos3, &Seg_TriPos, + &Seg_TriPos_TriPos1_w, &Seg_TriPos_TriPos2_w, &Seg_TriPos_TriPos3_w ) ; - // 線分と三角形が接しているかチェック - if( Seg_TriPos_TriPos1_w >= 0.0 && Seg_TriPos_TriPos1_w <= 1.0 && - Seg_TriPos_TriPos2_w >= 0.0 && Seg_TriPos_TriPos2_w <= 1.0 && - Seg_TriPos_TriPos3_w >= 0.0 && Seg_TriPos_TriPos3_w <= 1.0 ) - { - Result->Seg_Tri_MinDist_Square = 0.0 ; - Result->Seg_MinDist_Pos1_Pos2_t = TriPos_SegPos1_2_t ; - Result->Seg_MinDist_Pos = Seg_TriPos ; + // 線分と三角形が接しているかチェック + if( Seg_TriPos_TriPos1_w >= 0.0 && Seg_TriPos_TriPos1_w <= 1.0 && + Seg_TriPos_TriPos2_w >= 0.0 && Seg_TriPos_TriPos2_w <= 1.0 && + Seg_TriPos_TriPos3_w >= 0.0 && Seg_TriPos_TriPos3_w <= 1.0 ) + { + Result->Seg_Tri_MinDist_Square = 0.0 ; - Result->Tri_MinDist_Pos1_w = Seg_TriPos_TriPos1_w ; - Result->Tri_MinDist_Pos2_w = Seg_TriPos_TriPos2_w ; - Result->Tri_MinDist_Pos3_w = Seg_TriPos_TriPos3_w ; + Result->Seg_MinDist_Pos1_Pos2_t = TriPos_SegPos1_2_t ; + Result->Seg_MinDist_Pos = Seg_TriPos ; - Result->Tri_MinDist_Pos = Result->Seg_MinDist_Pos ; - return 0 ; + Result->Tri_MinDist_Pos1_w = Seg_TriPos_TriPos1_w ; + Result->Tri_MinDist_Pos2_w = Seg_TriPos_TriPos2_w ; + Result->Tri_MinDist_Pos3_w = Seg_TriPos_TriPos3_w ; + + Result->Tri_MinDist_Pos = Result->Seg_MinDist_Pos ; + return 0 ; + } } // どちらも三角形の範囲にあった場合 @@ -4016,32 +4092,85 @@ extern int Segment_Triangle_AnalyseD( const VECTOR_D *SegmentPos1, const VECTOR_ return 0 ; } + // 線分が三角形と同一平面上にあった場合で、且つ線分の始点が三角形の範囲にある場合は始点を接触点とする + if( Seg1_TriProSeg1_Dist < 0.00000001 && Seg2_TriProSeg2_Dist < 0.00000001 && Project1 ) + { + Result->Seg_Tri_MinDist_Square = 0.0f ; + Result->Seg_MinDist_Pos1_Pos2_t = 0.0f ; + Result->Seg_MinDist_Pos = *SegmentPos1 ; + Result->Tri_MinDist_Pos1_w = Seg1_TriPro_w1 ; + Result->Tri_MinDist_Pos2_w = Seg1_TriPro_w2 ; + Result->Tri_MinDist_Pos3_w = Seg1_TriPro_w3 ; + Result->Tri_MinDist_Pos = Seg1_TriPro ; + return 0 ; + } + // そうではない場合は三角形の3辺と線分の距離を測り、一番距離が短い辺を探す Segment_Segment_AnalyseD( SegmentPos1, SegmentPos2, TrianglePos1, TrianglePos2, &Seg_Tri1_2_Res ) ; Segment_Segment_AnalyseD( SegmentPos1, SegmentPos2, TrianglePos2, TrianglePos3, &Seg_Tri2_3_Res ) ; Segment_Segment_AnalyseD( SegmentPos1, SegmentPos2, TrianglePos3, TrianglePos1, &Seg_Tri3_1_Res ) ; - MinLen = Seg_Tri1_2_Res.SegA_SegB_MinDist_Square ; - MinType = 0 ; - if( Seg_Tri2_3_Res.SegA_SegB_MinDist_Square < MinLen ) + ZeroLenCount = 0 ; + if( Seg_Tri1_2_Res.SegA_SegB_MinDist_Square < 0.00000001 ) { - MinType = 1 ; - MinLen = Seg_Tri2_3_Res.SegA_SegB_MinDist_Square ; + ZeroLenCount ++ ; } - if( Seg_Tri3_1_Res.SegA_SegB_MinDist_Square < MinLen ) + if( Seg_Tri2_3_Res.SegA_SegB_MinDist_Square < 0.00000001 ) { - MinType = 2 ; - MinLen = Seg_Tri3_1_Res.SegA_SegB_MinDist_Square ; + ZeroLenCount ++ ; } - if( Project1 && Seg1_TriProSeg1_Dist * Seg1_TriProSeg1_Dist < MinLen ) + if( Seg_Tri3_1_Res.SegA_SegB_MinDist_Square < 0.00000001 ) { - MinType = 3 ; - MinLen = Seg1_TriProSeg1_Dist * Seg1_TriProSeg1_Dist ; + ZeroLenCount ++ ; } - if( Project2 && Seg2_TriProSeg2_Dist * Seg2_TriProSeg2_Dist < MinLen ) + if( ZeroLenCount >= 1 ) { - MinType = 4 ; - MinLen = Seg2_TriProSeg2_Dist * Seg2_TriProSeg2_Dist ; + MinLen = 0.0f ; + MinType = -1 ; + if( Seg_Tri1_2_Res.SegA_SegB_MinDist_Square < 0.00000001 && + ( MinType < 0 || MinLen > Seg_Tri1_2_Res.SegA_MinDist_Pos1_Pos2_t ) ) + { + MinLen = Seg_Tri1_2_Res.SegA_MinDist_Pos1_Pos2_t ; + MinType = 0 ; + } + if( Seg_Tri2_3_Res.SegA_SegB_MinDist_Square < 0.00000001 && + ( MinType < 0 || MinLen > Seg_Tri2_3_Res.SegA_MinDist_Pos1_Pos2_t ) ) + { + MinLen = Seg_Tri2_3_Res.SegA_MinDist_Pos1_Pos2_t ; + MinType = 1 ; + } + if( Seg_Tri3_1_Res.SegA_SegB_MinDist_Square < 0.00000001 && + ( MinType < 0 || MinLen > Seg_Tri3_1_Res.SegA_MinDist_Pos1_Pos2_t ) ) + { + MinLen = Seg_Tri3_1_Res.SegA_MinDist_Pos1_Pos2_t ; + MinType = 2 ; + } + MinLen = 0.0f ; + } + else + { + MinLen = Seg_Tri1_2_Res.SegA_SegB_MinDist_Square ; + MinType = 0 ; + if( Seg_Tri2_3_Res.SegA_SegB_MinDist_Square < MinLen ) + { + MinType = 1 ; + MinLen = Seg_Tri2_3_Res.SegA_SegB_MinDist_Square ; + } + if( Seg_Tri3_1_Res.SegA_SegB_MinDist_Square < MinLen ) + { + MinType = 2 ; + MinLen = Seg_Tri3_1_Res.SegA_SegB_MinDist_Square ; + } + if( Project1 && Seg1_TriProSeg1_Dist * Seg1_TriProSeg1_Dist < MinLen ) + { + MinType = 3 ; + MinLen = Seg1_TriProSeg1_Dist * Seg1_TriProSeg1_Dist ; + } + if( Project2 && Seg2_TriProSeg2_Dist * Seg2_TriProSeg2_Dist < MinLen ) + { + MinType = 4 ; + MinLen = Seg2_TriProSeg2_Dist * Seg2_TriProSeg2_Dist ; + } } Result->Seg_Tri_MinDist_Square = MinLen ; @@ -4688,7 +4817,7 @@ extern double Segment_Triangle_MinLengthD( VECTOR_D SegmentPos1, VECTOR_D Segmen } // 線分と三角形の最近点間の距離の二乗を得る -extern float Segment_Triangle_MinLength_Square( VECTOR SegmentPos1, VECTOR SegmentPos2, VECTOR TrianglePos1, VECTOR TrianglePos2, VECTOR TrianglePos3 ) +extern float Segment_Triangle_MinLength_Square_Base( VECTOR SegmentPos1, VECTOR SegmentPos2, VECTOR TrianglePos1, VECTOR TrianglePos2, VECTOR TrianglePos3, int *IsZeroLength ) { bool Touei1, Touei2 ; VECTOR st1, st2 ; @@ -4702,10 +4831,19 @@ extern float Segment_Triangle_MinLength_Square( VECTOR SegmentPos1, VECTOR Segme float MinLen ; HITRESULT_LINE HitResult ; + if( IsZeroLength != NULL ) + { + *IsZeroLength = FALSE ; + } + // 線分が三角形を貫いていたら距離は0 - HitResult = HitCheck_Line_Triangle( SegmentPos1, SegmentPos2, TrianglePos1, TrianglePos2, TrianglePos3 ) ; + HitCheck_Line_Triangle_Base( &HitResult, SegmentPos1, SegmentPos2, TrianglePos1, TrianglePos2, TrianglePos3, NULL, NULL, NULL, TRUE ) ; if( HitResult.HitFlag ) { + if( IsZeroLength != NULL ) + { + *IsZeroLength = TRUE ; + } return 0.0f ; } @@ -4770,6 +4908,10 @@ extern float Segment_Triangle_MinLength_Square( VECTOR SegmentPos1, VECTOR Segme else { // 各頂点が前後にある場合は接しているということ + if( IsZeroLength != NULL ) + { + *IsZeroLength = TRUE ; + } return 0.0f ; } } @@ -4801,7 +4943,13 @@ extern float Segment_Triangle_MinLength_Square( VECTOR SegmentPos1, VECTOR Segme } // 線分と三角形の最近点間の距離の二乗を得る -extern double Segment_Triangle_MinLength_SquareD( VECTOR_D SegmentPos1, VECTOR_D SegmentPos2, VECTOR_D TrianglePos1, VECTOR_D TrianglePos2, VECTOR_D TrianglePos3 ) +extern float Segment_Triangle_MinLength_Square( VECTOR SegmentPos1, VECTOR SegmentPos2, VECTOR TrianglePos1, VECTOR TrianglePos2, VECTOR TrianglePos3 ) +{ + return Segment_Triangle_MinLength_Square_Base( SegmentPos1, SegmentPos2, TrianglePos1, TrianglePos2, TrianglePos3, NULL ) ; +} + +// 線分と三角形の最近点間の距離の二乗を得る +extern double Segment_Triangle_MinLength_SquareD_Base( VECTOR_D SegmentPos1, VECTOR_D SegmentPos2, VECTOR_D TrianglePos1, VECTOR_D TrianglePos2, VECTOR_D TrianglePos3, int *IsZeroLength ) { bool Touei1, Touei2 ; VECTOR_D st1, st2 ; @@ -4815,10 +4963,19 @@ extern double Segment_Triangle_MinLength_SquareD( VECTOR_D SegmentPos1, VECTOR_D double MinLen ; HITRESULT_LINE_D HitResult ; + if( IsZeroLength != NULL ) + { + *IsZeroLength = FALSE ; + } + // 線分が三角形を貫いていたら距離は0 - HitResult = HitCheck_Line_TriangleD( SegmentPos1, SegmentPos2, TrianglePos1, TrianglePos2, TrianglePos3 ) ; + HitCheck_Line_TriangleD_Base( &HitResult, SegmentPos1, SegmentPos2, TrianglePos1, TrianglePos2, TrianglePos3, NULL, NULL, NULL, TRUE ) ; if( HitResult.HitFlag ) { + if( IsZeroLength != NULL ) + { + *IsZeroLength = TRUE ; + } return 0.0 ; } @@ -4880,6 +5037,10 @@ extern double Segment_Triangle_MinLength_SquareD( VECTOR_D SegmentPos1, VECTOR_D else { // 各頂点が前後にある場合は接しているということ + if( IsZeroLength != NULL ) + { + *IsZeroLength = TRUE ; + } return 0.0 ; } } @@ -4910,6 +5071,12 @@ extern double Segment_Triangle_MinLength_SquareD( VECTOR_D SegmentPos1, VECTOR_D return MinLen ; } +// 線分と三角形の最近点間の距離の二乗を得る +extern double Segment_Triangle_MinLength_SquareD( VECTOR_D SegmentPos1, VECTOR_D SegmentPos2, VECTOR_D TrianglePos1, VECTOR_D TrianglePos2, VECTOR_D TrianglePos3 ) +{ + return Segment_Triangle_MinLength_SquareD_Base( SegmentPos1, SegmentPos2, TrianglePos1, TrianglePos2, TrianglePos3, NULL ) ; +} + // 線分と点の一番近い距離を得る extern float Segment_Point_MinLength( VECTOR SegmentPos1, VECTOR SegmentPos2, VECTOR PointPos ) { @@ -5179,11 +5346,12 @@ extern double Triangle_Triangle_MinLength_SquareD( VECTOR_D Triangle1Pos1, VECTO // 三角形と線の当たり判定 extern void HitCheck_Line_Triangle_Base( HITRESULT_LINE *Result, VECTOR LinePos1, VECTOR LinePos2, VECTOR TrianglePos1, VECTOR TrianglePos2, VECTOR TrianglePos3, - float *TrianglePos1Weight, float *TrianglePos2Weight, float *TrianglePos3Weight ) + float *TrianglePos1Weight, float *TrianglePos2Weight, float *TrianglePos3Weight, int IsSimpleCheck ) { VECTOR LineL1L2, LineL1T1, LineL1T2, LineL1T3, OP ; VECTOR LineL1C, LineL2C ; float u, v, w, totalr ; + int Process = 0 ; Result->HitFlag = 0 ; @@ -5201,122 +5369,228 @@ extern void HitCheck_Line_Triangle_Base( VectorOuterProduct( &OP, &LineL1L2, &LineL1T1 ) ; w = VectorInnerProduct( &OP, &LineL1T2 ) ; - if( ( ( u < 0.0f || v < 0.0f || w < 0.0f ) && - ( u > 0.0f || v > 0.0f || w > 0.0f ) ) || - ( u < 0.0000001f && u > -0.0000001f && - v < 0.0000001f && v > -0.0000001f && - w < 0.0000001f && w > -0.0000001f ) ) - return ; - - totalr = 1.0f / ( u + v + w ) ; - u *= totalr ; - v *= totalr ; - w *= totalr ; - Result->Position.x = TrianglePos1.x * u + TrianglePos2.x * v + TrianglePos3.x * w ; - Result->Position.y = TrianglePos1.y * u + TrianglePos2.y * v + TrianglePos3.y * w ; - Result->Position.z = TrianglePos1.z * u + TrianglePos2.z * v + TrianglePos3.z * w ; - - VectorSub( &LineL1C, &LinePos1, &Result->Position ) ; - VectorSub( &LineL2C, &LinePos2, &Result->Position ) ; - if( VectorInnerProduct( &LineL1C, &LineL2C ) <= 0.0f ) + if( !( ( ( u < 0.0f || v < 0.0f || w < 0.0f ) && + ( u > 0.0f || v > 0.0f || w > 0.0f ) ) || + ( u < 0.0000001f && u > -0.0000001f && + v < 0.0000001f && v > -0.0000001f && + w < 0.0000001f && w > -0.0000001f ) ) ) { - Result->HitFlag = 1 ; + totalr = 1.0f / ( u + v + w ) ; + u *= totalr ; + v *= totalr ; + w *= totalr ; + Result->Position.x = TrianglePos1.x * u + TrianglePos2.x * v + TrianglePos3.x * w ; + Result->Position.y = TrianglePos1.y * u + TrianglePos2.y * v + TrianglePos3.y * w ; + Result->Position.z = TrianglePos1.z * u + TrianglePos2.z * v + TrianglePos3.z * w ; + + VectorSub( &LineL1C, &LinePos1, &Result->Position ) ; + VectorSub( &LineL2C, &LinePos2, &Result->Position ) ; + if( VectorInnerProduct( &LineL1C, &LineL2C ) <= 0.0f ) + { + Process = 1 ; + Result->HitFlag = 1 ; + } } if( TrianglePos1Weight ) *TrianglePos1Weight = u ; if( TrianglePos2Weight ) *TrianglePos2Weight = v ; if( TrianglePos3Weight ) *TrianglePos3Weight = w ; -} -// 三角形と線の当たり判定 -extern HITRESULT_LINE HitCheck_Line_Triangle( VECTOR LinePos1, VECTOR LinePos2, VECTOR TrianglePos1, VECTOR TrianglePos2, VECTOR TrianglePos3 ) -{ - HITRESULT_LINE Result ; + if( Process == 0 && IsSimpleCheck == FALSE ) + { + bool Project1, Project2 ; + VECTOR Seg1_TriPro ; + VECTOR Seg2_TriPro ; + float Seg1_TriPro_w1 ; + float Seg1_TriPro_w2 ; + float Seg1_TriPro_w3 ; + float Seg2_TriPro_w1 ; + float Seg2_TriPro_w2 ; + float Seg2_TriPro_w3 ; + VECTOR Seg1_2 ; + VECTOR Tri1_Seg1 ; + VECTOR Tri1_Seg2 ; + VECTOR TriNorm ; + VECTOR tv ; + VECTOR Tri1_2, Tri1_3 ; + float Seg1_TriProSeg1_Dist = 0.0f ; + float Seg2_TriProSeg2_Dist = 0.0f ; + float Seg1_TriProSeg1_DistBase = 0.0f ; + float Seg2_TriProSeg2_DistBase = 0.0f ; + float MinLen ; + SEGMENT_SEGMENT_RESULT Seg_Tri1_2_Res ; + SEGMENT_SEGMENT_RESULT Seg_Tri2_3_Res ; + SEGMENT_SEGMENT_RESULT Seg_Tri3_1_Res ; + + VectorSub( &Seg1_2, &LinePos2, &LinePos1 ) ; + VectorSub( &Tri1_2, &TrianglePos2, &TrianglePos1 ) ; + VectorSub( &Tri1_3, &TrianglePos3, &TrianglePos1 ) ; + VectorOuterProduct( &TriNorm, &Tri1_2, &Tri1_3 ) ; + VectorNormalize( &TriNorm, &TriNorm ) ; + + // 三角形が示す平面状に頂点を投影する + VectorSub( &Tri1_Seg1, &LinePos1, &TrianglePos1 ) ; + Seg1_TriProSeg1_DistBase = VectorInnerProduct( &Tri1_Seg1, &TriNorm ) ; + VectorScale( &tv, &TriNorm, Seg1_TriProSeg1_DistBase ) ; + VectorSub( &Seg1_TriPro, &LinePos1, &tv ) ; + Seg1_TriProSeg1_Dist = Seg1_TriProSeg1_DistBase < 0.0f ? -Seg1_TriProSeg1_DistBase : Seg1_TriProSeg1_DistBase ; + - HitCheck_Line_Triangle_Base( &Result, LinePos1, LinePos2, TrianglePos1, TrianglePos2, TrianglePos3, NULL, NULL, NULL ) ; + // 三角形内に頂点が存在するかどうかを調べる + TriangleBarycenter_Base( &TrianglePos1, &TrianglePos2, &TrianglePos3, &Seg1_TriPro, &Seg1_TriPro_w1, &Seg1_TriPro_w2, &Seg1_TriPro_w3 ) ; + Project1 = Seg1_TriPro_w1 >= 0.0f && Seg1_TriPro_w1 <= 1.0f && Seg1_TriPro_w2 >= 0.0f && Seg1_TriPro_w2 <= 1.0f && Seg1_TriPro_w3 >= 0.0f && Seg1_TriPro_w3 <= 1.0f ; -/* - if( TriangleHit1_2T || TriangleHit1_3T ) - { - VECTOR LineT1T2 ; - VECTOR LineT1T3 ; - VECTOR normLineT1T2X ; - VECTOR normLineT1T2Y ; - VECTOR normLineT1T2Z ; - VECTOR ResPosS ; - VECTOR DLineT1T2 ; - VECTOR DLineT1T3 ; - VECTOR DResPos ; - float tempF ; - float LineT1T2T ; - float LineT1T3T ; - - VectorSub( &LineT1T2, &TrianglePos2, &TrianglePos1 ) ; - VectorSub( &LineT1T3, &TrianglePos3, &TrianglePos1 ) ; - VectorNormalize( &normLineT1T2X, &LineT1T2 ) ; - - VectorOuterProduct( &normLineT1T2Z, &normLineT1T2X, &LineT1T3 ) ; - VectorOuterProduct( &normLineT1T2Y, &normLineT1T2X, &normLineT1T2Z ) ; - VectorNormalize( &normLineT1T2Y, &normLineT1T2Y ) ; - VectorNormalize( &normLineT1T2Z, &normLineT1T2Z ) ; - - VectorSub( &ResPosS, &Result.Position, &TrianglePos1 ) ; - DResPos.x = normLineT1T2X.x * ResPosS.x + normLineT1T2X.y * ResPosS.y + normLineT1T2X.z * ResPosS.z ; - DResPos.y = normLineT1T2Y.x * ResPosS.x + normLineT1T2Y.y * ResPosS.y + normLineT1T2Y.z * ResPosS.z ; - DResPos.z = normLineT1T2Z.x * ResPosS.x + normLineT1T2Z.y * ResPosS.y + normLineT1T2Z.z * ResPosS.z ; - - DLineT1T2.x = normLineT1T2X.x * LineT1T2.x + normLineT1T2X.y * LineT1T2.y + normLineT1T2X.z * LineT1T2.z ; - DLineT1T2.y = normLineT1T2Y.x * LineT1T2.x + normLineT1T2Y.y * LineT1T2.y + normLineT1T2Y.z * LineT1T2.z ; - DLineT1T2.z = normLineT1T2Z.x * LineT1T2.x + normLineT1T2Z.y * LineT1T2.y + normLineT1T2Z.z * LineT1T2.z ; - - DLineT1T3.x = normLineT1T2X.x * LineT1T3.x + normLineT1T2X.y * LineT1T3.y + normLineT1T2X.z * LineT1T3.z ; - DLineT1T3.y = normLineT1T2Y.x * LineT1T3.x + normLineT1T2Y.y * LineT1T3.y + normLineT1T2Y.z * LineT1T3.z ; - DLineT1T3.z = normLineT1T2Z.x * LineT1T3.x + normLineT1T2Z.y * LineT1T3.y + normLineT1T2Z.z * LineT1T3.z ; - - tempF = DLineT1T3.x * DLineT1T2.y - DLineT1T3.y * DLineT1T2.x ; - if( _FABS( tempF ) > 0.000001f ) - { - LineT1T3T = ( DResPos.x * DLineT1T2.y - DResPos.y * DLineT1T2.x ) / tempF ; - if( _FABS( DLineT1T2.x ) > 0.0001f ) + // 三角形が示す平面状に頂点を投影する + VectorSub( &Tri1_Seg2, &LinePos2, &TrianglePos1 ) ; + Seg2_TriProSeg2_DistBase = VectorInnerProduct( &Tri1_Seg2, &TriNorm ) ; + VectorScale( &tv, &TriNorm, Seg2_TriProSeg2_DistBase ) ; + VectorSub( &Seg2_TriPro, &LinePos2, &tv ) ; + Seg2_TriProSeg2_Dist = Seg2_TriProSeg2_DistBase < 0.0f ? -Seg2_TriProSeg2_DistBase : Seg2_TriProSeg2_DistBase ; + + // 三角形内に頂点が存在するかどうかを調べる + TriangleBarycenter_Base( &TrianglePos1, &TrianglePos2, &TrianglePos3, &Seg2_TriPro, &Seg2_TriPro_w1, &Seg2_TriPro_w2, &Seg2_TriPro_w3 ) ; + Project2 = Seg2_TriPro_w1 >= 0.0f && Seg2_TriPro_w1 <= 1.0f && Seg2_TriPro_w2 >= 0.0f && Seg2_TriPro_w2 <= 1.0f && Seg2_TriPro_w3 >= 0.0f && Seg2_TriPro_w3 <= 1.0f ; + + + // 三角形と線分が交差又は接している可能性がある場合は分岐 + if( ( Seg1_TriProSeg1_Dist >= 0.00000001f || Seg2_TriProSeg2_Dist >= 0.00000001f ) && + ( Seg1_TriProSeg1_Dist < 0.00000001f || Seg2_TriProSeg2_Dist < 0.00000001f || + ( Seg1_TriProSeg1_DistBase > 0.0f && Seg2_TriProSeg2_DistBase < 0.0f ) || + ( Seg1_TriProSeg1_DistBase < 0.0f && Seg2_TriProSeg2_DistBase > 0.0f ) ) ) + { + float Seg_TriPos_TriPos1_w ; + float Seg_TriPos_TriPos2_w ; + float Seg_TriPos_TriPos3_w ; + VECTOR Seg_TriPos ; + float TriPos_SegPos1_2_t ; + + // 三角形が表す平面と線分との接点と重心を算出する + TriPos_SegPos1_2_t = Seg1_TriProSeg1_Dist / ( Seg1_TriProSeg1_Dist + Seg2_TriProSeg2_Dist ) ; + VectorScale( &Seg_TriPos, &Seg1_2, TriPos_SegPos1_2_t ) ; + VectorAdd( &Seg_TriPos, &Seg_TriPos, &LinePos1 ) ; + + TriangleBarycenter_Base( &TrianglePos1, &TrianglePos2, &TrianglePos3, &Seg_TriPos, + &Seg_TriPos_TriPos1_w, &Seg_TriPos_TriPos2_w, &Seg_TriPos_TriPos3_w ) ; + + + // 線分と三角形が接しているかチェック + if( Seg_TriPos_TriPos1_w >= 0.0f && Seg_TriPos_TriPos1_w <= 1.0f && + Seg_TriPos_TriPos2_w >= 0.0f && Seg_TriPos_TriPos2_w <= 1.0f && + Seg_TriPos_TriPos3_w >= 0.0f && Seg_TriPos_TriPos3_w <= 1.0f ) { - LineT1T2T = ( DResPos.x - DLineT1T3.x * LineT1T3T ) / DLineT1T2.x ; + Result->HitFlag = 1 ; + Result->Position = Seg_TriPos ; + + if( TrianglePos1Weight ) *TrianglePos1Weight = Seg_TriPos_TriPos1_w ; + if( TrianglePos2Weight ) *TrianglePos2Weight = Seg_TriPos_TriPos2_w ; + if( TrianglePos3Weight ) *TrianglePos3Weight = Seg_TriPos_TriPos3_w ; + return ; + } + } + + // どちらも三角形の範囲にあった場合 + if( Project1 && Project2 ) + { + // 片方の側にどちらの頂点もある場合は、より近いほうの頂点と平面との距離を結果にする + if( Seg1_TriProSeg1_Dist < Seg2_TriProSeg2_Dist || + Seg1_TriProSeg1_Dist == Seg2_TriProSeg2_Dist ) + { + Result->HitFlag = Seg1_TriProSeg1_Dist * Seg1_TriProSeg1_Dist < 0.0000001f ? 1 : 0 ; + Result->Position = Seg1_TriPro ; + + if( TrianglePos1Weight ) *TrianglePos1Weight = Seg1_TriPro_w1 ; + if( TrianglePos2Weight ) *TrianglePos2Weight = Seg1_TriPro_w2 ; + if( TrianglePos3Weight ) *TrianglePos3Weight = Seg1_TriPro_w3 ; } else { - LineT1T2T = ( DResPos.y - DLineT1T3.y * LineT1T3T ) / DLineT1T2.y ; + Result->HitFlag = Seg2_TriProSeg2_Dist * Seg2_TriProSeg2_Dist < 0.0000001f ? 1 : 0 ; + Result->Position = Seg2_TriPro ; + + if( TrianglePos1Weight ) *TrianglePos1Weight = Seg2_TriPro_w1 ; + if( TrianglePos2Weight ) *TrianglePos2Weight = Seg2_TriPro_w2 ; + if( TrianglePos3Weight ) *TrianglePos3Weight = Seg2_TriPro_w3 ; } + return ; } - else + + // 線分が三角形と同一平面上にある場合のみ三角形に横から当たっているかどうかの判定を行う + if( Seg1_TriProSeg1_Dist < 0.00000001f && Seg2_TriProSeg2_Dist < 0.00000001f ) { - tempF = DLineT1T2.x * DLineT1T3.y - DLineT1T2.y * DLineT1T3.x ; - LineT1T2T = ( DResPos.x * DLineT1T3.y - DResPos.y * DLineT1T3.x ) / tempF ; - if( _FABS( DLineT1T3.x ) > 0.0001f ) + // 線分の始点が三角形の範囲にある場合は始点を接触点とする + if( Project1 ) { - LineT1T3T = ( DResPos.x - DLineT1T2.x * LineT1T2T ) / DLineT1T3.x ; + Result->HitFlag = 1 ; + Result->Position = LinePos1 ; + + if( TrianglePos1Weight ) *TrianglePos1Weight = Seg1_TriPro_w1 ; + if( TrianglePos2Weight ) *TrianglePos2Weight = Seg1_TriPro_w2 ; + if( TrianglePos3Weight ) *TrianglePos3Weight = Seg1_TriPro_w3 ; + return ; } - else + + // そうではない場合は三角形の3辺と線分の距離を測り、一番距離が短い辺を探す + Segment_Segment_Analyse( &LinePos1, &LinePos2, &TrianglePos1, &TrianglePos2, &Seg_Tri1_2_Res ) ; + Segment_Segment_Analyse( &LinePos1, &LinePos2, &TrianglePos2, &TrianglePos3, &Seg_Tri2_3_Res ) ; + Segment_Segment_Analyse( &LinePos1, &LinePos2, &TrianglePos3, &TrianglePos1, &Seg_Tri3_1_Res ) ; + + MinLen = 0.0f ; + if( Seg_Tri1_2_Res.SegA_SegB_MinDist_Square < 0.00000001f && + ( Result->HitFlag == 0 || MinLen > Seg_Tri1_2_Res.SegA_MinDist_Pos1_Pos2_t ) ) { - LineT1T3T = ( DResPos.y - DLineT1T2.y * LineT1T2T ) / DLineT1T3.y ; + MinLen = Seg_Tri1_2_Res.SegA_MinDist_Pos1_Pos2_t ; + Result->HitFlag = 1 ; + Result->Position = Seg_Tri1_2_Res.SegB_MinDist_Pos ; + + if( TrianglePos1Weight ) *TrianglePos1Weight = 1.0f - Seg_Tri1_2_Res.SegB_MinDist_Pos1_Pos2_t ; + if( TrianglePos2Weight ) *TrianglePos2Weight = Seg_Tri1_2_Res.SegB_MinDist_Pos1_Pos2_t ; + if( TrianglePos3Weight ) *TrianglePos3Weight = 0.0f ; } - } + if( Seg_Tri2_3_Res.SegA_SegB_MinDist_Square < 0.00000001f && + ( Result->HitFlag == 0 || MinLen > Seg_Tri2_3_Res.SegA_MinDist_Pos1_Pos2_t ) ) + { + MinLen = Seg_Tri2_3_Res.SegA_MinDist_Pos1_Pos2_t ; + Result->HitFlag = 1 ; + Result->Position = Seg_Tri2_3_Res.SegB_MinDist_Pos ; - if( TriangleHit1_2T ) *TriangleHit1_2T = LineT1T2T ; - if( TriangleHit1_3T ) *TriangleHit1_3T = LineT1T3T ; + if( TrianglePos1Weight ) *TrianglePos1Weight = 0.0f ; + if( TrianglePos2Weight ) *TrianglePos2Weight = 1.0f - Seg_Tri2_3_Res.SegB_MinDist_Pos1_Pos2_t ; + if( TrianglePos3Weight ) *TrianglePos3Weight = Seg_Tri2_3_Res.SegB_MinDist_Pos1_Pos2_t ; + } + if( Seg_Tri3_1_Res.SegA_SegB_MinDist_Square < 0.00000001f && + ( Result->HitFlag == 0 || MinLen > Seg_Tri3_1_Res.SegA_MinDist_Pos1_Pos2_t ) ) + { + MinLen = Seg_Tri3_1_Res.SegA_MinDist_Pos1_Pos2_t ; + Result->HitFlag = 1 ; + Result->Position = Seg_Tri3_1_Res.SegB_MinDist_Pos ; + + if( TrianglePos1Weight ) *TrianglePos1Weight = Seg_Tri3_1_Res.SegB_MinDist_Pos1_Pos2_t ; + if( TrianglePos2Weight ) *TrianglePos2Weight = 0.0f ; + if( TrianglePos3Weight ) *TrianglePos3Weight = 1.0f - Seg_Tri3_1_Res.SegB_MinDist_Pos1_Pos2_t ; + } + } } -*/ +} - // 終了 - return Result ; +// 三角形と線の当たり判定 +extern HITRESULT_LINE HitCheck_Line_Triangle( VECTOR LinePos1, VECTOR LinePos2, VECTOR TrianglePos1, VECTOR TrianglePos2, VECTOR TrianglePos3 ) +{ + HITRESULT_LINE HitResult ; + + HitCheck_Line_Triangle_Base( &HitResult, LinePos1, LinePos2, TrianglePos1, TrianglePos2, TrianglePos3, NULL, NULL, NULL, FALSE ) ; + + return HitResult ; } // 三角形と線の当たり判定 extern void HitCheck_Line_TriangleD_Base( HITRESULT_LINE_D *Result, VECTOR_D LinePos1, VECTOR_D LinePos2, VECTOR_D TrianglePos1, VECTOR_D TrianglePos2, VECTOR_D TrianglePos3, - double *TrianglePos1Weight, double *TrianglePos2Weight, double *TrianglePos3Weight ) + double *TrianglePos1Weight, double *TrianglePos2Weight, double *TrianglePos3Weight, int IsSimpleCheck ) { VECTOR_D LineL1L2, LineL1T1, LineL1T2, LineL1T3, OP ; VECTOR_D LineL1C, LineL2C ; double u, v, w, totalr ; + int Process = 0 ; Result->HitFlag = 0 ; @@ -5334,45 +5608,220 @@ extern void HitCheck_Line_TriangleD_Base( VectorOuterProductD( &OP, &LineL1L2, &LineL1T1 ) ; w = VectorInnerProductD( &OP, &LineL1T2 ) ; - if( ( ( u < 0.0 || v < 0.0 || w < 0.0 ) && - ( u > 0.0 || v > 0.0 || w > 0.0 ) ) || - ( u < 0.0000001 && u > -0.0000001 && - v < 0.0000001 && v > -0.0000001 && - w < 0.0000001 && w > -0.0000001 ) ) - return ; - - totalr = 1.0 / ( u + v + w ) ; - u *= totalr ; - v *= totalr ; - w *= totalr ; - Result->Position.x = TrianglePos1.x * u + TrianglePos2.x * v + TrianglePos3.x * w ; - Result->Position.y = TrianglePos1.y * u + TrianglePos2.y * v + TrianglePos3.y * w ; - Result->Position.z = TrianglePos1.z * u + TrianglePos2.z * v + TrianglePos3.z * w ; - - VectorSubD( &LineL1C, &LinePos1, &Result->Position ) ; - VectorSubD( &LineL2C, &LinePos2, &Result->Position ) ; - if( VectorInnerProductD( &LineL1C, &LineL2C ) <= 0.0 ) + if( !( ( ( u < 0.0 || v < 0.0 || w < 0.0 ) && + ( u > 0.0 || v > 0.0 || w > 0.0 ) ) || + ( u < 0.0000001 && u > -0.0000001 && + v < 0.0000001 && v > -0.0000001 && + w < 0.0000001 && w > -0.0000001 ) ) ) { - Result->HitFlag = 1 ; + totalr = 1.0 / ( u + v + w ) ; + u *= totalr ; + v *= totalr ; + w *= totalr ; + Result->Position.x = TrianglePos1.x * u + TrianglePos2.x * v + TrianglePos3.x * w ; + Result->Position.y = TrianglePos1.y * u + TrianglePos2.y * v + TrianglePos3.y * w ; + Result->Position.z = TrianglePos1.z * u + TrianglePos2.z * v + TrianglePos3.z * w ; + + VectorSubD( &LineL1C, &LinePos1, &Result->Position ) ; + VectorSubD( &LineL2C, &LinePos2, &Result->Position ) ; + if( VectorInnerProductD( &LineL1C, &LineL2C ) <= 0.0 ) + { + Process = 1 ; + Result->HitFlag = 1 ; + } } if( TrianglePos1Weight ) *TrianglePos1Weight = u ; if( TrianglePos2Weight ) *TrianglePos2Weight = v ; if( TrianglePos3Weight ) *TrianglePos3Weight = w ; + + if( Process == 0 && IsSimpleCheck == FALSE ) + { + bool Project1, Project2 ; + VECTOR_D Seg1_TriPro ; + VECTOR_D Seg2_TriPro ; + double Seg1_TriPro_w1 ; + double Seg1_TriPro_w2 ; + double Seg1_TriPro_w3 ; + double Seg2_TriPro_w1 ; + double Seg2_TriPro_w2 ; + double Seg2_TriPro_w3 ; + VECTOR_D Seg1_2 ; + VECTOR_D Tri1_Seg1 ; + VECTOR_D Tri1_Seg2 ; + VECTOR_D TriNorm ; + VECTOR_D tv ; + VECTOR_D Tri1_2, Tri1_3 ; + double Seg1_TriProSeg1_Dist = 0.0 ; + double Seg2_TriProSeg2_Dist = 0.0 ; + double Seg1_TriProSeg1_DistBase = 0.0 ; + double Seg2_TriProSeg2_DistBase = 0.0 ; + double MinLen ; + SEGMENT_SEGMENT_RESULT_D Seg_Tri1_2_Res ; + SEGMENT_SEGMENT_RESULT_D Seg_Tri2_3_Res ; + SEGMENT_SEGMENT_RESULT_D Seg_Tri3_1_Res ; + + VectorSubD( &Seg1_2, &LinePos2, &LinePos1 ) ; + VectorSubD( &Tri1_2, &TrianglePos2, &TrianglePos1 ) ; + VectorSubD( &Tri1_3, &TrianglePos3, &TrianglePos1 ) ; + VectorOuterProductD( &TriNorm, &Tri1_2, &Tri1_3 ) ; + VectorNormalizeD( &TriNorm, &TriNorm ) ; + + // 三角形が示す平面状に頂点を投影する + VectorSubD( &Tri1_Seg1, &LinePos1, &TrianglePos1 ) ; + Seg1_TriProSeg1_DistBase = VectorInnerProductD( &Tri1_Seg1, &TriNorm ) ; + VectorScaleD( &tv, &TriNorm, Seg1_TriProSeg1_DistBase ) ; + VectorSubD( &Seg1_TriPro, &LinePos1, &tv ) ; + Seg1_TriProSeg1_Dist = Seg1_TriProSeg1_DistBase < 0.0 ? -Seg1_TriProSeg1_DistBase : Seg1_TriProSeg1_DistBase ; + + + // 三角形内に頂点が存在するかどうかを調べる + TriangleBarycenter_BaseD( &TrianglePos1, &TrianglePos2, &TrianglePos3, &Seg1_TriPro, &Seg1_TriPro_w1, &Seg1_TriPro_w2, &Seg1_TriPro_w3 ) ; + Project1 = Seg1_TriPro_w1 >= 0.0 && Seg1_TriPro_w1 <= 1.0 && Seg1_TriPro_w2 >= 0.0 && Seg1_TriPro_w2 <= 1.0 && Seg1_TriPro_w3 >= 0.0 && Seg1_TriPro_w3 <= 1.0 ; + + // 三角形が示す平面状に頂点を投影する + VectorSubD( &Tri1_Seg2, &LinePos2, &TrianglePos1 ) ; + Seg2_TriProSeg2_DistBase = VectorInnerProductD( &Tri1_Seg2, &TriNorm ) ; + VectorScaleD( &tv, &TriNorm, Seg2_TriProSeg2_DistBase ) ; + VectorSubD( &Seg2_TriPro, &LinePos2, &tv ) ; + Seg2_TriProSeg2_Dist = Seg2_TriProSeg2_DistBase < 0.0 ? -Seg2_TriProSeg2_DistBase : Seg2_TriProSeg2_DistBase ; + + // 三角形内に頂点が存在するかどうかを調べる + TriangleBarycenter_BaseD( &TrianglePos1, &TrianglePos2, &TrianglePos3, &Seg2_TriPro, &Seg2_TriPro_w1, &Seg2_TriPro_w2, &Seg2_TriPro_w3 ) ; + Project2 = Seg2_TriPro_w1 >= 0.0 && Seg2_TriPro_w1 <= 1.0 && Seg2_TriPro_w2 >= 0.0 && Seg2_TriPro_w2 <= 1.0 && Seg2_TriPro_w3 >= 0.0 && Seg2_TriPro_w3 <= 1.0 ; + + + // 三角形と線分が交差又は接している可能性がある場合は分岐 + if( ( Seg1_TriProSeg1_Dist >= 0.00000001 || Seg2_TriProSeg2_Dist >= 0.00000001 ) && + ( Seg1_TriProSeg1_Dist < 0.00000001 || Seg2_TriProSeg2_Dist < 0.00000001 || + ( Seg1_TriProSeg1_DistBase > 0.0 && Seg2_TriProSeg2_DistBase < 0.0 ) || + ( Seg1_TriProSeg1_DistBase < 0.0 && Seg2_TriProSeg2_DistBase > 0.0 ) ) ) + { + double Seg_TriPos_TriPos1_w ; + double Seg_TriPos_TriPos2_w ; + double Seg_TriPos_TriPos3_w ; + VECTOR_D Seg_TriPos ; + double TriPos_SegPos1_2_t ; + + // 三角形が表す平面と線分との接点と重心を算出する + TriPos_SegPos1_2_t = Seg1_TriProSeg1_Dist / ( Seg1_TriProSeg1_Dist + Seg2_TriProSeg2_Dist ) ; + VectorScaleD( &Seg_TriPos, &Seg1_2, TriPos_SegPos1_2_t ) ; + VectorAddD( &Seg_TriPos, &Seg_TriPos, &LinePos1 ) ; + + TriangleBarycenter_BaseD( &TrianglePos1, &TrianglePos2, &TrianglePos3, &Seg_TriPos, + &Seg_TriPos_TriPos1_w, &Seg_TriPos_TriPos2_w, &Seg_TriPos_TriPos3_w ) ; + + + // 線分と三角形が接しているかチェック + if( Seg_TriPos_TriPos1_w >= 0.0 && Seg_TriPos_TriPos1_w <= 1.0 && + Seg_TriPos_TriPos2_w >= 0.0 && Seg_TriPos_TriPos2_w <= 1.0 && + Seg_TriPos_TriPos3_w >= 0.0 && Seg_TriPos_TriPos3_w <= 1.0 ) + { + Result->HitFlag = 1 ; + Result->Position = Seg_TriPos ; + + if( TrianglePos1Weight ) *TrianglePos1Weight = Seg_TriPos_TriPos1_w ; + if( TrianglePos2Weight ) *TrianglePos2Weight = Seg_TriPos_TriPos2_w ; + if( TrianglePos3Weight ) *TrianglePos3Weight = Seg_TriPos_TriPos3_w ; + return ; + } + } + + // どちらも三角形の範囲にあった場合 + if( Project1 && Project2 ) + { + // 片方の側にどちらの頂点もある場合は、より近いほうの頂点と平面との距離を結果にする + if( Seg1_TriProSeg1_Dist < Seg2_TriProSeg2_Dist || + Seg1_TriProSeg1_Dist == Seg2_TriProSeg2_Dist ) + { + Result->HitFlag = Seg1_TriProSeg1_Dist * Seg1_TriProSeg1_Dist < 0.0000001 ? 1 : 0 ; + Result->Position = Seg1_TriPro ; + + if( TrianglePos1Weight ) *TrianglePos1Weight = Seg1_TriPro_w1 ; + if( TrianglePos2Weight ) *TrianglePos2Weight = Seg1_TriPro_w2 ; + if( TrianglePos3Weight ) *TrianglePos3Weight = Seg1_TriPro_w3 ; + } + else + { + Result->HitFlag = Seg2_TriProSeg2_Dist * Seg2_TriProSeg2_Dist < 0.0000001 ? 1 : 0 ; + Result->Position = Seg2_TriPro ; + + if( TrianglePos1Weight ) *TrianglePos1Weight = Seg2_TriPro_w1 ; + if( TrianglePos2Weight ) *TrianglePos2Weight = Seg2_TriPro_w2 ; + if( TrianglePos3Weight ) *TrianglePos3Weight = Seg2_TriPro_w3 ; + } + return ; + } + + // 線分が三角形と同一平面上にある場合のみ三角形に横から当たっているかどうかの判定を行う + if( Seg1_TriProSeg1_Dist < 0.00000001 && Seg2_TriProSeg2_Dist < 0.00000001 ) + { + // 線分の始点が三角形の範囲にある場合は始点を接触点とする + if( Project1 ) + { + Result->HitFlag = 1 ; + Result->Position = LinePos1 ; + + if( TrianglePos1Weight ) *TrianglePos1Weight = Seg1_TriPro_w1 ; + if( TrianglePos2Weight ) *TrianglePos2Weight = Seg1_TriPro_w2 ; + if( TrianglePos3Weight ) *TrianglePos3Weight = Seg1_TriPro_w3 ; + return ; + } + + // そうではない場合は三角形の3辺と線分の距離を測り、一番距離が短い辺を探す + Segment_Segment_AnalyseD( &LinePos1, &LinePos2, &TrianglePos1, &TrianglePos2, &Seg_Tri1_2_Res ) ; + Segment_Segment_AnalyseD( &LinePos1, &LinePos2, &TrianglePos2, &TrianglePos3, &Seg_Tri2_3_Res ) ; + Segment_Segment_AnalyseD( &LinePos1, &LinePos2, &TrianglePos3, &TrianglePos1, &Seg_Tri3_1_Res ) ; + + MinLen = 0.0f ; + if( Seg_Tri1_2_Res.SegA_SegB_MinDist_Square < 0.00000001 && + ( Result->HitFlag == 0 || MinLen > Seg_Tri1_2_Res.SegA_MinDist_Pos1_Pos2_t ) ) + { + MinLen = Seg_Tri1_2_Res.SegA_MinDist_Pos1_Pos2_t ; + Result->HitFlag = 1 ; + Result->Position = Seg_Tri1_2_Res.SegB_MinDist_Pos ; + + if( TrianglePos1Weight ) *TrianglePos1Weight = 1.0 - Seg_Tri1_2_Res.SegB_MinDist_Pos1_Pos2_t ; + if( TrianglePos2Weight ) *TrianglePos2Weight = Seg_Tri1_2_Res.SegB_MinDist_Pos1_Pos2_t ; + if( TrianglePos3Weight ) *TrianglePos3Weight = 0.0 ; + } + if( Seg_Tri2_3_Res.SegA_SegB_MinDist_Square < 0.00000001 && + ( Result->HitFlag == 0 || MinLen > Seg_Tri2_3_Res.SegA_MinDist_Pos1_Pos2_t ) ) + { + MinLen = Seg_Tri2_3_Res.SegA_MinDist_Pos1_Pos2_t ; + Result->HitFlag = 1 ; + Result->Position = Seg_Tri2_3_Res.SegB_MinDist_Pos ; + + if( TrianglePos1Weight ) *TrianglePos1Weight = 0.0 ; + if( TrianglePos2Weight ) *TrianglePos2Weight = 1.0 - Seg_Tri2_3_Res.SegB_MinDist_Pos1_Pos2_t ; + if( TrianglePos3Weight ) *TrianglePos3Weight = Seg_Tri2_3_Res.SegB_MinDist_Pos1_Pos2_t ; + } + if( Seg_Tri3_1_Res.SegA_SegB_MinDist_Square < 0.00000001 && + ( Result->HitFlag == 0 || MinLen > Seg_Tri3_1_Res.SegA_MinDist_Pos1_Pos2_t ) ) + { + MinLen = Seg_Tri3_1_Res.SegA_MinDist_Pos1_Pos2_t ; + Result->HitFlag = 1 ; + Result->Position = Seg_Tri3_1_Res.SegB_MinDist_Pos ; + + if( TrianglePos1Weight ) *TrianglePos1Weight = Seg_Tri3_1_Res.SegB_MinDist_Pos1_Pos2_t ; + if( TrianglePos2Weight ) *TrianglePos2Weight = 0.0 ; + if( TrianglePos3Weight ) *TrianglePos3Weight = 1.0 - Seg_Tri3_1_Res.SegB_MinDist_Pos1_Pos2_t ; + } + } + } } // 三角形と線の当たり判定 extern HITRESULT_LINE_D HitCheck_Line_TriangleD( VECTOR_D LinePos1, VECTOR_D LinePos2, VECTOR_D TrianglePos1, VECTOR_D TrianglePos2, VECTOR_D TrianglePos3 ) { - HITRESULT_LINE_D Result ; + HITRESULT_LINE_D HitResult ; - HitCheck_Line_TriangleD_Base( &Result, LinePos1, LinePos2, TrianglePos1, TrianglePos2, TrianglePos3, NULL, NULL, NULL ) ; + HitCheck_Line_TriangleD_Base( &HitResult, LinePos1, LinePos2, TrianglePos1, TrianglePos2, TrianglePos3, NULL, NULL, NULL, FALSE ) ; // 終了 - return Result ; + return HitResult ; } - // 三角形と三角形の当たり判定( TRUE:当たっている FALSE:当たっていない ) extern int HitCheck_Triangle_Triangle( VECTOR Triangle1Pos1, VECTOR Triangle1Pos2, VECTOR Triangle1Pos3, VECTOR Triangle2Pos1, VECTOR Triangle2Pos2, VECTOR Triangle2Pos3 ) diff --git a/DxMath.h b/DxMath.h index 6179738..91fef21 100644 --- a/DxMath.h +++ b/DxMath.h @@ -2,7 +2,7 @@ // // DXライブラリ 演算プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -30,12 +30,15 @@ namespace DxLib // 関数プロトタイプ宣言----------------------------------------------------------- -extern void HitCheck_Line_Triangle_Base( HITRESULT_LINE *Result, VECTOR LinePos1, VECTOR LinePos2, VECTOR TrianglePos1, VECTOR TrianglePos2, VECTOR TrianglePos3, float *TrianglePos1Weight, float *TrianglePos2Weight, float *TrianglePos3Weight ) ; // 三角形と線の当たり判定 -extern void HitCheck_Line_TriangleD_Base( HITRESULT_LINE_D *Result, VECTOR_D LinePos1, VECTOR_D LinePos2, VECTOR_D TrianglePos1, VECTOR_D TrianglePos2, VECTOR_D TrianglePos3, double *TrianglePos1Weight, double *TrianglePos2Weight, double *TrianglePos3Weight ) ; // 三角形と線の当たり判定 +extern void HitCheck_Line_Triangle_Base( HITRESULT_LINE *Result, VECTOR LinePos1, VECTOR LinePos2, VECTOR TrianglePos1, VECTOR TrianglePos2, VECTOR TrianglePos3, float *TrianglePos1Weight, float *TrianglePos2Weight, float *TrianglePos3Weight, int IsSimpleCheck ) ; // 三角形と線の当たり判定 +extern void HitCheck_Line_TriangleD_Base( HITRESULT_LINE_D *Result, VECTOR_D LinePos1, VECTOR_D LinePos2, VECTOR_D TrianglePos1, VECTOR_D TrianglePos2, VECTOR_D TrianglePos3, double *TrianglePos1Weight, double *TrianglePos2Weight, double *TrianglePos3Weight, int IsSimpleCheck ) ; // 三角形と線の当たり判定 extern void TriangleBarycenter_Base( const VECTOR *TrianglePos1, const VECTOR *TrianglePos2, const VECTOR *TrianglePos3, const VECTOR *Position, float *TrianglePos1Weight, float *TrianglePos2Weight, float *TrianglePos3Weight ) ; // 指定の座標から三角形の重心を求める extern void TriangleBarycenter_BaseD( const VECTOR_D *TrianglePos1, const VECTOR_D *TrianglePos2, const VECTOR_D *TrianglePos3, const VECTOR_D *Position, double *TrianglePos1Weight, double *TrianglePos2Weight, double *TrianglePos3Weight ) ; // 指定の座標から三角形の重心を求める +extern float Segment_Triangle_MinLength_Square_Base( VECTOR SegmentPos1, VECTOR SegmentPos2, VECTOR TrianglePos1, VECTOR TrianglePos2, VECTOR TrianglePos3, int *IsZeroLength ) ; // 線分と三角形の最近点間の距離の二乗を得る +extern double Segment_Triangle_MinLength_SquareD_Base( VECTOR_D SegmentPos1, VECTOR_D SegmentPos2, VECTOR_D TrianglePos1, VECTOR_D TrianglePos2, VECTOR_D TrianglePos3, int *IsZeroLength ) ; // 線分と三角形の最近点間の距離の二乗を得る + extern VECTOR Get_Triangle_Point_MinPosition( VECTOR Point, VECTOR TrianglePos1, VECTOR TrianglePos2, VECTOR TrianglePos3 ) ; // 点に一番近い三角形上の座標を得る extern VECTOR_D Get_Triangle_Point_MinPositionD( VECTOR_D Point, VECTOR_D TrianglePos1, VECTOR_D TrianglePos2, VECTOR_D TrianglePos3 ) ; // 点に一番近い三角形上の座標を得る extern VECTOR Get_Line_Point_MinPosition( VECTOR Point, VECTOR LinePos1, VECTOR LinePos2, float *pT = NULL ) ; // 点に一番近い線上の座標を得る diff --git a/DxMemImg.cpp b/DxMemImg.cpp index 815d9df..1a000d0 100644 --- a/DxMemImg.cpp +++ b/DxMemImg.cpp @@ -2,7 +2,7 @@ // // DXライブラリ メモリイメージ制御用プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxMemImg.h b/DxMemImg.h index 49febd2..14f8da8 100644 --- a/DxMemImg.h +++ b/DxMemImg.h @@ -2,7 +2,7 @@ // // DXライブラリ メモリイメージ制御用ヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxMemImgDrawFunction0.cpp b/DxMemImgDrawFunction0.cpp index 3ae14a5..a032392 100644 --- a/DxMemImgDrawFunction0.cpp +++ b/DxMemImgDrawFunction0.cpp @@ -2,7 +2,7 @@ // // DXライブラリ メモリイメージ制御用プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxMemImgDrawFunction1.cpp b/DxMemImgDrawFunction1.cpp index 6497323..619f228 100644 --- a/DxMemImgDrawFunction1.cpp +++ b/DxMemImgDrawFunction1.cpp @@ -2,7 +2,7 @@ // // DXライブラリ メモリイメージ制御用プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxMemImgDrawFunction2.cpp b/DxMemImgDrawFunction2.cpp index e8f69ed..25c8371 100644 --- a/DxMemImgDrawFunction2.cpp +++ b/DxMemImgDrawFunction2.cpp @@ -2,7 +2,7 @@ // // DXライブラリ メモリイメージ制御用プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxMemImgDrawFunction3.cpp b/DxMemImgDrawFunction3.cpp index 75bd6be..18db182 100644 --- a/DxMemImgDrawFunction3.cpp +++ b/DxMemImgDrawFunction3.cpp @@ -2,7 +2,7 @@ // // DXライブラリ メモリイメージ制御用プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxMemory.cpp b/DxMemory.cpp index 9630d54..47d52aa 100644 --- a/DxMemory.cpp +++ b/DxMemory.cpp @@ -2,7 +2,7 @@ // // DXライブラリ メモリ関連プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxMemory.h b/DxMemory.h index 3f06de2..2db7007 100644 --- a/DxMemory.h +++ b/DxMemory.h @@ -2,7 +2,7 @@ // // DXライブラリ メモリ関係プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxModel.cpp b/DxModel.cpp index 4d5b110..d40d193 100644 --- a/DxModel.cpp +++ b/DxModel.cpp @@ -2,7 +2,7 @@ // // DXライブラリ モデルデータ制御プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -1825,12 +1825,14 @@ static void MV1SetupMatrix( MV1_MODEL *Model ) MAnim2 = MAnim ; BlendFlag = 0 ; mcon = 0 ; + BlendRate = 0.0f ; for( j = 0 ; j < Model->AnimSetMaxNum ; j ++, MAnim2 ++ ) { if( MAnim2->Use == false || MAnim2->BlendRate == 0.0f ) continue ; mcon ++ ; MAnim3 = MAnim2 ; + BlendRate += MAnim2->BlendRate ; BlendFlag |= MAnim2->Anim->ValidFlag ; } @@ -1870,8 +1872,8 @@ static void MV1SetupMatrix( MV1_MODEL *Model ) } } else - // アニメーションが一つだけ再生されている場合は別処理 - if( mcon == 1 ) + // アニメーションが一つだけ再生されていて且つブレンドレートも1.0の場合は別処理 + if( mcon == 1 && BlendRate == 1.0f ) { // 行列のセットアップ if( BlendFlag & MV1_ANIMVALUE_MATRIX ) @@ -29849,7 +29851,8 @@ extern MV1_COLL_RESULT_POLY NS_MV1CollCheck_Line( int MHandle, int FrameIndex, V PolyList->Vertexs[ Poly->VIndex[ 2 ] ].Position, &pos1w, &pos2w, - &pos3w ) ; + &pos3w, + TRUE ) ; if( LineRes.HitFlag ) { VectorSub( &Sa, &LineRes.Position, ( VECTOR * )&PosStart ) ; @@ -30071,7 +30074,8 @@ extern MV1_COLL_RESULT_POLY NS_MV1CollCheck_Line( int MHandle, int FrameIndex, V // PolyList->Vertexs[ Poly->VIndex[ 2 ] ].Position, // &pos1w, // &pos2w, -// &pos3w ) ; +// &pos3w, +// TRUE ) ; // if( LineRes.HitFlag ) // { // VectorSub( &Sa, &LineRes.Position, ( VECTOR * )&PosStart ) ; diff --git a/DxModel.h b/DxModel.h index 7915f60..5c6afe1 100644 --- a/DxModel.h +++ b/DxModel.h @@ -2,7 +2,7 @@ // // DXライブラリ モデルデータ制御プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxModelFile.h b/DxModelFile.h index bfe969f..acfe5e8 100644 --- a/DxModelFile.h +++ b/DxModelFile.h @@ -2,7 +2,7 @@ // // DXライブラリ モデルデータファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxModelLoader0.cpp b/DxModelLoader0.cpp index 08ef93b..4deab3e 100644 --- a/DxModelLoader0.cpp +++ b/DxModelLoader0.cpp @@ -2,7 +2,7 @@ // // DXライブラリ Xファイル読み込みプログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxModelLoader1.cpp b/DxModelLoader1.cpp index 9c71b88..b6e02de 100644 --- a/DxModelLoader1.cpp +++ b/DxModelLoader1.cpp @@ -2,7 +2,7 @@ // // DXライブラリ FBXモデルデータ読み込みプログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxModelLoader2.cpp b/DxModelLoader2.cpp index acb4e07..6d9185b 100644 --- a/DxModelLoader2.cpp +++ b/DxModelLoader2.cpp @@ -2,7 +2,7 @@ // // DXライブラリ MQOモデルデータ読み込みプログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxModelLoader3.cpp b/DxModelLoader3.cpp index f0b8204..6b403c6 100644 --- a/DxModelLoader3.cpp +++ b/DxModelLoader3.cpp @@ -2,7 +2,7 @@ // // DXライブラリ PMDモデルデータ読み込みプログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxModelLoader3.h b/DxModelLoader3.h index 498569e..9566d14 100644 --- a/DxModelLoader3.h +++ b/DxModelLoader3.h @@ -2,7 +2,7 @@ // // DXライブラリ モデルデータ読み込み処理3用ヘッダ // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxModelLoader4.cpp b/DxModelLoader4.cpp index ab42da7..3d169e8 100644 --- a/DxModelLoader4.cpp +++ b/DxModelLoader4.cpp @@ -2,7 +2,7 @@ // // DXライブラリ PMXモデルデータ読み込みプログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxModelLoader4.h b/DxModelLoader4.h index 56cc40d..22f296b 100644 --- a/DxModelLoader4.h +++ b/DxModelLoader4.h @@ -2,7 +2,7 @@ // // DXライブラリ モデルデータ読み込み処理4用ヘッダ // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxModelLoaderVMD.cpp b/DxModelLoaderVMD.cpp index 9145be5..571e1b2 100644 --- a/DxModelLoaderVMD.cpp +++ b/DxModelLoaderVMD.cpp @@ -2,7 +2,7 @@ // // DXライブラリ VMDデータ読み込みプログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxModelLoaderVMD.h b/DxModelLoaderVMD.h index 59f0af4..ff3fc7d 100644 --- a/DxModelLoaderVMD.h +++ b/DxModelLoaderVMD.h @@ -2,7 +2,7 @@ // // DXライブラリ VMDファイルデータ構造体ヘッダ // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxModelRead.cpp b/DxModelRead.cpp index 4ba9668..2c3a8b4 100644 --- a/DxModelRead.cpp +++ b/DxModelRead.cpp @@ -2,7 +2,7 @@ // // DXライブラリ モデルデータ読み込みプログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxModelRead.h b/DxModelRead.h index d85926f..d4f2d1f 100644 --- a/DxModelRead.h +++ b/DxModelRead.h @@ -2,7 +2,7 @@ // // DXライブラリ モデルデータ読み込みヘッダ // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxMovie.cpp b/DxMovie.cpp index 32dcf57..18023e0 100644 --- a/DxMovie.cpp +++ b/DxMovie.cpp @@ -2,7 +2,7 @@ // // DXライブラリ ムービー再生処理用プログラム // -// Ver 3.21d +// Ver 3.21f // // ---------------------------------------------------------------------------- diff --git a/DxMovie.h b/DxMovie.h index 7ef0d50..9a7e627 100644 --- a/DxMovie.h +++ b/DxMovie.h @@ -2,7 +2,7 @@ // // DXライブラリ 動画プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxNetwork.cpp b/DxNetwork.cpp index 0c6ca6c..382d326 100644 --- a/DxNetwork.cpp +++ b/DxNetwork.cpp @@ -2,7 +2,7 @@ // // DXライブラリ 通信関連プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -239,7 +239,7 @@ extern int NS_ProcessNetMessage( int RunReleaseProcess ) MSG msg; // メッセージが何もないかあった場合はメッセージの処理が終わるまでループする(制限あり) - while( WinAPIData.Win32Func.PeekMessageWFunc( &msg, SockData.MessageWindow, 0, 0, PM_REMOVE ) ) + while( PeekMessageWFunc( &msg, SockData.MessageWindow, 0, 0, PM_REMOVE ) ) { WinAPIData.Win32Func.TranslateMessageFunc( &msg ); WinAPIData.Win32Func.DispatchMessageWFunc( &msg ); @@ -398,7 +398,7 @@ extern int InitializeNetWork( HWND WindowHandle ) { WNDCLASSEXW wc ; HWND ParentWindow ; - HINSTANCE hInst = WinAPIData.Win32Func.GetModuleHandleWFunc( NULL ) ; + HINSTANCE hInst = GetModuleHandleWFunc( NULL ) ; const wchar_t *Name = L"WinSockProc" ; // 子ウインドウのウインドウクラスを登録 @@ -410,14 +410,14 @@ extern int InitializeNetWork( HWND WindowHandle ) wc.cbWndExtra = 0 ; wc.hInstance = hInst ; wc.hIcon = NULL ; - wc.hCursor = WinAPIData.Win32Func.LoadCursorWFunc( NULL , ( LPCWSTR )IDC_ARROW ) ; + wc.hCursor = LoadCursorWFunc( NULL , ( LPCWSTR )IDC_ARROW ) ; wc.hbrBackground = (HBRUSH)WinAPIData.Win32Func.GetStockObjectFunc(NULL_BRUSH); wc.lpszMenuName = NULL ; wc.lpszClassName = Name ; wc.cbSize = sizeof( WNDCLASSEX ); wc.hIconSm = NULL ; - if( !WinAPIData.Win32Func.RegisterClassExWFunc( &wc ) ) + if( !RegisterClassExWFunc( &wc ) ) { DXST_LOGFILE_ADDUTF16LE( "\xcd\x30\xc3\x30\xc8\x30\xef\x30\xfc\x30\xaf\x30\xe6\x51\x06\x74\x28\x75\x6e\x30\x50\x5b\xa6\x30\xa4\x30\xf3\x30\xc9\x30\xa6\x30\xaf\x30\xe9\x30\xb9\x30\x6e\x30\x7b\x76\x32\x93\x6b\x30\x31\x59\x57\x65\x57\x30\x7e\x30\x57\x30\x5f\x30\x0a\x00\x00"/*@ L"ネットワーク処理用の子ウインドウクラスの登録に失敗しました\n" @*/ ) ; return -1 ; @@ -429,7 +429,7 @@ extern int InitializeNetWork( HWND WindowHandle ) // 子ウインドウを生成 SockData.MessageWindow = - WinAPIData.Win32Func.CreateWindowExWFunc( + CreateWindowExWFunc( WS_EX_TRANSPARENT, Name, Name , @@ -522,7 +522,7 @@ extern int TerminateNetWork( void ) // ウインドウを削除する if( SockData.MessageWindow != NULL ) { - WinAPIData.Win32Func.PostMessageWFunc( SockData.MessageWindow, WM_CLOSE, 0, 0 ); + PostMessageWFunc( SockData.MessageWindow, WM_CLOSE, 0, 0 ); while( SockData.DestroyFlag == FALSE ) { if( NS_ProcessNetMessage() <= 0 ) break ; @@ -686,7 +686,7 @@ extern LRESULT CALLBACK WinSockWindowProc( HWND hWnd, UINT message, WPARAM wPara if( HandleManageArray[ DX_HANDLETYPE_NETWORK ].InitializeFlag != FALSE ) CriticalSection_Unlock( &HandleManageArray[ DX_HANDLETYPE_NETWORK ].CriticalSection ) ; - return WinAPIData.Win32Func.DefWindowProcWFunc( hWnd , message , wParam , lParam ) ; + return DefWindowProcWFunc( hWnd , message , wParam , lParam ) ; } @@ -5281,8 +5281,8 @@ extern int NS_HTTP_StartFileDownload( const char *FileURL, const char *SavePath, { // ファイルに保存 #ifdef UNICODE - WinAPIData.Win32Func.DeleteFileWFunc( http->FileName ) ; - http->FilePoint = WinAPIData.Win32Func.CreateFileWFunc( http->FileName, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ) ; + DeleteFileWFunc( http->FileName ) ; + http->FilePoint = CreateFileWFunc( http->FileName, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ) ; #else WinAPIData.Win32Func.DeleteFileAFunc( http->FileName ) ; http->FilePoint = WinAPIData.Win32Func.CreateFileAFunc( http->FileName, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ) ; diff --git a/DxNetwork.h b/DxNetwork.h index 6f49256..030779b 100644 --- a/DxNetwork.h +++ b/DxNetwork.h @@ -2,7 +2,7 @@ // // DXライブラリ 通信プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxRingBuffer.cpp b/DxRingBuffer.cpp index 926d7d2..1e4fd17 100644 --- a/DxRingBuffer.cpp +++ b/DxRingBuffer.cpp @@ -2,7 +2,7 @@ // // DXライブラリ リングバッファプログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxRingBuffer.h b/DxRingBuffer.h index 2b5413c..c4f7d8b 100644 --- a/DxRingBuffer.h +++ b/DxRingBuffer.h @@ -2,7 +2,7 @@ // // DXライブラリ リングバッファプログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxSoftImage.cpp b/DxSoftImage.cpp index c89fd72..31c4d56 100644 --- a/DxSoftImage.cpp +++ b/DxSoftImage.cpp @@ -2,7 +2,7 @@ // // DXライブラリ ソフトウェアで扱う画像プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxSoftImage.h b/DxSoftImage.h index 1b4cf27..66f8819 100644 --- a/DxSoftImage.h +++ b/DxSoftImage.h @@ -2,7 +2,7 @@ // // DXライブラリ ソフトウェアで扱う画像プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxSound.cpp b/DxSound.cpp index 6c38378..8f666c2 100644 --- a/DxSound.cpp +++ b/DxSound.cpp @@ -2,7 +2,7 @@ // // DXライブラリ DirectSound制御プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -302,6 +302,8 @@ extern int TerminateSoundSystem( void ) { int i ; + DXST_LOGFILE_ADDUTF16LE( "\xb5\x30\xa6\x30\xf3\x30\xc9\x30\xa2\x95\x23\x90\x6e\x30\x42\x7d\x86\x4e\xe6\x51\x06\x74\x2e\x00\x2e\x00\x2e\x00\x20\x00\x00"/*@ L"サウンド関連の終了処理... " @*/ ) ; + // 環境依存処理 TerminateSoundSystem_PF_Timing0() ; @@ -343,9 +345,12 @@ extern int TerminateSoundSystem( void ) TerminateHandleManage( DX_HANDLETYPE_MUSIC ) ; // クリティカルセクションの削除 - CriticalSection_Delete( &SoundSysData._3DSoundListCriticalSection ) ; - CriticalSection_Delete( &SoundSysData.Play3DSoundListCriticalSection ) ; - CriticalSection_Delete( &SoundSysData.StreamSoundListCriticalSection ) ; + if( SoundSysData.InitializeFlag ) + { + CriticalSection_Delete( &SoundSysData._3DSoundListCriticalSection ) ; + CriticalSection_Delete( &SoundSysData.Play3DSoundListCriticalSection ) ; + CriticalSection_Delete( &SoundSysData.StreamSoundListCriticalSection ) ; + } // 環境依存処理 if( TerminateSoundSystem_PF_Timing1() < 0 ) @@ -363,6 +368,8 @@ extern int TerminateSoundSystem( void ) // 初期化フラグを倒す SoundSysData.InitializeFlag = FALSE ; + DXST_LOGFILE_ADDUTF16LE( "\x8c\x5b\x86\x4e\x0a\x00\x00"/*@ L"完了\n" @*/ ) ; + // 終了 return 0 ; } @@ -8417,6 +8424,23 @@ extern int NS_SetUseOldVolumeCalcFlag( int Flag ) return 0 ; } +// GetSoundCurrentTime などを使用した場合に取得できる再生時間のタイプを設定する +extern int NS_SetSoundCurrentTimeType( int Type /* DX_SOUNDCURRENTTIME_TYPE_LOW_LEVEL など */ ) +{ + // タイプを保存 + SoundSysData.CurrentTimeType = Type ; + + // 正常終了 + return 0 ; +} + +// GetSoundCurrentTime などを使用した場合に取得できる再生時間のタイプを取得する +extern int NS_GetSoundCurrentTimeType( void ) +{ + // タイプを返す + return SoundSysData.CurrentTimeType ; +} + // 次に作成するサウンドを3Dサウンド用にするかどうかを設定する( TRUE:3Dサウンド用にする FALSE:3Dサウンド用にしない( デフォルト ) ) extern int NS_SetCreate3DSoundFlag( int Flag ) { @@ -8753,6 +8777,7 @@ extern int SoundBuffer_Initialize( SOUNDBUFFER *Buffer, DWORD Bytes, WAVEFORMATE Buffer->CalcVolume = 1.0f ; Buffer->EnableTopPos = FALSE ; Buffer->TopPos_TotalWriteSamples = 0 ; + Buffer->ChangeFrequency = FALSE ; if( Src != NULL ) { @@ -8890,13 +8915,17 @@ extern int SoundBuffer_Play( SOUNDBUFFER *Buffer, int Loop ) AddSimpleList( &SoundSysData.PlaySoundBufferListFirst, ( SIMPLELIST * )&Buffer->PlaySoundBufferList, Buffer ) ; // サウンドデータの追加を始めるサンプル位置を算出 +#if defined( _MSC_VER ) && _MSC_VER == 1200 + Buffer->TopPos_TotalWriteSamples = ( ULONGLONG )_DTOL64( ( double )( LONGLONG )SoundSysData.SelfMixingTotalWriteSamples * Buffer->Format.nSamplesPerSec / SoundSysData.SelfMixingFormat.nSamplesPerSec ) - Buffer->CompPos ; +#else Buffer->TopPos_TotalWriteSamples = ( ULONGLONG )_DTOL64( ( double )SoundSysData.SelfMixingTotalWriteSamples * Buffer->Format.nSamplesPerSec / SoundSysData.SelfMixingFormat.nSamplesPerSec ) - Buffer->CompPos ; +#endif Buffer->EnableTopPos = TRUE ; } // 再生遅延サンプル数をセット - Buffer->OutputDelaySamples = SoundSysData.SelfMixingOutputDelaySamples ; - SoundSysData.SelfMixingOutputDelaySamples += SoundSysData.SelfMixingOutputDelaySamplesUnit + NS_GetRand( 16 ) ; + Buffer->OutputDelaySamples = 0 /* SoundSysData.SelfMixingOutputDelaySamples */ ; + SoundSysData.SelfMixingOutputDelaySamples += SoundSysData.SelfMixingOutputDelaySamplesUnit ; Buffer->State = TRUE ; @@ -9037,7 +9066,7 @@ extern int SoundBuffer_Unlock( SOUNDBUFFER *Buffer, void *LockPos1, DWORD LockSi extern int SoundBuffer_SetFrequency( SOUNDBUFFER *Buffer, DWORD Frequency ) { if( Buffer->Valid == FALSE ) return -1 ; - + if( Frequency == 0 ) { Buffer->Frequency = -1 ; @@ -9058,6 +9087,8 @@ extern int SoundBuffer_SetFrequency( SOUNDBUFFER *Buffer, DWORD Frequency ) Buffer->EnableComPosF = FALSE ; } + Buffer->ChangeFrequency = TRUE ; + if( SoundSysData.EnableSoundCaptureFlag || SoundSysData.EnableSelfMixingFlag ) { } @@ -9143,43 +9174,160 @@ extern int SoundBuffer_RefreshVolume( SOUNDBUFFER *Buffer ) if( SoundSysData.EnableSoundCaptureFlag || SoundSysData.EnableSelfMixingFlag ) { - if( Buffer->Volume[ 0 ] <= -10000 ) + if( Buffer->Is3DSound ) { - Buffer->CalcVolume = 0.0f ; - } -// else -// if( Buffer->Volume[ 0 ] >= 0 ) -// { -// Buffer->CalcVolume = 1.0f ; -// } - else - { - Buffer->CalcVolume = _POW( 10.0f, Buffer->Volume[ 0 ] / 100.0f / 20.0f ) ; - } + LONG CalcVolume[ 2 ] ; + LONG TempVolume[ 2 ] ; + float OrigVolume[ 2 ] ; + LONG Volume ; + LONG Pan ; - if( Buffer->Pan == -10000 ) - { - Buffer->CalcPan = -1.0f ; - } - else - if( Buffer->Pan == 10000 ) - { - Buffer->CalcPan = 1.0f ; - } - else - if( Buffer->Pan == 0 ) - { - Buffer->CalcPan = 0.0f ; + OrigVolume[ 0 ] = D_XAudio2DecibelsToAmplitudeRatio( Buffer->Volume[ 0 ] / 100.0f ) ; + OrigVolume[ 1 ] = D_XAudio2DecibelsToAmplitudeRatio( Buffer->Volume[ 1 ] / 100.0f ) ; + + if( Buffer->DSound_Calc3DPan < 0.0f ) + { + OrigVolume[ 0 ] *= 1.0f + Buffer->DSound_Calc3DPan ; + } + else + if( Buffer->DSound_Calc3DPan > 0.0f ) + { + OrigVolume[ 1 ] *= 1.0f - Buffer->DSound_Calc3DPan ; + } + + TempVolume[ 0 ] = ( LONG )_DTOL( D_XAudio2AmplitudeRatioToDecibels( OrigVolume[ 0 ] * Buffer->DSound_Calc3DVolume ) * 100.0f ) ; + TempVolume[ 1 ] = ( LONG )_DTOL( D_XAudio2AmplitudeRatioToDecibels( OrigVolume[ 1 ] * Buffer->DSound_Calc3DVolume ) * 100.0f ) ; + + if( Buffer->Pan < 0 ) + { + CalcVolume[ 0 ] = 10000 ; + CalcVolume[ 1 ] = 10000 + Buffer->Pan ; + } + else + { + CalcVolume[ 0 ] = 10000 - Buffer->Pan ; + CalcVolume[ 1 ] = 10000 ; + } + + if( TempVolume[ 0 ] > 0 ) + { + TempVolume[ 0 ] = 0 ; + } + else + if( TempVolume[ 0 ] < -10000 ) + { + TempVolume[ 0 ] = -10000 ; + } + if( TempVolume[ 1 ] > 0 ) + { + TempVolume[ 1 ] = 0 ; + } + else + if( TempVolume[ 1 ] < -10000 ) + { + TempVolume[ 1 ] = -10000 ; + } + + CalcVolume[ 0 ] = CalcVolume[ 0 ] * ( TempVolume[ 0 ] + 10000 ) / 10000 ; + CalcVolume[ 1 ] = CalcVolume[ 1 ] * ( TempVolume[ 0 ] + 10000 ) / 10000 ; + + if( CalcVolume[ 0 ] > CalcVolume[ 1 ] ) + { + Volume = CalcVolume[ 0 ] - 10000 ; + Pan = _FTOL( CalcVolume[ 1 ] * ( 10000.0f / CalcVolume[ 0 ] ) ) - 10000 ; + } + else + if( CalcVolume[ 0 ] < CalcVolume[ 1 ] ) + { + Volume = CalcVolume[ 1 ] - 10000 ; + Pan = -( _FTOL( CalcVolume[ 0 ] * ( 10000.0f / CalcVolume[ 1 ] ) ) - 10000 ) ; + } + else + { + Volume = CalcVolume[ 0 ] - 10000 ; + Pan = 0 ; + } + + if( Volume <= -10000 ) + { + Buffer->CalcVolume = 0.0f ; + } + // else + // if( Volume >= 0 ) + // { + // Buffer->CalcVolume = 1.0f ; + // } + else + { + Buffer->CalcVolume = _POW( 10.0f, Volume / 100.0f / 20.0f ) ; + } + + if( Pan == -10000 ) + { + Buffer->CalcPan = -1.0f ; + } + else + if( Pan == 10000 ) + { + Buffer->CalcPan = 1.0f ; + } + else + if( Pan == 0 ) + { + Buffer->CalcPan = 0.0f ; + } + else + { + if( Pan < 0.0f ) + { + Buffer->CalcPan = -( 1.0f - _POW( 10.0f, -_ABS( Pan ) / 100.0f / 20.0f ) ) ; + } + else + { + Buffer->CalcPan = 1.0f - _POW( 10.0f, -_ABS( Pan ) / 100.0f / 20.0f ) ; + } + } } else { - if( Buffer->Pan < 0.0f ) + if( Buffer->Volume[ 0 ] <= -10000 ) { - Buffer->CalcPan = -( 1.0f - _POW( 10.0f, -_ABS( Buffer->Pan ) / 100.0f / 20.0f ) ) ; + Buffer->CalcVolume = 0.0f ; } + // else + // if( Buffer->Volume[ 0 ] >= 0 ) + // { + // Buffer->CalcVolume = 1.0f ; + // } else { - Buffer->CalcPan = 1.0f - _POW( 10.0f, -_ABS( Buffer->Pan ) / 100.0f / 20.0f ) ; + Buffer->CalcVolume = _POW( 10.0f, Buffer->Volume[ 0 ] / 100.0f / 20.0f ) ; + } + + if( Buffer->Pan == -10000 ) + { + Buffer->CalcPan = -1.0f ; + } + else + if( Buffer->Pan == 10000 ) + { + Buffer->CalcPan = 1.0f ; + } + else + if( Buffer->Pan == 0 ) + { + Buffer->CalcPan = 0.0f ; + } + else + { + if( Buffer->Pan < 0.0f ) + { + Buffer->CalcPan = -( 1.0f - _POW( 10.0f, -_ABS( Buffer->Pan ) / 100.0f / 20.0f ) ) ; + } + else + { + Buffer->CalcPan = 1.0f - _POW( 10.0f, -_ABS( Buffer->Pan ) / 100.0f / 20.0f ) ; + } } } } @@ -9242,7 +9390,9 @@ extern int SoundBuffer_GetCurrentPosition( SOUNDBUFFER *Buffer, DWORD *PlayPos, { if( PlayPos ) { - if( Buffer->EnableTopPos && ( Buffer->Frequency <= 0 || ( DWORD )Buffer->Frequency == Buffer->Format.nSamplesPerSec ) /* && SoundSysData.SelfMixingInitlizeTotalPlayTimeBaseCountFlag */ ) + if( SoundSysData.CurrentTimeType == DX_SOUNDCURRENTTIME_TYPE_LOW_LEVEL && + Buffer->State && Buffer->EnableTopPos && Buffer->ChangeFrequency == FALSE && + ( Buffer->Frequency <= 0 || ( DWORD )Buffer->Frequency == Buffer->Format.nSamplesPerSec ) /* && SoundSysData.SelfMixingInitlizeTotalPlayTimeBaseCountFlag */ ) { // ULONGLONG TotalPlayTime ; ULONGLONG TotalPlaySamples ; @@ -9253,7 +9403,11 @@ extern int SoundBuffer_GetCurrentPosition( SOUNDBUFFER *Buffer, DWORD *PlayPos, if( GetSoundSystemTotalPlaySamples_PF( &TotalPlaySamples, &Frequency ) >= 0 ) { +#if defined( _MSC_VER ) && _MSC_VER == 1200 + ULONGLONG BufferFormatTotalPlaySamples = ( ULONGLONG )_DTOL64( ( double )( LONGLONG )TotalPlaySamples * ( LONGLONG )Buffer->Format.nSamplesPerSec / ( LONGLONG )Frequency ) ; +#else ULONGLONG BufferFormatTotalPlaySamples = ( ULONGLONG )_DTOL64( ( double )TotalPlaySamples * Buffer->Format.nSamplesPerSec / Frequency ) ; +#endif if( Buffer->TopPos_TotalWriteSamples > BufferFormatTotalPlaySamples ) { @@ -11187,6 +11341,166 @@ extern int SetupSelfMixingWorkBuffer( int IsFloat, int Samples ) }\ } +#define HZ_CHANGE_SRC_1CH_S24_PARTS0\ + {\ + BYTE *SrcBuf = ( BYTE * )SoundBuf->Wave->Buffer + CompPos * 3 ;\ +\ + Src1_P = ( short )( SrcBuf[ 1 ] | ( SrcBuf[ 2 ] << 8 ) ) ;\ + if( CompPos == SoundBuf->SampleNum - 1 )\ + {\ + if( SoundBuf->Loop == TRUE )\ + {\ + Src1_N = ( short )( ( ( BYTE * )SoundBuf->Wave->Buffer )[ 1 ] | ( ( ( BYTE * )SoundBuf->Wave->Buffer )[ 2 ] << 8 ) ) ;\ + }\ + else\ + {\ + Src1_N = 0 ;\ + }\ + }\ + else\ + {\ + Src1_N = ( short )( SrcBuf[ 4 ] | ( SrcBuf[ 5 ] << 8 ) ) ;\ + }\ +\ + while( OutputSampleNum > 0 )\ + { + +#define HZ_CHANGE_SRC_1CH_S24_PARTS1\ + OutputSampleNum -- ;\ +\ + Ratio += SampleAdd ;\ + while( Ratio >= 1.0 )\ + {\ + Ratio -= 1.0 ;\ + CompPos ++ ;\ + SrcBuf += 3 ;\ + Src1_P = Src1_N ;\ + if( CompPos >= SoundBuf->SampleNum )\ + {\ + if( SoundBuf->Loop == TRUE )\ + {\ + CompPos = 0 ;\ + SrcBuf = ( BYTE * )SoundBuf->Wave->Buffer ;\ + Src1_N = ( short )( SrcBuf[ 4 ] | ( SrcBuf[ 5 ] << 8 ) ) ;\ + }\ + else\ + {\ + Ratio = 0.0 ;\ + SoundBuf->CompPos = SoundBuf->SampleNum ;\ + SoundBuf->PlayPos = SoundBuf->CompPos ;\ + SoundBuf->State = FALSE ;\ + SoundBuf->AddPlaySoundBufferList = FALSE ;\ + SubSimpleList( ( SIMPLELIST * )&SoundBuf->PlaySoundBufferList ) ;\ + OutputSampleNum = 0 ;\ + break ;\ + }\ + }\ + else\ + {\ + if( CompPos == SoundBuf->SampleNum - 1 )\ + {\ + if( SoundBuf->Loop == TRUE )\ + {\ + Src1_N = ( short )( ( ( BYTE * )SoundBuf->Wave->Buffer )[ 1 ] | ( ( ( BYTE * )SoundBuf->Wave->Buffer )[ 2 ] << 8 ) ) ;\ + }\ + else\ + {\ + Src1_N = 0 ;\ + }\ + }\ + else\ + {\ + Src1_N = ( short )( SrcBuf[ 4 ] | ( SrcBuf[ 5 ] << 8 ) ) ;\ + }\ + }\ + }\ + }\ + } + +#define HZ_CHANGE_SRC_2CH_S24_PARTS0\ + {\ + BYTE *SrcBuf = ( BYTE * )SoundBuf->Wave->Buffer + CompPos * 6 ;\ +\ + Src1_P = ( short )( SrcBuf[ 1 ] | ( SrcBuf[ 2 ] << 8 ) ) ;\ + Src2_P = ( short )( SrcBuf[ 4 ] | ( SrcBuf[ 5 ] << 8 ) ) ;\ + if( CompPos == SoundBuf->SampleNum - 1 )\ + {\ + if( SoundBuf->Loop == TRUE )\ + {\ + Src1_N = ( short )( ( ( BYTE * )SoundBuf->Wave->Buffer )[ 1 ] | ( ( ( BYTE * )SoundBuf->Wave->Buffer )[ 2 ] << 8 ) ) ;\ + Src2_N = ( short )( ( ( BYTE * )SoundBuf->Wave->Buffer )[ 4 ] | ( ( ( BYTE * )SoundBuf->Wave->Buffer )[ 5 ] << 8 ) ) ;\ + }\ + else\ + {\ + Src1_N = 0 ;\ + Src2_N = 0 ;\ + }\ + }\ + else\ + {\ + Src1_N = ( short )( SrcBuf[ 7 ] | ( SrcBuf[ 8 ] << 8 ) ) ;\ + Src2_N = ( short )( SrcBuf[ 10 ] | ( SrcBuf[ 11 ] << 8 ) ) ;\ + }\ +\ + while( OutputSampleNum > 0 )\ + { + +#define HZ_CHANGE_SRC_2CH_S24_PARTS1\ + OutputSampleNum -- ;\ +\ + Ratio += SampleAdd ;\ + while( Ratio >= 1.0 )\ + {\ + Ratio -= 1.0 ;\ + CompPos ++ ;\ + SrcBuf += 6 ;\ + Src1_P = Src1_N ;\ + Src2_P = Src2_N ;\ + if( CompPos >= SoundBuf->SampleNum )\ + {\ + if( SoundBuf->Loop == TRUE )\ + {\ + CompPos = 0 ;\ + SrcBuf = ( BYTE * )SoundBuf->Wave->Buffer ;\ + Src1_N = ( short )( SrcBuf[ 7 ] | ( SrcBuf[ 8 ] << 8 ) ) ;\ + Src2_N = ( short )( SrcBuf[ 10 ] | ( SrcBuf[ 11 ] << 8 ) ) ;\ + }\ + else\ + {\ + Ratio = 0.0 ;\ + SoundBuf->CompPos = SoundBuf->SampleNum ;\ + SoundBuf->PlayPos = SoundBuf->CompPos ;\ + SoundBuf->State = FALSE ;\ + SoundBuf->AddPlaySoundBufferList = FALSE ;\ + SubSimpleList( ( SIMPLELIST * )&SoundBuf->PlaySoundBufferList ) ;\ + OutputSampleNum = 0 ;\ + break ;\ + }\ + }\ + else\ + {\ + if( CompPos == SoundBuf->SampleNum - 1 )\ + {\ + if( SoundBuf->Loop == TRUE )\ + {\ + Src1_N = ( short )( ( ( BYTE * )SoundBuf->Wave->Buffer )[ 1 ] | ( ( ( BYTE * )SoundBuf->Wave->Buffer )[ 2 ] << 8 ) ) ;\ + Src2_N = ( short )( ( ( BYTE * )SoundBuf->Wave->Buffer )[ 4 ] | ( ( ( BYTE * )SoundBuf->Wave->Buffer )[ 5 ] << 8 ) ) ;\ + }\ + else\ + {\ + Src1_N = 0 ;\ + Src2_N = 0 ;\ + }\ + }\ + else\ + {\ + Src1_N = ( short )( SrcBuf[ 7 ] | ( SrcBuf[ 8 ] << 8 ) ) ;\ + Src2_N = ( short )( SrcBuf[ 10 ] | ( SrcBuf[ 11 ] << 8 ) ) ;\ + }\ + }\ + }\ + }\ + } #define DESTADD_FLOAT_1CH\ DestBufF[ 0 ] += ( float )Output0 * Scale0 ;\ @@ -11230,13 +11544,13 @@ extern int SetupSelfMixingWorkBuffer( int IsFloat, int Samples ) if( IsScale )\ {\ INT_SRC_PARTS0\ - DEST_INT_ADD\ + DEST_INT_ADD_SCALE\ INT_SRC_PARTS1( TYPE, CH_NUM )\ }\ else\ {\ INT_SRC_PARTS0\ - DEST_INT_ADD_SCALE\ + DEST_INT_ADD\ INT_SRC_PARTS1( TYPE, CH_NUM )\ }\ } @@ -11277,6 +11591,24 @@ extern int SetupSelfMixingWorkBuffer( int IsFloat, int Samples ) Output0 = SrcBuf[ 0 ] ;\ Output1 = SrcBuf[ 1 ] ; +#define INT_SRC_1CH_S24_PARTS0\ + {\ + BYTE *SrcBuf = ( BYTE * )SoundBuf->Wave->Buffer + CompPos * 3 ;\ +\ + while( OutputSampleNum > 0 )\ + {\ + Output0 = ( short )( SrcBuf[ 1 ] | ( SrcBuf[ 2 ] << 8 ) ) ;\ + Output1 = Output0 ; + +#define INT_SRC_2CH_S24_PARTS0\ + {\ + BYTE *SrcBuf = ( BYTE * )SoundBuf->Wave->Buffer + CompPos * 6 ;\ +\ + while( OutputSampleNum > 0 )\ + {\ + Output0 = ( short )( SrcBuf[ 1 ] | ( SrcBuf[ 2 ] << 8 ) ) ;\ + Output1 = ( short )( SrcBuf[ 4 ] | ( SrcBuf[ 5 ] << 8 ) ) ; + #define INT_SRC_PARTS1( TYPE, CH_NUM )\ SrcBuf += CH_NUM ;\ \ @@ -11418,6 +11750,11 @@ extern int WriteSelfMixingSample( BYTE *Buffer0, BYTE *Buffer1, DWORD Stride, DW DEST_HZ_CHANGE_CODE( HZ_CHANGE_SRC_2CH_S16_PARTS0, HZ_CHANGE_SRC_2CH_S16_PARTS1, DEST_INT_HZ_CHANGE_2CH_ADD_SCALE_PARTS, DEST_INT_HZ_CHANGE_2CH_ADD_PARTS, DEST_FLOAT_HZ_CHANGE_2CH_ADD_PARTS ) } else + if( SoundBuf->Format.wBitsPerSample == 24 ) + { + DEST_HZ_CHANGE_CODE( HZ_CHANGE_SRC_2CH_S24_PARTS0, HZ_CHANGE_SRC_2CH_S24_PARTS1, DEST_INT_HZ_CHANGE_2CH_ADD_SCALE_PARTS, DEST_INT_HZ_CHANGE_2CH_ADD_PARTS, DEST_FLOAT_HZ_CHANGE_2CH_ADD_PARTS ) + } + else { DEST_HZ_CHANGE_CODE( HZ_CHANGE_SRC_2CH_U8_PARTS0, HZ_CHANGE_SRC_2CH_U8_PARTS1, DEST_INT_HZ_CHANGE_2CH_ADD_SCALE_PARTS, DEST_INT_HZ_CHANGE_2CH_ADD_PARTS, DEST_FLOAT_HZ_CHANGE_2CH_ADD_PARTS ) } @@ -11429,6 +11766,11 @@ extern int WriteSelfMixingSample( BYTE *Buffer0, BYTE *Buffer1, DWORD Stride, DW DEST_HZ_CHANGE_CODE( HZ_CHANGE_SRC_1CH_S16_PARTS0, HZ_CHANGE_SRC_1CH_S16_PARTS1, DEST_INT_HZ_CHANGE_1CH_ADD_SCALE_PARTS, DEST_INT_HZ_CHANGE_1CH_ADD_PARTS, DEST_FLOAT_HZ_CHANGE_1CH_ADD_PARTS ) } else + if( SoundBuf->Format.wBitsPerSample == 24 ) + { + DEST_HZ_CHANGE_CODE( HZ_CHANGE_SRC_1CH_S24_PARTS0, HZ_CHANGE_SRC_1CH_S24_PARTS1, DEST_INT_HZ_CHANGE_1CH_ADD_SCALE_PARTS, DEST_INT_HZ_CHANGE_1CH_ADD_PARTS, DEST_FLOAT_HZ_CHANGE_1CH_ADD_PARTS ) + } + else { DEST_HZ_CHANGE_CODE( HZ_CHANGE_SRC_1CH_U8_PARTS0, HZ_CHANGE_SRC_1CH_U8_PARTS1, DEST_INT_HZ_CHANGE_1CH_ADD_SCALE_PARTS, DEST_INT_HZ_CHANGE_1CH_ADD_PARTS, DEST_FLOAT_HZ_CHANGE_1CH_ADD_PARTS ) } @@ -11447,6 +11789,11 @@ extern int WriteSelfMixingSample( BYTE *Buffer0, BYTE *Buffer1, DWORD Stride, DW INT_CONVCODE( INT_SRC_2CH_S16_PARTS0, short, 2, DESTADD_INT_2CH_SCALE, DESTADD_INT_2CH, DESTADD_FLOAT_2CH ) } else + if( SoundBuf->Format.wBitsPerSample == 24 ) + { + INT_CONVCODE( INT_SRC_2CH_S24_PARTS0, BYTE, 6, DESTADD_INT_2CH_SCALE, DESTADD_INT_2CH, DESTADD_FLOAT_2CH ) + } + else { INT_CONVCODE( INT_SRC_2CH_U8_PARTS0, BYTE, 2, DESTADD_INT_2CH_SCALE, DESTADD_INT_2CH, DESTADD_FLOAT_2CH ) } @@ -11458,6 +11805,11 @@ extern int WriteSelfMixingSample( BYTE *Buffer0, BYTE *Buffer1, DWORD Stride, DW INT_CONVCODE( INT_SRC_1CH_S16_PARTS0, short, 1, DESTADD_INT_1CH_SCALE, DESTADD_INT_1CH, DESTADD_FLOAT_1CH ) } else + if( SoundBuf->Format.wBitsPerSample == 24 ) + { + INT_CONVCODE( INT_SRC_1CH_S24_PARTS0, BYTE, 3, DESTADD_INT_1CH_SCALE, DESTADD_INT_1CH, DESTADD_FLOAT_1CH ) + } + else { INT_CONVCODE( INT_SRC_1CH_U8_PARTS0, BYTE, 1, DESTADD_INT_1CH_SCALE, DESTADD_INT_1CH, DESTADD_FLOAT_1CH ) } @@ -11761,12 +12113,12 @@ extern int WriteSelfMixingSample( BYTE *Buffer0, BYTE *Buffer1, DWORD Stride, DW DWORD Dest1D ; Dest0D = ( DWORD )BufferI[ 0 ] ; Dest1D = ( DWORD )BufferI[ 1 ] ; - Buffer0[ 0 ] = ( BYTE )Dest0D ; - Buffer0[ 1 ] = ( BYTE )( Dest0D >> 8 ) ; - Buffer0[ 2 ] = ( BYTE )( Dest0D >> 16 ) ; - Buffer1[ 0 ] = ( BYTE )Dest1D ; - Buffer1[ 1 ] = ( BYTE )( Dest1D >> 8 ) ; - Buffer1[ 2 ] = ( BYTE )( Dest1D >> 16 ) ; + Buffer0[ 0 ] = ( BYTE )0 ; + Buffer0[ 1 ] = ( BYTE )Dest0D ; + Buffer0[ 2 ] = ( BYTE )( Dest0D >> 8 ) ; + Buffer1[ 0 ] = ( BYTE )0 ; + Buffer1[ 1 ] = ( BYTE )Dest1D ; + Buffer1[ 2 ] = ( BYTE )( Dest1D >> 8 ) ; Buffer0 += Stride ; Buffer1 += Stride ; } diff --git a/DxSound.h b/DxSound.h index 6748567..390338a 100644 --- a/DxSound.h +++ b/DxSound.h @@ -2,7 +2,7 @@ // // DXライブラリ サウンドプログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -20,6 +20,7 @@ #include "DxSoundConvert.h" #include "DxHandle.h" #include "DxFile.h" +#include "DxBaseFunc.h" #ifdef WINDOWS_DESKTOP_OS #include "Windows/DxSoundWin.h" @@ -142,6 +143,7 @@ struct SOUNDBUFFER int Pan ; // パン( 10000:左100%右0% 0:左右100% -100000:右100% ) int Volume[ SOUNDBUFFER_MAX_CHANNEL_NUM ] ; // ボリューム( 10000:0% 0:100% ) int Frequency ; // 再生周波数( -1:デフォルト ) + int ChangeFrequency ; // 一度でも再生周波数を変えたかどうか( TRUE:変えた FALSE:変えていない ) int SampleNum ; // サンプルの数 WAVEFORMATEX Format ; // バッファのフォーマット @@ -405,6 +407,7 @@ struct SOUNDSYSTEMDATA int Create3DSoundFlag ; // 3Dサウンドを作成するかどうかのフラグ( TRUE:3Dサウンドを作成する FALSE:3Dサウンドを作成しない ) int OldVolumeTypeFlag ; // Ver3.10c以前の音量計算式を使用するかどうかのフラグ( TRUE:古い計算式を使用する FALSE:新しい計算式を使用する ) int SoundMode ; // 再生形式 + int CurrentTimeType ; // GetSoundCurrentTime などを使用した場合に取得できる再生時間のタイプ int MaxVolume ; // 最大音量 @@ -586,6 +589,22 @@ extern MIDISYSTEMDATA MidiSystemData ; extern int ConvertIntToFloatSoftSound( int SrcSoftSoundHandle, int DestSoftSoundHandle ) ; // int型のサウンドデータから float型のサウンドデータをセットアップする extern int ConvertFloatToIntSoftSound( int SrcSoftSoundHandle, int DestSoftSoundHandle ) ; // float型のサウンドデータから int型のサウンドデータをセットアップする +// デシベル値から XAudio2 の率値に変換する関数 +__inline float D_XAudio2DecibelsToAmplitudeRatio( float Decibels ) +{ + return _POW( 10.0f, Decibels / 20.0f ) ; +} + +// XAudio2 の率値からデシベル値に変換する関数 +__inline float D_XAudio2AmplitudeRatioToDecibels( float Volume ) +{ + if( Volume == 0 ) + { + return -3.402823466e+38f ; + } + return 20.0f * ( float )_LOG10( Volume ) ; +} + diff --git a/DxSoundConvert.cpp b/DxSoundConvert.cpp index 642dc1d..710bbb9 100644 --- a/DxSoundConvert.cpp +++ b/DxSoundConvert.cpp @@ -2,7 +2,7 @@ // // DXライブラリ サウンドデータ変換プログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxSoundConvert.h b/DxSoundConvert.h index b4748f8..b777c87 100644 --- a/DxSoundConvert.h +++ b/DxSoundConvert.h @@ -2,7 +2,7 @@ // // DXライブラリ サウンドデータ変換プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxStatic.h b/DxStatic.h index 23190c1..d094181 100644 --- a/DxStatic.h +++ b/DxStatic.h @@ -2,7 +2,7 @@ // // DXライブラリ 内部使用関連用ヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ---------------------------------------------------------------------------- @@ -463,7 +463,8 @@ namespace DxLib extern int NS_GetWindowMaxSizeFlag( void ) ; // メインウインドウが最大化されているかどうかを取得する( 戻り値 TRUE:最大化されている FALSE:最大化されていない ) extern HWND NS_GetMainWindowHandle( void ) ; // メインウインドウのハンドルを取得する extern int NS_GetWindowModeFlag( void ) ; // ウインドウモードで起動しているか、のフラグを取得する -extern int NS_GetDefaultState( int *SizeX , int *SizeY , int *ColorBitDepth, int *RefreshRate = NULL , int *LeftTopX = NULL , int *LeftTopY = NULL, int *PixelSizeX = NULL , int *PixelSizeY = NULL ) ; // 起動時のデスクトップの画面モードを取得する +extern int NS_GetDefaultState( int *SizeX , int *SizeY , int *ColorBitDepth, int *RefreshRate = NULL , int *LeftTopX = NULL , int *LeftTopY = NULL, int *PixelSizeX = NULL , int *PixelSizeY = NULL , int *XDpi = NULL , int *YDpi = NULL ) ; // 起動時のデスクトップの画面モードを取得する +extern int NS_GetMonitorDpi( int *XDpi, int *YDpi, int MonitorIndex = -1 ) ; // モニターのDPIを取得する extern int NS_GetActiveFlag( void ) ; // ソフトがアクティブかどうかを取得する extern int NS_GetNoActiveState( int ResetFlag = TRUE ) ; // 非アクティブになり、処理が一時停止していたかどうかを取得する(引数 ResetFlag=TRUE:状態をリセット FALSE:状態をリセットしない 戻り値: 0=一時停止はしていない 1=一時停止していた ) extern int NS_GetMouseDispFlag( void ) ; // マウスを表示するかどうかのフラグを取得する @@ -541,6 +542,7 @@ namespace DxLib extern int NS_SetUseUpdateLayerdWindowFlag( int Flag ) ; // UpdateLayerdWindowForBaseImage や UpdateLayerdWindowForSoftImage を使用するかどうかを設定する( TRUE:使用する FALSE:使用しない ) extern int NS_SetResourceModule( HMODULE ResourceModule ) ; // リソースを読み込む際に使用するモジュールを設定する( NULL を指定すると初期状態に戻ります、デフォルトでは NULL ) extern int NS_SetUseDxLibWM_PAINTProcess( int Flag ) ; // WM_PAINT メッセージが来た際に『DXライブラリの WM_PAINTメッセージが来た際の処理』を行うかどうかを設定する( 別スレッドで描画処理を行う場合などで使用 ) +extern int NS_SetWindows10_WM_CHAR_CancelTime( int MilliSecond ) ; // Windows10 で WM_CHAR で短時間に連続して同じ文字が入力された場合の無効扱いにする時間を設定する( MilliSecond のミリ秒以内に連続して同じ文字が入力された場合に無効にする、MilliSecond の値をマイナスにするとデフォルトの設定に戻る ) // ドラッグ&ドロップされたファイル関係 extern int NS_SetDragFileValidFlag( int Flag ) ; // ファイルのドラッグ&ドロップ機能を有効にするかどうかのフラグをセットする @@ -1013,6 +1015,7 @@ namespace DxLib extern int NS_SetKeyExclusiveCooperativeLevelFlag( int Flag ) ; // DirectInput のキーボードの協調レベルを排他レベルにするかどうかを設定する( TRUE:排他レベルにする FALSE:標準レベルにする( デフォルト ) )、DxLib_Init の呼び出し前でのみ実行可能  extern int NS_SetKeyboardNotDirectInputFlag( int Flag ) ; // キーボードの入力処理に DirectInput を使わないかどうかを設定する( TRUE:DirectInput を使わず、Windows標準機能を使用する  FALSE:DirectInput を使用する ) extern int NS_SetUseDirectInputFlag( int Flag ) ; // 入力処理に DirectInput を使用するかどうかを設定する( TRUE:DirectInput を使用する  FALSE:DirectInput を使わず、Windows標準機能を使用する ) +extern int NS_SetDirectInputMouseMode( int Mode ) ; // マウスの入力処理に DirectInput を使用する場合の動作モードを設定する( 0:ウィンドウがアクティブな場合のみ DirectInput を使用する 1:ウィンドウのアクティブ状態に関係なく DirectInput を使用する ) extern int NS_SetUseXInputFlag( int Flag ) ; // Xbox360コントローラの入力処理に XInput を使用するかどうかを設定する( TRUE:XInput を使用する( デフォルト )  FALSE:XInput を使用しない ) extern int NS_SetUseXboxControllerDirectInputFlag( int Flag ) ; // Xbox360コントローラや Xbox Oneコントローラを DirectInputコントローラとしても検出するかどうかを設定する( TRUE:DirectInputコントローラとしても検出する FALSE:DirectInputコントローラとしては検出しない(デフォルト) ) extern int NS_GetJoypadGUID( int PadIndex, GUID *GuidInstanceBuffer, GUID *GuidProductBuffer ) ; // ジョイパッドのGUIDを得る @@ -1301,6 +1304,7 @@ namespace DxLib extern int NS_DrawTriangle3DD( VECTOR_D Pos1, VECTOR_D Pos2, VECTOR_D Pos3, unsigned int Color, int FillFlag ) ; // 3Dの三角形を描画する extern int NS_DrawCube3D( VECTOR Pos1, VECTOR Pos2, unsigned int DifColor, unsigned int SpcColor, int FillFlag ) ; // 3Dの立方体を描画する extern int NS_DrawCube3DD( VECTOR_D Pos1, VECTOR_D Pos2, unsigned int DifColor, unsigned int SpcColor, int FillFlag ) ; // 3Dの立方体を描画する +extern int NS_DrawCubeSet3D( CUBEDATA *CubeDataArray, int Num, int FillFlag ) ; // 3Dの立方体の集合を描画する extern int NS_DrawSphere3D( VECTOR CenterPos, float r, int DivNum, unsigned int DifColor, unsigned int SpcColor, int FillFlag ) ; // 3Dの球体を描画する extern int NS_DrawSphere3DD( VECTOR_D CenterPos, double r, int DivNum, unsigned int DifColor, unsigned int SpcColor, int FillFlag ) ; // 3Dの球体を描画する extern int NS_DrawCapsule3D( VECTOR Pos1, VECTOR Pos2, float r, int DivNum, unsigned int DifColor, unsigned int SpcColor, int FillFlag ) ; // 3Dのカプセルを描画する @@ -1364,6 +1368,7 @@ extern int NS_DrawRectRotaGraph3F( float x, float y, int SrcX, int SrcY, extern int NS_DrawBlendGraphPos( int x, int y, int GrHandle, int TransFlag, int bx, int by, int BlendGraph, int BorderParam, int BorderRange ) ; // ブレンド画像と合成して画像を描画する( ブレンド画像の起点座標を指定する版 ) extern int NS_DrawCircleGauge( int CenterX, int CenterY, double Percent, int GrHandle, double StartPercent = 0.0 , double Scale = 1.0 , int ReverseX = FALSE , int ReverseY = FALSE ) ; // 円グラフ的な描画を行う( GrHandle の画像の上下左右の端は透過色にしておく必要があります ) +extern int NS_DrawCircleGaugeF( float CenterX, float CenterY, double Percent, int GrHandle, double StartPercent = 0.0 , double Scale = 1.0 , int ReverseX = FALSE , int ReverseY = FALSE ) ; // 円グラフ的な描画を行う( GrHandle の画像の上下左右の端は透過色にしておく必要があります )( 座標指定が float 版 ) extern int NS_DrawGraphToZBuffer( int X, int Y, int GrHandle, int WriteZMode /* DX_ZWRITE_MASK 等 */ ) ; // Zバッファに対して画像の描画を行う extern int NS_DrawTurnGraphToZBuffer( int x, int y, int GrHandle, int WriteZMode /* DX_ZWRITE_MASK 等 */ ) ; // Zバッファに対して画像の左右反転描画 @@ -1432,6 +1437,7 @@ extern int NS_DrawRectRotaGraph3F( float x, float y, int SrcX, int SrcY, extern int NS_CheckSeparateAlphaBlendEnable( void ) ; // 描画先のアルファチャンネルの内容を書き換えないことができるかどうかを取得する( TRUE:書き換えないことができる FALSE:書き換えないことができない ) extern int NS_SetIgnoreDrawGraphColor( int EnableFlag ) ; // 描画する画像の色成分を無視するかどうかを指定する( EnableFlag:この機能を使うかどうか( TRUE:使う FALSE:使わない ) ) extern int NS_SetMaxAnisotropy( int MaxAnisotropy ) ; // 最大異方性の値をセットする +extern int NS_GetMaxAnisotropy( void ) ; // 最大異方性値を取得する extern int NS_SetUseLarge3DPositionSupport( int UseFlag ) ; // 3D処理で使用する座標値が 10000000.0f などの大きな値になっても描画の崩れを小さく抑える処理を使用するかどうかを設定する、DxLib_Init の呼び出し前でのみ使用可能( TRUE:描画の崩れを抑える処理を使用する( CPU負荷が上がります )  FALSE:描画の崩れを抑える処理は使用しない( デフォルト ) ) extern int NS_SetUseZBufferFlag( int Flag ) ; // Zバッファを有効にするか、フラグをセットする( 2Dと3D描画に影響 ) @@ -2773,6 +2779,8 @@ extern int NS_CreateColorData( COLORDATA *ColorDataBuf, int ColorBitDe extern int NS_SetEnableASIOFlag( int Flag, int BufferSize = -1 , int SamplePerSec = 44100 ) ; // サウンドの再生にASIOを使用するかどうかを設定する( Flag TRUE:使用する FALSE:使用しない( デフォルト ), BufferSize 再生バッファのサイズ、小さいほど遅延が少なくなりますが、処理が間に合わずにブツブツノイズが発生する可能性も高くなります( -1 でデフォルト値 ), SamplePerSec サンプリングレート ) #endif // DX_NON_ASIO extern int NS_SetUseOldVolumeCalcFlag( int Flag ) ; // ChangeVolumeSoundMem, ChangeNextPlayVolumeSoundMem, ChangeMovieVolumeToGraph の音量計算式を Ver3.10c以前のものを使用するかどうかを設定する( TRUE:Ver3.10c以前の計算式を使用 FALSE:3.10d以降の計算式を使用( デフォルト ) ) +extern int NS_SetSoundCurrentTimeType( int Type /* DX_SOUNDCURRENTTIME_TYPE_LOW_LEVEL など */ ) ; // GetSoundCurrentTime などを使用した場合に取得できる再生時間のタイプを設定する +extern int NS_GetSoundCurrentTimeType( void ) ; // GetSoundCurrentTime などを使用した場合に取得できる再生時間のタイプを取得する extern int NS_SetCreate3DSoundFlag( int Flag ) ; // 次に作成するサウンドハンドルを3Dサウンド用にするかどうかを設定する( TRUE:3Dサウンド用にする FALSE:3Dサウンド用にしない( デフォルト ) ) extern int NS_Set3DSoundOneMetre( float Distance ) ; // 3D空間の1メートルに相当する距離を設定する、DxLib_Init を呼び出す前でのみ呼び出し可能( デフォルト:1.0f ) @@ -2982,7 +2990,7 @@ extern int NS_CreateColorData( COLORDATA *ColorDataBuf, int ColorBitDe extern const TCHAR *NS_Live2D_Model_GetPhysicsFileName( int Live2DModelHandle ) ; // Live2D のモデルの物理演算設定ファイルの名前を取得する extern const TCHAR *NS_Live2D_Model_GetPoseFileName( int Live2DModelHandle ) ; // Live2D のモデルのパーツ切り替え設定ファイルの名前を取得する extern int NS_Live2D_Model_GetExpressionCount( int Live2DModelHandle ) ; // Live2D のモデルの表情設定ファイルの数を取得する -extern const TCHAR *NS_Live2D_Model_GetExpressionName( int Live2DModelHandle, int index ) ; // Live2D のモデルの表情設定ファイルを識別する名前(別名)を取得する +extern const TCHAR *NS_Live2D_Model_GetExpressionName( int Live2DModelHandle, int index ) ; // Live2D のモデルの表情設定ファイルを識別するIDを取得する extern const TCHAR *NS_Live2D_Model_GetExpressionFileName( int Live2DModelHandle, int index ) ; // Live2D のモデルの表情設定ファイルの名前を取得する extern int NS_Live2D_Model_GetMotionGroupCount( int Live2DModelHandle ) ; // Live2D のモデルのモーショングループの数を取得する extern const TCHAR *NS_Live2D_Model_GetMotionGroupName( int Live2DModelHandle, int index ) ; // Live2D のモデルのモーショングループの名前を取得する @@ -3206,6 +3214,7 @@ extern int NS_CreateColorData( COLORDATA *ColorDataBuf, int ColorBitDe #define NS_GetMainWindowHandle GetMainWindowHandle #define NS_GetWindowModeFlag GetWindowModeFlag #define NS_GetDefaultState GetDefaultState +#define NS_GetMonitorDpi GetMonitorDpi #define NS_GetActiveFlag GetActiveFlag #define NS_GetNoActiveState GetNoActiveState #define NS_GetMouseDispFlag GetMouseDispFlag @@ -3283,6 +3292,7 @@ extern int NS_CreateColorData( COLORDATA *ColorDataBuf, int ColorBitDe #define NS_SetUseUpdateLayerdWindowFlag SetUseUpdateLayerdWindowFlag #define NS_SetResourceModule SetResourceModule #define NS_SetUseDxLibWM_PAINTProcess SetUseDxLibWM_PAINTProcess +#define NS_SetWindows10_WM_CHAR_CancelTime SetWindows10_WM_CHAR_CancelTime // ドラッグ&ドロップされたファイル関係 #define NS_SetDragFileValidFlag SetDragFileValidFlag @@ -3732,6 +3742,7 @@ extern int NS_CreateColorData( COLORDATA *ColorDataBuf, int ColorBitDe #define NS_SetKeyboardNotDirectInputFlag SetKeyboardNotDirectInputFlag #define NS_SetUseDirectInputFlag SetUseDirectInputFlag +#define NS_SetDirectInputMouseMode SetDirectInputMouseMode #define NS_SetUseXInputFlag SetUseXInputFlag #define NS_SetUseXboxControllerDirectInputFlag SetUseXboxControllerDirectInputFlag #define NS_SetUseJoypadVibrationFlag SetUseJoypadVibrationFlag @@ -4009,6 +4020,7 @@ extern int NS_CreateColorData( COLORDATA *ColorDataBuf, int ColorBitDe #define NS_DrawTriangle3DD DrawTriangle3DD #define NS_DrawCube3D DrawCube3D #define NS_DrawCube3DD DrawCube3DD +#define NS_DrawCubeSet3D DrawCubeSet3D #define NS_DrawSphere3D DrawSphere3D #define NS_DrawSphere3DD DrawSphere3DD #define NS_DrawCapsule3D DrawCapsule3D @@ -4071,6 +4083,7 @@ extern int NS_CreateColorData( COLORDATA *ColorDataBuf, int ColorBitDe #define NS_DrawBlendGraphPos DrawBlendGraphPos #define NS_DrawCircleGauge DrawCircleGauge +#define NS_DrawCircleGaugeF DrawCircleGaugeF #define NS_DrawGraphToZBuffer DrawGraphToZBuffer #define NS_DrawTurnGraphToZBuffer DrawTurnGraphToZBuffer @@ -4136,6 +4149,7 @@ extern int NS_CreateColorData( COLORDATA *ColorDataBuf, int ColorBitDe #define NS_CheckSeparateAlphaBlendEnable CheckSeparateAlphaBlendEnable #define NS_SetIgnoreDrawGraphColor SetIgnoreDrawGraphColor #define NS_SetMaxAnisotropy SetMaxAnisotropy +#define NS_GetMaxAnisotropy GetMaxAnisotropy #define NS_SetUseLarge3DPositionSupport SetUseLarge3DPositionSupport #define NS_SetUseZBufferFlag SetUseZBufferFlag @@ -5438,6 +5452,8 @@ extern int NS_CreateColorData( COLORDATA *ColorDataBuf, int ColorBitDe #define NS_SetEnableASIOFlag SetEnableASIOFlag #endif // DX_NON_ASIO #define NS_SetUseOldVolumeCalcFlag SetUseOldVolumeCalcFlag +#define NS_SetSoundCurrentTimeType SetSoundCurrentTimeType +#define NS_GetSoundCurrentTimeType GetSoundCurrentTimeType #define NS_SetCreate3DSoundFlag SetCreate3DSoundFlag #define NS_Set3DSoundOneMetre Set3DSoundOneMetre diff --git a/DxSystem.cpp b/DxSystem.cpp index e4781df..3a0fc5d 100644 --- a/DxSystem.cpp +++ b/DxSystem.cpp @@ -2,7 +2,7 @@ // // DXライブラリ システムプログラム // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxSystem.h b/DxSystem.h index 6e8e2e2..2084418 100644 --- a/DxSystem.h +++ b/DxSystem.h @@ -2,7 +2,7 @@ // // DXライブラリ システムプログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxThread.cpp b/DxThread.cpp index ecc7ffe..0ecef82 100644 --- a/DxThread.cpp +++ b/DxThread.cpp @@ -2,7 +2,7 @@ // // DXライブラリ スレッド関係プログラム // -// Ver 3.21d +// Ver 3.21f // //----------------------------------------------------------------------------- diff --git a/DxThread.h b/DxThread.h index ea4edea..00d25bf 100644 --- a/DxThread.h +++ b/DxThread.h @@ -2,7 +2,7 @@ // // DXライブラリ スレッド関係プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxUseCLib.cpp b/DxUseCLib.cpp index 6ae15a0..70bc3c7 100644 --- a/DxUseCLib.cpp +++ b/DxUseCLib.cpp @@ -2,7 +2,7 @@ // // DXライブラリ 標準Cライブラリ使用コード // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxUseCLib.h b/DxUseCLib.h index 79d3fcc..d42ae9e 100644 --- a/DxUseCLib.h +++ b/DxUseCLib.h @@ -2,7 +2,7 @@ // // DXライブラリ 標準Cライブラリ使用プログラムヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxUseCLibLive2DCubism4.cpp b/DxUseCLibLive2DCubism4.cpp index 07483a2..58af402 100644 --- a/DxUseCLibLive2DCubism4.cpp +++ b/DxUseCLibLive2DCubism4.cpp @@ -2,7 +2,7 @@ // // DXライブラリ 標準Cライブラリ使用コード Live2D Cubism4 関係 // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -28,6 +28,7 @@ #include "DxMemory.h" #include "DxBaseFunc.h" #include "DxFile.h" +#include "DxLog.h" #include #include #include @@ -821,10 +822,16 @@ D_csmString::D_csmString() , _hashcode( -1 ) , _ptrW( NULL ) , _lengthW( 0 ) + , _ptrA( NULL ) + , _lengthA( 0 ) { _small[ 0 ] = '\0' ; _hashcode = CalcHashcode( WritePointer(), _length ) ; ( ( wchar_t * )_smallW )[ 0 ] = L'\0' ; + _smallA[ 0 ] = '\0' ; + _smallA[ 1 ] = '\0' ; + _smallA[ 2 ] = '\0' ; + _smallA[ 3 ] = '\0' ; } D_csmString::D_csmString( const D_csmString& s ) @@ -834,6 +841,14 @@ D_csmString::D_csmString( const D_csmString& s ) _lengthW = 0 ; ( ( wchar_t * )_smallW )[ 0 ] = L'\0' ; + _enableA = false ; + _ptrA = NULL ; + _lengthA = 0 ; + _smallA[ 0 ] = '\0' ; + _smallA[ 1 ] = '\0' ; + _smallA[ 2 ] = '\0' ; + _smallA[ 3 ] = '\0' ; + if( !s.IsEmpty() ) { Copy( s.GetRawString(), s._length ); @@ -854,6 +869,14 @@ D_csmString::D_csmString( const BYTE/*wchar_t*/ * c ) _lengthW = 0 ; ( ( wchar_t * )_smallW )[ 0 ] = L'\0' ; + _enableA = false ; + _ptrA = NULL ; + _lengthA = 0 ; + _smallA[ 0 ] = '\0' ; + _smallA[ 1 ] = '\0' ; + _smallA[ 2 ] = '\0' ; + _smallA[ 3 ] = '\0' ; + if( count ) { Copy( c, count ); @@ -874,6 +897,14 @@ D_csmString::D_csmString( const char* c ) _lengthW = 0 ; ( ( wchar_t * )_smallW )[ 0 ] = L'\0' ; + _enableA = false ; + _ptrA = NULL ; + _lengthA = 0 ; + _smallA[ 0 ] = '\0' ; + _smallA[ 1 ] = '\0' ; + _smallA[ 2 ] = '\0' ; + _smallA[ 3 ] = '\0' ; + if( count ) { Copy( c, count ); @@ -892,6 +923,14 @@ D_csmString::D_csmString( const char* s, int length ) _lengthW = 0 ; ( ( wchar_t * )_smallW )[ 0 ] = L'\0' ; + _enableA = false ; + _ptrA = NULL ; + _lengthA = 0 ; + _smallA[ 0 ] = '\0' ; + _smallA[ 1 ] = '\0' ; + _smallA[ 2 ] = '\0' ; + _smallA[ 3 ] = '\0' ; + if( length ) { Copy( s, length ); @@ -910,6 +949,14 @@ D_csmString::D_csmString( const char* c, int length, bool useptr ) _lengthW = 0 ; ( ( wchar_t * )_smallW )[ 0 ] = L'\0' ; + _enableA = false ; + _ptrA = NULL ; + _lengthA = 0 ; + _smallA[ 0 ] = '\0' ; + _smallA[ 1 ] = '\0' ; + _smallA[ 2 ] = '\0' ; + _smallA[ 3 ] = '\0' ; + Initialize( c, length, useptr ) ; } @@ -932,6 +979,12 @@ D_csmString::~D_csmString() DXFREE( _ptrW ); _ptrW = NULL ; } + + if( _ptrA ) + { + DXFREE( _ptrA ); + _ptrA = NULL ; + } } D_csmString& D_csmString::operator=( const char* c ) @@ -1139,6 +1192,18 @@ void D_csmString::Clear() _lengthW = 0 ; ( ( wchar_t * )_smallW )[ 0 ] = L'\0' ; + _enableA = false ; + if( _ptrA != NULL ) + { + DXFREE( _ptrA ) ; + _ptrA = NULL ; + } + _lengthA = 0 ; + _smallA[ 0 ] = '\0' ; + _smallA[ 1 ] = '\0' ; + _smallA[ 2 ] = '\0' ; + _smallA[ 3 ] = '\0' ; + SetEmpty() ; } @@ -1154,6 +1219,18 @@ void D_csmString::Initialize( const char* c, int length, bool usePtr ) _lengthW = 0 ; ( ( wchar_t * )_smallW )[ 0 ] = L'\0' ; + _enableA = false ; + if( _ptrA != NULL ) + { + DXFREE( _ptrA ) ; + _ptrA = NULL ; + } + _lengthA = 0 ; + _smallA[ 0 ] = '\0' ; + _smallA[ 1 ] = '\0' ; + _smallA[ 2 ] = '\0' ; + _smallA[ 3 ] = '\0' ; + if( !length ) { SetEmpty() ; @@ -1210,6 +1287,18 @@ int D_csmString::Copy( const BYTE* c, int length ) _lengthW = 0 ; ( ( wchar_t * )_smallW )[ 0 ] = L'\0' ; + _enableA = false ; + if( _ptrA != NULL ) + { + DXFREE( _ptrA ) ; + _ptrA = NULL ; + } + _lengthA = 0 ; + _smallA[ 0 ] = '\0' ; + _smallA[ 1 ] = '\0' ; + _smallA[ 2 ] = '\0' ; + _smallA[ 3 ] = '\0' ; + return 0 ; } @@ -1251,6 +1340,18 @@ int D_csmString::Copy( const char* c, int length ) _lengthW = 0 ; ( ( wchar_t * )_smallW )[ 0 ] = L'\0' ; + _enableA = false ; + if( _ptrA != NULL ) + { + DXFREE( _ptrA ) ; + _ptrA = NULL ; + } + _lengthA = 0 ; + _smallA[ 0 ] = '\0' ; + _smallA[ 1 ] = '\0' ; + _smallA[ 2 ] = '\0' ; + _smallA[ 3 ] = '\0' ; + return 0 ; } @@ -1289,6 +1390,14 @@ void D_csmString::SetEmpty( void ) _ptrW = NULL ; ( ( wchar_t * )_smallW )[ 0 ] = L'\0' ; _lengthW = 0 ; + + _enableA = false ; + _ptrA = NULL ; + _smallA[ 0 ] = '\0' ; + _smallA[ 1 ] = '\0' ; + _smallA[ 2 ] = '\0' ; + _smallA[ 3 ] = '\0' ; + _lengthA = 0 ; } @@ -1366,6 +1475,36 @@ const char *D_csmString::GetRawString( void ) const } } +// C言語文字列としてのポインタを取得する( DXライブラリの戻り値用 ) +const char *D_csmString::GetRawStringA( void ) +{ + if( _enableA == false ) + { + this->_lengthA = ( int )( ConvString( ( const char * )GetRawString(), -1, DX_CHARCODEFORMAT_UTF8, NULL, 0, CHAR_CHARCODEFORMAT ) - 1 ) ; + if( _lengthA < ( int )( sizeof( _smallA ) / sizeof( char ) - 1 ) ) + { + this->_ptrA = NULL ; + ConvString( GetRawString(), -1, DX_CHARCODEFORMAT_UTF8, this->_smallA, sizeof( this->_smallA ), CHAR_CHARCODEFORMAT ) ; + } + else + { + this->_ptrA = ( char * )DXALLOC( sizeof( char ) * ( this->_lengthA + 1 ) ) ; + ConvString( GetRawString(), -1, DX_CHARCODEFORMAT_UTF8, this->_ptrA, sizeof( char ) * ( this->_lengthA + 1 ), CHAR_CHARCODEFORMAT ) ; + } + + _enableA = true ; + } + + if( _lengthA < ( int )( sizeof( _smallA ) / sizeof( char ) - 1 ) ) + { + return _smallA ; + } + else + { + return _ptrA ; + } +} + // C言語文字列としてのポインタを取得する( wchar_t用 ) const BYTE *D_csmString::GetRawStringW( void ) { @@ -1963,13 +2102,25 @@ BYTE* D_csmStringW::WritePointer() +D_CubismIdManager::D_CubismIdManager() +{ + // クリティカルセクションの初期化 + CriticalSection_Initialize( &_criticalSection ) ; + + _MEMSET( _ids, 0, sizeof( _ids ) ) ; + _idNum = 0 ; +} D_CubismIdManager::~D_CubismIdManager() { - for( unsigned int i = 0; i < _ids.GetSize(); ++i ) + // クリティカルセクションの削除 + CriticalSection_Delete( &_criticalSection ) ; + + for( int i = 0; i < _idNum; ++i ) { D_CSM_DELETE_SELF( D_CubismId, _ids[ i ] ); } + _idNum = 0 ; } void D_CubismIdManager::RegisterIds( const char** ids, int count ) @@ -2017,8 +2168,23 @@ D_CubismId* D_CubismIdManager::RegisterId( const char* id ) return result; } + // クリティカルセクションの取得 + CRITICALSECTION_LOCK( &_criticalSection ) ; + + if( _idNum >= CSM_IDMANAGER_MAX_ID_NUM ) + { + // クリティカルセクションの解放 + CriticalSection_Unlock( &_criticalSection ) ; + + return NULL ; + } + result = D_CSM_NEW D_CubismId( id ); - _ids.PushBack( result ); + _ids[ _idNum ] = result; + _idNum ++ ; + + // クリティカルセクションの解放 + CriticalSection_Unlock( &_criticalSection ) ; return result; } @@ -2030,7 +2196,8 @@ D_CubismId* D_CubismIdManager::RegisterId( const D_csmString& id ) D_CubismId* D_CubismIdManager::FindId( const char* id ) const { - for( unsigned int i = 0; i < _ids.GetSize(); ++i ) + int idNumTemp = _idNum ; + for( int i = 0; i < idNumTemp; ++i ) { if( _ids[ i ]->GetString() == id ) { @@ -2070,6 +2237,11 @@ const char* D_JsonValue::GetRawString( const D_csmString& defaultValue, const D_ return this->GetString( defaultValue, indent ).GetRawString(); } +const char* D_JsonValue::GetRawStringA( const D_csmString& defaultValue, const D_csmString& indent ) +{ + return this->GetString( defaultValue, indent ).GetRawStringA(); +} + const BYTE* D_JsonValue::GetRawStringW( const D_csmString& defaultValue, const D_csmString& indent ) { return this->GetString( defaultValue, indent ).GetRawStringW(); @@ -7436,6 +7608,12 @@ void D_CubismClippingManager_DxLib::SetupClippingContext( D_CubismModel& model, { const int clipDrawIndex = clipContext->_clippingIdList[ i ]; + // 頂点情報が更新されておらず、信頼性がない場合は描画をパスする + if( !model.GetDrawableDynamicFlagVertexPositionsDidChange( clipDrawIndex ) ) + { + continue; + } + renderer->IsCulling( model.GetDrawableCulling( clipDrawIndex ) != 0 ); // 今回専用の変換を適用して描く @@ -8062,6 +8240,12 @@ void D_CubismRenderer_DxLib::DoDrawModel() { const int drawableIndex = _sortedDrawableIndexList[ i ]; + // Drawableが表示状態でなければ処理をパスする + if( !GetModel()->GetDrawableDynamicFlagIsVisible( drawableIndex ) ) + { + continue; + } + // クリッピングマスクをセットする D_CubismClippingContext* clipContext = ( _clippingManager != NULL ) ? ( *_clippingManager->GetClippingContextListForDraw() )[ drawableIndex ] @@ -8087,6 +8271,12 @@ void D_CubismRenderer_DxLib::DoDrawModel() { const int clipDrawIndex = clipContext->_clippingIdList[ ctx ]; + // 頂点情報が更新されておらず、信頼性がない場合は描画をパスする + if( !GetModel()->GetDrawableDynamicFlagVertexPositionsDidChange( clipDrawIndex ) ) + { + continue; + } + IsCulling( GetModel()->GetDrawableCulling( clipDrawIndex ) != 0 ); // 今回専用の変換を適用して描く @@ -8264,6 +8454,7 @@ void D_CubismRenderer_DxLib::ExecuteDraw( int vertexBuffer, int indexBuffer, int SetUseTextureToShader( 1, _clippingManager->_colorBuffer->GetTextureView() ) ; } SetDrawMode( DX_DRAWMODE_ANISOTROPIC ) ; + SetMaxAnisotropy( 16 ) ; SetTextureAddressMode( DX_TEXADDRESS_WRAP, 0 ) ; SetTextureAddressMode( DX_TEXADDRESS_WRAP, 1 ) ; @@ -8962,6 +9153,7 @@ void D_CubismRenderState_DxLib::SaveCurrentNativeState() GetDrawAlphaTest( &backupDrawAlphaTestMode, &backupDrawAlphaTestParam ) ; backupCullMode = GetUseBackCulling() ; backupUseZBuffer = FALSE ; + backupMaxAnisotropy = GetMaxAnisotropy() ; backupDrawMode = GetDrawMode() ; GetDrawArea( &backupDrawArea ) ; SetDrawAlphaTest( DX_CMP_ALWAYS, 0 ) ; @@ -8978,6 +9170,7 @@ void D_CubismRenderState_DxLib::RestoreNativeState() SetDrawBlendMode( backupBlendMode, backupBlendParam ); SetUseBackCulling( backupCullMode ) ; SetUseZBufferFlag( backupUseZBuffer ) ; + SetMaxAnisotropy( backupMaxAnisotropy ) ; SetDrawMode( backupDrawMode ) ; SetDrawAlphaTest( backupDrawAlphaTestMode, backupDrawAlphaTestParam ) ; SetDrawArea( backupDrawArea.left, backupDrawArea.top, backupDrawArea.right, backupDrawArea.bottom ) ; @@ -9239,7 +9432,10 @@ D_CubismUserModel::~D_CubismUserModel() { D_CSM_DELETE(_motionManager); D_CSM_DELETE(_expressionManager); - _moc->DeleteModel(_model); + if( _moc != NULL ) + { + _moc->DeleteModel( _model ); + } D_CubismMoc::Delete(_moc); D_CSM_DELETE(_modelMatrix); D_CubismPose::Delete(_pose); @@ -9627,6 +9823,12 @@ const char* D_CubismModelSettingJson::GetModelFileName() return (*_jsonValue[FrequentNode_Moc]).GetRawString(); } +const char* D_CubismModelSettingJson::GetModelFileNameA() +{ + if (!IsExistModelFile())return ""; + return (*_jsonValue[FrequentNode_Moc]).GetRawStringA(); +} + const BYTE/*wchar_t*/ * D_CubismModelSettingJson::GetModelFileNameW() { if (!IsExistModelFile())return ( BYTE * )L""; @@ -9645,6 +9847,11 @@ const char* D_CubismModelSettingJson::GetTextureDirectory() return (*_jsonValue[FrequentNode_Textures]).GetRawString(); } +const char* D_CubismModelSettingJson::GetTextureDirectoryA() +{ + return (*_jsonValue[FrequentNode_Textures]).GetRawStringA(); +} + const BYTE/*wchar_t*/ * D_CubismModelSettingJson::GetTextureDirectoryW() { return (*_jsonValue[FrequentNode_Textures]).GetRawStringW(); @@ -9655,6 +9862,11 @@ const char* D_CubismModelSettingJson::GetTextureFileName(int index) return (*_jsonValue[FrequentNode_Textures])[index].GetRawString(); } +const char* D_CubismModelSettingJson::GetTextureFileNameA(int index) +{ + return (*_jsonValue[FrequentNode_Textures])[index].GetRawStringA(); +} + const BYTE/*wchar_t*/ * D_CubismModelSettingJson::GetTextureFileNameW(int index) { return (*_jsonValue[FrequentNode_Textures])[index].GetRawStringW(); @@ -9677,6 +9889,11 @@ const char* D_CubismModelSettingJson::GetHitAreaName(int index) return (*_jsonValue[FrequentNode_HitAreas])[index][STR_Name].GetRawString(); } +const char* D_CubismModelSettingJson::GetHitAreaNameA(int index) +{ + return (*_jsonValue[FrequentNode_HitAreas])[index][STR_Name].GetRawStringA(); +} + const BYTE/*wchar_t*/ * D_CubismModelSettingJson::GetHitAreaNameW( int index ) { return (*_jsonValue[FrequentNode_HitAreas])[index][STR_Name].GetRawStringW(); @@ -9689,6 +9906,12 @@ const char* D_CubismModelSettingJson::GetPhysicsFileName() return (*_jsonValue[FrequentNode_Physics]).GetRawString(); } +const char* D_CubismModelSettingJson::GetPhysicsFileNameA() +{ + if (!IsExistPhysicsFile())return ""; + return (*_jsonValue[FrequentNode_Physics]).GetRawStringA(); +} + const BYTE/*wchar_t*/ * D_CubismModelSettingJson::GetPhysicsFileNameW() { if (!IsExistPhysicsFile())return ( BYTE * )L""; @@ -9701,6 +9924,12 @@ const char* D_CubismModelSettingJson::GetPoseFileName() return (*_jsonValue[FrequentNode_Pose]).GetRawString(); } +const char* D_CubismModelSettingJson::GetPoseFileNameA() +{ + if (!IsExistPoseFile())return ""; + return (*_jsonValue[FrequentNode_Pose]).GetRawStringA(); +} + const BYTE/*wchar_t*/ * D_CubismModelSettingJson::GetPoseFileNameW() { if (!IsExistPoseFile())return ( BYTE * )L""; @@ -9718,6 +9947,11 @@ const char* D_CubismModelSettingJson::GetExpressionName(int index) return (*_jsonValue[FrequentNode_Expressions])[index][STR_Name].GetRawString(); } +const char* D_CubismModelSettingJson::GetExpressionNameA(int index) +{ + return (*_jsonValue[FrequentNode_Expressions])[index][STR_Name].GetRawStringA(); +} + const BYTE/*wchar_t*/ * D_CubismModelSettingJson::GetExpressionNameW(int index) { return (*_jsonValue[FrequentNode_Expressions])[index][STR_Name].GetRawStringW(); @@ -9728,6 +9962,11 @@ const char* D_CubismModelSettingJson::GetExpressionFileName(int index) return (*_jsonValue[FrequentNode_Expressions])[index][STR_FilePath].GetRawString(); } +const char* D_CubismModelSettingJson::GetExpressionFileNameA(int index) +{ + return (*_jsonValue[FrequentNode_Expressions])[index][STR_FilePath].GetRawStringA(); +} + const BYTE/*wchar_t*/ * D_CubismModelSettingJson::GetExpressionFileNameW(int index) { return (*_jsonValue[FrequentNode_Expressions])[index][STR_FilePath].GetRawStringW(); @@ -9752,6 +9991,15 @@ const char* D_CubismModelSettingJson::GetMotionGroupName(int index) return (*_jsonValue[FrequentNode_Motions]).GetKeys()[index].GetRawString(); } +const char* D_CubismModelSettingJson::GetMotionGroupNameA(int index) +{ + if (!IsExistMotionGroups()) + { + return NULL; + } + return (*_jsonValue[FrequentNode_Motions]).GetKeys()[index].GetRawStringA(); +} + const BYTE/*wchar_t*/ * D_CubismModelSettingJson::GetMotionGroupNameW(int index) { if (!IsExistMotionGroups()) @@ -9773,6 +10021,12 @@ const char* D_CubismModelSettingJson::GetMotionFileName(const char* groupName, i return (*_jsonValue[FrequentNode_Motions])[groupName][index][STR_FilePath].GetRawString(); } +const char* D_CubismModelSettingJson::GetMotionFileNameA(const char* groupName, int index) +{ + if (!IsExistMotionGroupName(groupName))return ""; + return (*_jsonValue[FrequentNode_Motions])[groupName][index][STR_FilePath].GetRawStringA(); +} + const BYTE/*wchar_t*/ * D_CubismModelSettingJson::GetMotionFileNameW(const char* groupName, int index) { if (!IsExistMotionGroupName(groupName))return ( BYTE * )L""; @@ -9785,6 +10039,12 @@ const char* D_CubismModelSettingJson::GetMotionSoundFileName(const char* groupNa return (*_jsonValue[FrequentNode_Motions])[groupName][index][STR_SoundPath].GetRawString(); } +const char* D_CubismModelSettingJson::GetMotionSoundFileNameA(const char* groupName, int index) +{ + if (!IsExistMotionSoundFile(groupName, index))return ""; + return (*_jsonValue[FrequentNode_Motions])[groupName][index][STR_SoundPath].GetRawStringA(); +} + const BYTE/*wchar_t*/ * D_CubismModelSettingJson::GetMotionSoundFileNameW(const char* groupName, int index) { if (!IsExistMotionSoundFile(groupName, index))return ( BYTE * )L""; @@ -9813,6 +10073,15 @@ const char* D_CubismModelSettingJson::GetUserDataFile() return _json->GetRoot()[STR_FileReferences][STR_UserData].GetRawString(); } +const char* D_CubismModelSettingJson::GetUserDataFileA() +{ + if (!IsExistUserDataFile()) + { + return ""; + } + return _json->GetRoot()[STR_FileReferences][STR_UserData].GetRawStringA(); +} + const BYTE/*wchar_t*/ * D_CubismModelSettingJson::GetUserDataFileW() { if (!IsExistUserDataFile()) @@ -10196,6 +10465,7 @@ const char* HitAreaNameBody = "Body"; BYTE* CreateBuffer( const BYTE/*wchar_t*/ * path, size_t* size ) { + static char pathA[ 2048 ] ; void *Buffer ; LONGLONG fileSize ; DWORD_PTR fp ; @@ -10203,6 +10473,8 @@ BYTE* CreateBuffer( const BYTE/*wchar_t*/ * path, size_t* size ) fp = DX_FOPENW( ( char * )path ) ; if( fp == 0 ) { + ConvString( ( char * )path, -1, WCHAR_T_CHARCODEFORMAT, pathA, sizeof( pathA ), CHAR_CHARCODEFORMAT ) ; + DXST_LOGFILEFMT_ADDA(( "Live2D Error : file open failed : %s", pathA )) ; return NULL ; } @@ -10213,6 +10485,8 @@ BYTE* CreateBuffer( const BYTE/*wchar_t*/ * path, size_t* size ) Buffer = DXALLOC( ( size_t )fileSize ) ; if( Buffer == NULL ) { + ConvString( ( char * )path, -1, WCHAR_T_CHARCODEFORMAT, pathA, sizeof( pathA ), CHAR_CHARCODEFORMAT ) ; + DXST_LOGFILEFMT_ADDA(( "Live2D Error : alloc memory failed : %s", pathA )) ; return NULL ; } @@ -10253,10 +10527,15 @@ D_LAppModel::~D_LAppModel() ReleaseMotions(); ReleaseExpressions(); - for( int i = 0; i < _modelSetting->GetMotionGroupCount(); i++ ) + if( _modelSetting != NULL ) { - const char* group = _modelSetting->GetMotionGroupName( i ); - ReleaseMotionGroup( group ); + for( int i = 0; i < _modelSetting->GetMotionGroupCount(); i++ ) + { + const char* group = _modelSetting->GetMotionGroupName( i ); + ReleaseMotionGroup( group ); + } + + D_CSM_DELETE( _modelSetting ); } // テクスチャの開放 @@ -10265,8 +10544,6 @@ D_LAppModel::~D_LAppModel() DeleteGraph( _bindTextureId[ d ] ); } _bindTextureId.Clear(); - - D_CSM_DELETE( _modelSetting ); } bool D_LAppModel::LoadAssets( const BYTE/*wchar_t*/ * dir, const BYTE/*wchar_t*/ * fileName, int ASyncThread ) @@ -10289,7 +10566,10 @@ bool D_LAppModel::LoadAssets( const BYTE/*wchar_t*/ * dir, const BYTE/*wchar_t*/ D_ICubismModelSetting* setting = D_CSM_NEW D_CubismModelSettingJson( buffer, size ); DeleteBuffer( buffer, path.GetRawString() ); - SetupModel( setting ); + if( SetupModel( setting ) == false ) + { + return false ; + } CreateRenderer( ASyncThread ); @@ -10299,7 +10579,7 @@ bool D_LAppModel::LoadAssets( const BYTE/*wchar_t*/ * dir, const BYTE/*wchar_t*/ } -void D_LAppModel::SetupModel( D_ICubismModelSetting* setting ) +bool D_LAppModel::SetupModel( D_ICubismModelSetting* setting ) { _updating = true; _initialized = false; @@ -10321,6 +10601,10 @@ void D_LAppModel::SetupModel( D_ICubismModelSetting* setting ) // } buffer = CreateBuffer( path.GetRawString(), &size ); + if( buffer == NULL ) + { + return false ; + } LoadModel( buffer, size ); DeleteBuffer( buffer, path.GetRawString() ); } @@ -10336,6 +10620,10 @@ void D_LAppModel::SetupModel( D_ICubismModelSetting* setting ) path = _modelHomeDir + path; buffer = CreateBuffer( path.GetRawString(), &size ); + if( buffer == NULL ) + { + return false ; + } D_ACubismMotion* motion = LoadExpression( buffer, size, name.GetRawString() ); if( _expressions.IsExist( name ) && _expressions[ name ] != NULL ) @@ -10356,6 +10644,10 @@ void D_LAppModel::SetupModel( D_ICubismModelSetting* setting ) path = _modelHomeDir + path; buffer = CreateBuffer( path.GetRawString(), &size ); + if( buffer == NULL ) + { + return false ; + } LoadPhysics( buffer, size ); DeleteBuffer( buffer, path.GetRawString() ); } @@ -10367,6 +10659,10 @@ void D_LAppModel::SetupModel( D_ICubismModelSetting* setting ) path = _modelHomeDir + path; buffer = CreateBuffer( path.GetRawString(), &size ); + if( buffer == NULL ) + { + return false ; + } LoadPose( buffer, size ); DeleteBuffer( buffer, path.GetRawString() ); } @@ -10397,6 +10693,10 @@ void D_LAppModel::SetupModel( D_ICubismModelSetting* setting ) D_csmStringW path = _modelSetting->GetUserDataFile(); path = _modelHomeDir + path; buffer = CreateBuffer( path.GetRawString(), &size ); + if( buffer == NULL ) + { + return false ; + } LoadUserData( buffer, size ); DeleteBuffer( buffer, path.GetRawString() ); } @@ -10436,6 +10736,8 @@ void D_LAppModel::SetupModel( D_ICubismModelSetting* setting ) _updating = false; _initialized = true; + + return true ; } void D_LAppModel::PreloadMotionGroup( const char* group ) @@ -10457,6 +10759,10 @@ void D_LAppModel::PreloadMotionGroup( const char* group ) BYTE* buffer; size_t size; buffer = CreateBuffer( path.GetRawString(), &size ); + if( buffer == NULL ) + { + return ; + } D_CubismMotion* tmpMotion = ( D_CubismMotion* )( LoadMotion( buffer, size, name.GetRawString() ) ); float fadeTime = _modelSetting->GetMotionFadeInTimeValue( group, i ); @@ -10648,6 +10954,10 @@ D_CubismMotionQueueEntryHandle D_LAppModel::StartMotion( const char* group, int BYTE* buffer; size_t size; buffer = CreateBuffer( path.GetRawString(), &size ); + if( buffer == NULL ) + { + return InvalidMotionQueueEntryHandleValue; + } motion = ( D_CubismMotion* )LoadMotion( buffer, size, NULL ); float fadeTime = _modelSetting->GetMotionFadeInTimeValue( group, no ); if( fadeTime >= 0.0f ) diff --git a/DxUseCLibLive2DCubism4.h b/DxUseCLibLive2DCubism4.h index 3e66def..9013adc 100644 --- a/DxUseCLibLive2DCubism4.h +++ b/DxUseCLibLive2DCubism4.h @@ -2,7 +2,7 @@ // // DXライブラリ 標準Cライブラリ使用コード Live2D Cubism4 関係ヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- @@ -87,7 +87,7 @@ enum D_csmBlendAdditive = 1 << 0, // Additive blend mode mask. D_csmBlendMultiplicative = 1 << 1, // Multiplicative blend mode mask. D_csmIsDoubleSided = 1 << 2, // Double-sidedness mask. - D_csmIsInvertedMask = 1 << 3 // Clipping mask inversion mode mask. + D_csmIsInvertedMask = 1 << 3 // Clipping mask inversion mode mask. } ; @@ -108,11 +108,12 @@ enum D_csmMocVersion_Unknown = 0, // unknown D_csmMocVersion_30 = 1, // moc3 file version 3.0.00 - 3.2.07 D_csmMocVersion_33 = 2, // moc3 file version 3.3.00 - - D_csmMocVersion_40 = 3 // moc3 file version 4.0.00 - + D_csmMocVersion_40 = 3 // moc3 file version 4.0.00 - } ; #define CSM_STRING_SMALL_LENGTH 64 #define CSM_MAP_DEFAULT_SIZE 10 +#define CSM_IDMANAGER_MAX_ID_NUM 65536 // 矩形形状(座標・長さはfloat値)を定義するクラス @@ -214,6 +215,7 @@ class D_csmString D_csmString& Append( const char* c, int length ) ; // 文字列を後方に追加する D_csmString& Append( int length, const char v ) ; // 文字サイズを拡張して文字を埋める const char * GetRawString() const ; // C言語文字列としてのポインタを取得する + const char * GetRawStringA() ; // C言語文字列としてのポインタを取得する( DXライブラリの戻り値用 ) const BYTE/*wchar_t*/ * GetRawStringW() ; // C言語文字列としてのポインタを取得する( wchar_t用 ) protected: @@ -233,6 +235,11 @@ class D_csmString int _hashcode ; // インスタンスに当てられたハッシュ値 char _small[ 64 ] ; // 文字列の長さが64-1未満の場合はこちらを使用 + bool _enableA ; // DXライブラリの戻り値用のデータが有効かどうか + char * _ptrA ; // 文字型配列のポインタ( DXライブラリの戻り値用 ) + int _lengthA ; // 半角文字数(メモリ確保は最後に0が入るため_length+1)( DXライブラリの戻り値用 ) + char _smallA[ 64 ] ; // 文字列の長さが64-1未満の場合はこちらを使用( DXライブラリの戻り値用 ) + bool _enableW ; // wchar_t 用のデータが有効かどうか BYTE/*wchar_t*/ * _ptrW ; // 文字型配列のポインタ( wchar_t用 ) int _lengthW ; // 半角文字数(メモリ確保は最後に0が入るため_length+1)( wchar_t用 ) @@ -530,7 +537,7 @@ class D_CubismIdManager friend struct D_CubismId ; public: - D_CubismIdManager(){} // コンストラクタ + D_CubismIdManager() ; // コンストラクタ ~D_CubismIdManager() ; // デストラクタ void RegisterIds( const char** ids, int count ) ; // ID名をリストから登録 void RegisterIds( const D_csmVector< D_csmString >& ids ) ; // ID名をリストから登録 @@ -546,7 +553,9 @@ class D_CubismIdManager D_CubismIdManager( const D_CubismIdManager& ) ; D_CubismIdManager& operator=( const D_CubismIdManager& ) ; - D_csmVector< D_CubismId * > _ids ; // 登録されているIDのリスト + D_CubismId * _ids[ CSM_IDMANAGER_MAX_ID_NUM ] ; // 登録されているIDのリスト + volatile int _idNum ; // 登録されているIDの数 + DX_CRITICAL_SECTION _criticalSection ; // クリティカルセクション } ; class D_JsonValue ; @@ -568,6 +577,7 @@ class D_JsonValue virtual ~D_JsonValue() {} // デストラクタ virtual D_csmString& GetString( const D_csmString& defaultValue = "", const D_csmString& indent = "" ) = 0 ;// 要素を文字列で返す(D_csmString型) virtual const char* GetRawString( const D_csmString& defaultValue = "", const D_csmString& indent = "" ) ;// 要素を文字列で返す(char*) + virtual const char* GetRawStringA( const D_csmString& defaultValue = "", const D_csmString& indent = "" ) ;// 要素を文字列で返す(DXライブラリ用) virtual const BYTE/*wchar_t*/ * GetRawStringW( const D_csmString& defaultValue = "", const D_csmString& indent = "" ) ;// 要素を文字列で返す(wchar_t*) virtual int ToInt( int defaultValue = 0 ) { return defaultValue ; } // 要素を数値型で返す( int) virtual float ToFloat( float defaultValue = 0.0f ) { return defaultValue ; } // 要素を数値型で返す(float) @@ -820,7 +830,7 @@ class D_CubismMotionJson struct D_CubismMotionPoint { float Time ; // 時間[秒] - float Value ; // 値 + float Value ; // 値 } ; // モーションカーブのセグメント @@ -928,7 +938,7 @@ class D_CubismModel float GetDrawableOpacity( int drawableIndex ) const ; // Drawableの不透明度の取得 int GetDrawableCulling( int drawableIndex ) const ; // Drawableのカリング情報の取得 D_CubismBlendMode GetDrawableBlendMode( int drawableIndex ) const ; // Drawableのブレンドモードの取得 - bool GetDrawableInvertedMask( int drawableIndex ) const ; // Drawableのマスクの反転使用の取得 + bool GetDrawableInvertedMask( int drawableIndex ) const ; // Drawableのマスクの反転使用の取得 bool GetDrawableDynamicFlagIsVisible( int drawableIndex ) const ; // Drawableの表示情報の取得 bool GetDrawableDynamicFlagVisibilityDidChange( int drawableIndex ) const ; // Drawableの表示状態の変化の取得 bool GetDrawableDynamicFlagOpacityDidChange( int drawableIndex ) const ; // Drawableの不透明度の変化情報の取得 @@ -1217,36 +1227,48 @@ class D_ICubismModelSetting public: virtual ~D_ICubismModelSetting() {} // デストラクタ virtual const char* GetModelFileName() = 0 ; // Mocファイルの名前を取得する + virtual const char* GetModelFileNameA() = 0 ; // Mocファイルの名前を取得する virtual const BYTE/*wchar_t*/ * GetModelFileNameW() = 0 ; // Mocファイルの名前を取得する virtual int GetTextureCount() = 0 ; // モデルが使用するテクスチャの数を取得する virtual const char* GetTextureDirectory() = 0 ; // テクスチャが配置されたディレクトリの名前を取得する + virtual const char* GetTextureDirectoryA() = 0 ; // テクスチャが配置されたディレクトリの名前を取得する virtual const BYTE/*wchar_t*/ * GetTextureDirectoryW() = 0 ; // テクスチャが配置されたディレクトリの名前を取得する virtual const char* GetTextureFileName( int index ) = 0 ; // モデルが使用するテクスチャの名前を取得する + virtual const char* GetTextureFileNameA( int index ) = 0 ; // モデルが使用するテクスチャの名前を取得する virtual const BYTE/*wchar_t*/ * GetTextureFileNameW( int index ) = 0 ; // モデルが使用するテクスチャの名前を取得する virtual int GetHitAreasCount() = 0 ; // モデルに設定された当たり判定の数を取得する virtual D_CubismIdHandle GetHitAreaId( int index ) = 0 ; // 当たり判定に設定されたIDを取得する virtual const char* GetHitAreaName( int index ) = 0 ; // 当たり判定に設定された名前を取得する + virtual const char* GetHitAreaNameA( int index ) = 0 ; // 当たり判定に設定された名前を取得する virtual const BYTE/*wchar_t*/ * GetHitAreaNameW( int index ) = 0 ; // 当たり判定に設定された名前を取得する virtual const char* GetPhysicsFileName() = 0 ; // 物理演算設定ファイルの名前を取得する + virtual const char* GetPhysicsFileNameA() = 0 ; // 物理演算設定ファイルの名前を取得する virtual const BYTE/*wchar_t*/ * GetPhysicsFileNameW() = 0 ; // 物理演算設定ファイルの名前を取得する virtual const char* GetPoseFileName() = 0 ; // パーツ切り替え設定ファイルの名前を取得する + virtual const char* GetPoseFileNameA() = 0 ; // パーツ切り替え設定ファイルの名前を取得する virtual const BYTE/*wchar_t*/ * GetPoseFileNameW() = 0 ; // パーツ切り替え設定ファイルの名前を取得する virtual int GetExpressionCount() = 0 ; // 表情設定ファイルの数を取得する virtual const char* GetExpressionName( int index ) = 0 ; // 表情設定ファイルを識別する名前(別名)を取得する + virtual const char* GetExpressionNameA( int index ) = 0 ; // 表情設定ファイルを識別する名前(別名)を取得する virtual const BYTE/*wchar_t*/ * GetExpressionNameW( int index ) = 0 ; // 表情設定ファイルを識別する名前(別名)を取得する virtual const char* GetExpressionFileName( int index ) = 0 ; // 表情設定ファイルの名前を取得する + virtual const char* GetExpressionFileNameA( int index ) = 0 ; // 表情設定ファイルの名前を取得する virtual const BYTE/*wchar_t*/ * GetExpressionFileNameW( int index ) = 0 ; // 表情設定ファイルの名前を取得する virtual int GetMotionGroupCount() = 0 ; // モーショングループの数を取得する virtual const char* GetMotionGroupName( int index ) = 0 ; // モーショングループの名前を取得する + virtual const char* GetMotionGroupNameA( int index ) = 0 ; // モーショングループの名前を取得する virtual const BYTE/*wchar_t*/ * GetMotionGroupNameW( int index ) = 0 ; // モーショングループの名前を取得する virtual int GetMotionCount( const char* groupName ) = 0 ; // モーショングループに含まれるモーションの数を取得する virtual const char* GetMotionFileName( const char* groupName, int index ) = 0 ; // グループ名とインデックス値からモーションファイルの名前を取得する + virtual const char* GetMotionFileNameA( const char* groupName, int index ) = 0 ; // グループ名とインデックス値からモーションファイルの名前を取得する virtual const BYTE/*wchar_t*/ * GetMotionFileNameW( const char* groupName, int index ) = 0 ; // グループ名とインデックス値からモーションファイルの名前を取得する virtual const char* GetMotionSoundFileName( const char* groupName, int index ) = 0 ; // モーションに対応するサウンドファイルの名前を取得する + virtual const char* GetMotionSoundFileNameA( const char* groupName, int index ) = 0 ; // モーションに対応するサウンドファイルの名前を取得する virtual const BYTE/*wchar_t*/ * GetMotionSoundFileNameW( const char* groupName, int index ) = 0 ; // モーションに対応するサウンドファイルの名前を取得する virtual float GetMotionFadeInTimeValue( const char* groupName, int index ) = 0 ; // モーション開始時のフェードイン処理時間を取得する virtual float GetMotionFadeOutTimeValue( const char* groupName, int index ) = 0 ; // モーション終了時のフェードアウト処理時間を取得する virtual const char* GetUserDataFile() = 0 ; // ユーザデータのファイル名を取得する + virtual const char* GetUserDataFileA() = 0 ; // ユーザデータのファイル名を取得する virtual const BYTE/*wchar_t*/ * GetUserDataFileW() = 0 ; // ユーザデータのファイル名を取得する virtual bool GetLayoutMap( D_csmMap& outLayoutMap ) = 0 ; // レイアウト情報を取得する virtual int GetEyeBlinkParameterCount() = 0 ; // 目パチに関連付けられたパラメータの数を取得する @@ -1263,36 +1285,48 @@ class D_CubismModelSettingJson : public D_ICubismModelSetting virtual ~D_CubismModelSettingJson() ; // デストラクタ D_CubismJson* GetJsonPointer() const ; // CubismJsonオブジェクトのポインタを取得する const char* GetModelFileName() ; + const char* GetModelFileNameA() ; const BYTE/*wchar_t*/ * GetModelFileNameW() ; int GetTextureCount() ; const char* GetTextureDirectory() ; + const char* GetTextureDirectoryA() ; const BYTE/*wchar_t*/ * GetTextureDirectoryW() ; const char* GetTextureFileName( int index ) ; + const char* GetTextureFileNameA( int index ) ; const BYTE/*wchar_t*/ * GetTextureFileNameW( int index ) ; int GetHitAreasCount() ; D_CubismIdHandle GetHitAreaId( int index ) ; const char* GetHitAreaName( int index ) ; + const char* GetHitAreaNameA( int index ) ; const BYTE/*wchar_t*/ * GetHitAreaNameW( int index ) ; const char* GetPhysicsFileName() ; + const char* GetPhysicsFileNameA() ; const BYTE/*wchar_t*/ * GetPhysicsFileNameW() ; const char* GetPoseFileName() ; + const char* GetPoseFileNameA() ; const BYTE/*wchar_t*/ * GetPoseFileNameW() ; int GetExpressionCount() ; const char* GetExpressionName( int index ) ; + const char* GetExpressionNameA( int index ) ; const BYTE/*wchar_t*/ * GetExpressionNameW( int index ) ; const char* GetExpressionFileName( int index ) ; + const char* GetExpressionFileNameA( int index ) ; const BYTE/*wchar_t*/ * GetExpressionFileNameW( int index ) ; int GetMotionGroupCount() ; const char* GetMotionGroupName( int index ) ; + const char* GetMotionGroupNameA( int index ) ; const BYTE/*wchar_t*/ * GetMotionGroupNameW( int index ) ; int GetMotionCount( const char* groupName ) ; const char* GetMotionFileName( const char* groupName, int index ) ; + const char* GetMotionFileNameA( const char* groupName, int index ) ; const BYTE/*wchar_t*/ * GetMotionFileNameW( const char* groupName, int index ) ; const char* GetMotionSoundFileName( const char* groupName, int index ) ; + const char* GetMotionSoundFileNameA( const char* groupName, int index ) ; const BYTE/*wchar_t*/ * GetMotionSoundFileNameW( const char* groupName, int index ) ; float GetMotionFadeInTimeValue( const char* groupName, int index ) ; float GetMotionFadeOutTimeValue( const char* groupName, int index ) ; const char* GetUserDataFile() ; + const char* GetUserDataFileA() ; const BYTE/*wchar_t*/ * GetUserDataFileW() ; bool GetLayoutMap( D_csmMap& outLayoutMap ) ; int GetEyeBlinkParameterCount() ; @@ -1966,6 +2000,7 @@ class D_CubismRenderState_DxLib int backupBlendParam ; int backupCullMode ; int backupUseZBuffer ; + int backupMaxAnisotropy ; int backupDrawMode ; RECT backupDrawArea ; int backupDrawAlphaTestMode ; @@ -2201,7 +2236,7 @@ class D_LAppModel : public D_CubismUserModel void DoDraw() ; // モデルを描画する処理。モデルを描画する空間のView-Projection行列を渡す。 public: - void SetupModel( D_ICubismModelSetting* setting ) ; // model3.jsonからモデルを生成する。model3.jsonの記述に従ってモデル生成、モーション、物理演算などのコンポーネント生成を行う。 + bool SetupModel( D_ICubismModelSetting* setting ) ; // model3.jsonからモデルを生成する。model3.jsonの記述に従ってモデル生成、モーション、物理演算などのコンポーネント生成を行う。 void SetupTextures( int ASyncThread ) ; // テクスチャをロードする void PreloadMotionGroup( const char* group ) ; // モーションデータをグループ名から一括でロードする。モーションデータの名前は内部でModelSettingから取得する。 void ReleaseMotionGroup( const char* group ) const ; // モーションデータをグループ名から一括で解放する。モーションデータの名前は内部でModelSettingから取得する。 diff --git a/DxUseCLibOgg.cpp b/DxUseCLibOgg.cpp index 2f71bea..8decd65 100644 --- a/DxUseCLibOgg.cpp +++ b/DxUseCLibOgg.cpp @@ -2,7 +2,7 @@ // // DXライブラリ 標準Cライブラリ使用コード Ogg関係 // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxUseCLibOgg.h b/DxUseCLibOgg.h index 6e94958..2496797 100644 --- a/DxUseCLibOgg.h +++ b/DxUseCLibOgg.h @@ -2,7 +2,7 @@ // // DXライブラリ 標準Cライブラリ使用コード Ogg関係ヘッダファイル // -// Ver 3.21d +// Ver 3.21f // // ------------------------------------------------------------------------------- diff --git a/DxUseCLibPhysics.cpp b/DxUseCLibPhysics.cpp index e2bea7a..a90f19d 100644 --- a/DxUseCLibPhysics.cpp +++ b/DxUseCLibPhysics.cpp @@ -2,7 +2,7 @@ // // DXライブラリ 物理演算処理 // -// Ver 3.21d +// Ver 3.21f // // -------------------------------------------------------------------------------