Skip to content

Commit 540d0b2

Browse files
author
effekseer
committed
GIFアニメーション出力機能を追加
1 parent 5455a7b commit 540d0b2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+6648
-12
lines changed

.gitignore

+4-1
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,7 @@
2323

2424
[Oo]bj/
2525

26-
Release/RuntimeSample/lib/*.lib
26+
Release/RuntimeSample/lib/*.lib
27+
28+
Dev/Cpp/include/
29+
Dev/Cpp/lib/

Dev/Cpp/Viewer/EffekseerTool/EffekseerTool.Renderer.cpp

+60
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,9 @@ bool Renderer::BeginRecord( int32_t width, int32_t height )
569569
assert( m_recordingTempTarget == NULL );
570570
assert( m_recordingTempDepth == NULL );
571571

572+
m_recordingWidth = width;
573+
m_recordingHeight = height;
574+
572575
HRESULT hr;
573576

574577
hr = GetDevice()->CreateTexture( width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_recordingTargetTexture, NULL );
@@ -636,6 +639,63 @@ void Renderer::EndRecord( const wchar_t* outputPath )
636639
m_recording = false;
637640
}
638641

642+
//----------------------------------------------------------------------------------
643+
//
644+
//----------------------------------------------------------------------------------
645+
void Renderer::EndRecord(std::vector<Effekseer::Color>& pixels)
646+
{
647+
assert(m_recording);
648+
649+
pixels.resize(m_recordingWidth * m_recordingHeight);
650+
651+
GetDevice()->SetRenderTarget(0, m_recordingTempTarget);
652+
GetDevice()->SetDepthStencilSurface(m_recordingTempDepth);
653+
ES_SAFE_RELEASE(m_recordingTempTarget);
654+
ES_SAFE_RELEASE(m_recordingTempDepth);
655+
656+
IDirect3DSurface9* temp_sur = nullptr;
657+
IDirect3DTexture9* temp_tex = nullptr;
658+
659+
GetDevice()->CreateTexture(
660+
m_recordingWidth, m_recordingHeight, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &temp_tex, NULL);
661+
temp_tex->GetSurfaceLevel(0, &temp_sur);
662+
663+
GetDevice()->GetRenderTargetData(m_recordingTarget, temp_sur);
664+
665+
D3DLOCKED_RECT drect;
666+
RECT rect;
667+
rect.top = 0;
668+
rect.left = 0;
669+
rect.right = m_recordingWidth;
670+
rect.bottom = m_recordingHeight;
671+
672+
auto hr = temp_sur->LockRect(&drect, &rect, D3DLOCK_DISCARD);
673+
if (SUCCEEDED(hr))
674+
{
675+
for (int32_t y = 0; y < m_recordingHeight; y++)
676+
{
677+
for (int32_t x = 0; x < m_recordingWidth; x++)
678+
{
679+
auto src = &(((uint8_t*) drect.pBits)[x * 4 + drect.Pitch * y]);
680+
pixels[x + m_recordingWidth * y].R = src[2];
681+
pixels[x + m_recordingWidth * y].G = src[1];
682+
pixels[x + m_recordingWidth * y].B = src[0];
683+
}
684+
}
685+
686+
temp_sur->UnlockRect();
687+
}
688+
689+
ES_SAFE_RELEASE(temp_sur);
690+
ES_SAFE_RELEASE(temp_tex);
691+
692+
ES_SAFE_RELEASE(m_recordingTarget);
693+
ES_SAFE_RELEASE(m_recordingTargetTexture);
694+
ES_SAFE_RELEASE(m_recordingDepth);
695+
696+
m_recording = false;
697+
}
698+
639699
//----------------------------------------------------------------------------------
640700
//
641701
//----------------------------------------------------------------------------------

Dev/Cpp/Viewer/EffekseerTool/EffekseerTool.Renderer.h

+7
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ class Renderer
5353
IDirect3DSurface9* m_recordingTarget;
5454
IDirect3DTexture9* m_recordingTargetTexture;
5555
IDirect3DSurface9* m_recordingDepth;
56+
int32_t m_recordingWidth;
57+
int32_t m_recordingHeight;
5658

5759
IDirect3DSurface9* m_recordingTempTarget;
5860
IDirect3DSurface9* m_recordingTempDepth;
@@ -235,6 +237,11 @@ class Renderer
235237
*/
236238
void EndRecord( const wchar_t* outputPath );
237239

240+
/**
241+
@brief 録画終了
242+
*/
243+
void EndRecord(std::vector<Effekseer::Color>& pixels);
244+
238245
/**
239246
@brief 背景の読み込み
240247
*/

Dev/Cpp/Viewer/Viewer.vcxproj

+8-8
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
8787
<ClCompile>
8888
<Optimization>Disabled</Optimization>
89-
<AdditionalIncludeDirectories>..\Effekseer\;..\EffekseerRendererDX9\;..\EffekseerSoundXAudio2\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
89+
<AdditionalIncludeDirectories>..\Effekseer\;..\EffekseerRendererDX9\;..\EffekseerSoundXAudio2\;..\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
9090
<PreprocessorDefinitions>_DEBUG;DEBUG;WIN32;_WINDOWS;_DEBUG_EFFEKSEER;__EFFEKSEER_RENDERER_INTERNAL_LOADER__;%(PreprocessorDefinitions)</PreprocessorDefinitions>
9191
<MinimalRebuild>true</MinimalRebuild>
9292
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
@@ -98,15 +98,15 @@
9898
<OutputFile>$(TargetPath)</OutputFile>
9999
<GenerateDebugInformation>true</GenerateDebugInformation>
100100
<TargetMachine>MachineX86</TargetMachine>
101-
<AdditionalLibraryDirectories>..\lib\x86\</AdditionalLibraryDirectories>
101+
<AdditionalLibraryDirectories>..\lib\x86\;..\lib\;</AdditionalLibraryDirectories>
102102
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
103103
</Link>
104104
</ItemDefinitionGroup>
105105
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
106106
<ClCompile>
107107
<Optimization>MaxSpeed</Optimization>
108108
<IntrinsicFunctions>true</IntrinsicFunctions>
109-
<AdditionalIncludeDirectories>..\Effekseer\;..\EffekseerRendererDX9\;..\EffekseerSoundXAudio2\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
109+
<AdditionalIncludeDirectories>..\Effekseer\;..\EffekseerRendererDX9\;..\EffekseerSoundXAudio2\;..\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
110110
<PreprocessorDefinitions>WIN32;NDEBUG;_NDEBUG;_WINDOWS;__EFFEKSEER_RENDERER_INTERNAL_LOADER__;%(PreprocessorDefinitions)</PreprocessorDefinitions>
111111
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
112112
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
@@ -120,15 +120,15 @@
120120
<OptimizeReferences>true</OptimizeReferences>
121121
<EnableCOMDATFolding>true</EnableCOMDATFolding>
122122
<TargetMachine>MachineX86</TargetMachine>
123-
<AdditionalLibraryDirectories>..\lib\x86\</AdditionalLibraryDirectories>
123+
<AdditionalLibraryDirectories>..\lib\x86\;..\lib\;</AdditionalLibraryDirectories>
124124
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
125125
</Link>
126126
</ItemDefinitionGroup>
127127
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|Win32'">
128128
<ClCompile>
129129
<Optimization>Full</Optimization>
130130
<IntrinsicFunctions>true</IntrinsicFunctions>
131-
<AdditionalIncludeDirectories>..\Effekseer\;..\EffekseerRendererDX9\;..\EffekseerSoundXAudio2\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
131+
<AdditionalIncludeDirectories>..\Effekseer\;..\EffekseerRendererDX9\;..\EffekseerSoundXAudio2\;..\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
132132
<PreprocessorDefinitions>WIN32;NDEBUG;_NDEBUG;_WINDOWS;__EFFEKSEER_RENDERER_INTERNAL_LOADER__;%(PreprocessorDefinitions)</PreprocessorDefinitions>
133133
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
134134
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -144,15 +144,15 @@
144144
<OptimizeReferences>true</OptimizeReferences>
145145
<EnableCOMDATFolding>true</EnableCOMDATFolding>
146146
<TargetMachine>MachineX86</TargetMachine>
147-
<AdditionalLibraryDirectories>..\lib\x86\</AdditionalLibraryDirectories>
147+
<AdditionalLibraryDirectories>..\lib\x86\;..\lib\;</AdditionalLibraryDirectories>
148148
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
149149
</Link>
150150
</ItemDefinitionGroup>
151151
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_DLL|Win32'">
152152
<ClCompile>
153153
<Optimization>Disabled</Optimization>
154154
<IntrinsicFunctions>true</IntrinsicFunctions>
155-
<AdditionalIncludeDirectories>..\Effekseer\;..\EffekseerRendererDX9\;..\EffekseerSoundXAudio2\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
155+
<AdditionalIncludeDirectories>..\Effekseer\;..\EffekseerRendererDX9\;..\EffekseerSoundXAudio2\;..\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
156156
<PreprocessorDefinitions>_DEBUG;DEBUG;WIN32;_WINDOWS;_DEBUG_EFFEKSEER;__EFFEKSEER_RENDERER_INTERNAL_LOADER__;%(PreprocessorDefinitions)</PreprocessorDefinitions>
157157
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
158158
<FunctionLevelLinking>false</FunctionLevelLinking>
@@ -165,7 +165,7 @@
165165
<OptimizeReferences>true</OptimizeReferences>
166166
<EnableCOMDATFolding>true</EnableCOMDATFolding>
167167
<TargetMachine>MachineX86</TargetMachine>
168-
<AdditionalLibraryDirectories>..\lib\x86\</AdditionalLibraryDirectories>
168+
<AdditionalLibraryDirectories>..\lib\x86\;..\lib\;</AdditionalLibraryDirectories>
169169
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
170170
</Link>
171171
<CustomBuildStep>

Dev/Cpp/Viewer/dll.cpp

+89
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,18 @@
99
#pragma comment(lib, "d3d9.lib" )
1010
#pragma comment(lib, "d3dx9.lib" )
1111

12+
#define NONDLL 1
13+
#define MSWIN32 1
14+
#define BGDWIN32 1
15+
#include <gd/gd.h>
16+
#include <gd/gdfontmb.h>
17+
18+
#if _DEBUG
19+
#pragma comment(lib,"Debug/libgd_static.lib")
20+
#else
21+
#pragma comment(lib,"Release/libgd_static.lib")
22+
#endif
23+
1224
//----------------------------------------------------------------------------------
1325
//
1426
//----------------------------------------------------------------------------------
@@ -1078,6 +1090,83 @@ Exit:;
10781090
return true;
10791091
}
10801092

1093+
bool Native::RecordAsGifAnimation(const wchar_t* path, int32_t count, int32_t offsetFrame, int32_t freq, bool isTranslucent)
1094+
{
1095+
if (g_effect == NULL) return false;
1096+
1097+
g_renderer->IsBackgroundTranslucent = isTranslucent;
1098+
1099+
::Effekseer::Vector3D position(0, 0, g_Distance);
1100+
::Effekseer::Matrix43 mat, mat_rot_x, mat_rot_y;
1101+
mat_rot_x.RotationX(-g_RotX / 180.0f * PI);
1102+
mat_rot_y.RotationY(-g_RotY / 180.0f * PI);
1103+
::Effekseer::Matrix43::Multiple(mat, mat_rot_x, mat_rot_y);
1104+
::Effekseer::Vector3D::Transform(position, position, mat);
1105+
position.X += g_focus_position.X;
1106+
position.Y += g_focus_position.Y;
1107+
position.Z += g_focus_position.Z;
1108+
1109+
g_renderer->GetRenderer()->SetCameraMatrix(::Effekseer::Matrix44().LookAtRH(position, g_focus_position, ::Effekseer::Vector3D(0.0f, 1.0f, 0.0f)));
1110+
1111+
StopEffect();
1112+
1113+
::Effekseer::Handle handle = g_manager->Play(g_effect, 0, 0, 0);
1114+
1115+
for (int i = 0; i < offsetFrame; i++)
1116+
{
1117+
g_manager->Update();
1118+
}
1119+
1120+
FILE* fp = nullptr;
1121+
gdImagePtr img = nullptr;
1122+
1123+
img = gdImageCreate(g_renderer->GuideWidth, g_renderer->GuideHeight);
1124+
fp = _wfopen(path, L"wb");
1125+
gdImageGifAnimBegin(img, fp, false, 0);
1126+
1127+
for (int32_t i = 0; i < count; i++)
1128+
{
1129+
if (!g_renderer->BeginRecord(g_renderer->GuideWidth, g_renderer->GuideHeight)) return false;
1130+
1131+
g_renderer->SetRecordRect(0, 0);
1132+
1133+
g_renderer->BeginRendering();
1134+
g_manager->Draw();
1135+
g_renderer->EndRendering();
1136+
1137+
for (int j = 0; j < freq; j++)
1138+
{
1139+
g_manager->Update();
1140+
}
1141+
1142+
std::vector<Effekseer::Color> pixels;
1143+
g_renderer->EndRecord(pixels);
1144+
1145+
int delay = (int) round((1.0 / (double) 60.0 * freq) * 100.0);
1146+
gdImagePtr frameImage = gdImageCreateTrueColor(g_renderer->GuideWidth, g_renderer->GuideHeight);
1147+
1148+
for (int32_t y = 0; y < g_renderer->GuideHeight; y++)
1149+
{
1150+
for (int32_t x = 0; x < g_renderer->GuideWidth; x++)
1151+
{
1152+
auto c = pixels[x + y * g_renderer->GuideWidth];
1153+
gdImageSetPixel(frameImage, x, y, gdTrueColor(c.R, c.G, c.B));
1154+
}
1155+
}
1156+
gdImageTrueColorToPalette(frameImage, true, gdMaxColors);
1157+
gdImageGifAnimAdd(frameImage, fp, true, 0, 0, delay, gdDisposalNone, NULL);
1158+
gdImageDestroy(frameImage);
1159+
}
1160+
1161+
gdImageGifAnimEnd(fp);
1162+
fclose(fp);
1163+
gdImageDestroy(img);
1164+
1165+
g_manager->StopEffect(handle);
1166+
g_manager->Update();
1167+
return true;
1168+
}
1169+
10811170
//----------------------------------------------------------------------------------
10821171
//
10831172
//----------------------------------------------------------------------------------

Dev/Cpp/Viewer/dll.h

+2
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@ class Native
189189

190190
bool Record(const wchar_t* path, int32_t count, int32_t xCount, int32_t offsetFrame, int32_t freq, bool isTranslucent);
191191

192+
bool RecordAsGifAnimation(const wchar_t* path, int32_t count, int32_t offsetFrame, int32_t freq, bool isTranslucent);
193+
192194
ViewerParamater GetViewerParamater();
193195

194196
void SetViewerParamater( ViewerParamater& paramater );

Dev/Cpp/Viewer/dll_cs.cxx

+22
Original file line numberDiff line numberDiff line change
@@ -1550,6 +1550,28 @@ SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Native_Record__SWIG_1(void * jarg1, w
15501550
}
15511551

15521552

1553+
SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Native_RecordAsGifAnimation(void * jarg1, wchar_t * jarg2, int jarg3, int jarg4, int jarg5, unsigned int jarg6) {
1554+
unsigned int jresult ;
1555+
Native *arg1 = (Native *) 0 ;
1556+
wchar_t *arg2 = (wchar_t *) 0 ;
1557+
int32_t arg3 ;
1558+
int32_t arg4 ;
1559+
int32_t arg5 ;
1560+
bool arg6 ;
1561+
bool result;
1562+
1563+
arg1 = (Native *)jarg1;
1564+
arg2 = (wchar_t *)jarg2;
1565+
arg3 = (int32_t)jarg3;
1566+
arg4 = (int32_t)jarg4;
1567+
arg5 = (int32_t)jarg5;
1568+
arg6 = jarg6 ? true : false;
1569+
result = (bool)(arg1)->RecordAsGifAnimation((wchar_t const *)arg2,arg3,arg4,arg5,arg6);
1570+
jresult = result;
1571+
return jresult;
1572+
}
1573+
1574+
15531575
SWIGEXPORT void * SWIGSTDCALL CSharp_Native_GetViewerParamater(void * jarg1) {
15541576
void * jresult ;
15551577
Native *arg1 = (Native *) 0 ;

0 commit comments

Comments
 (0)