void* ModelLoader::Load(const void* data, int32_t size)
{
	Model* model = new Model((uint8_t*)data, size);

	model->ModelCount = Effekseer::Min(Effekseer::Max(model->GetModelCount(), 1), 40);

	model->InternalModels = new Model::InternalModel[model->GetFrameCount()];

	for (int32_t f = 0; f < model->GetFrameCount(); f++)
	{
		model->InternalModels[f].VertexCount = model->GetVertexCount(f);

		{
			std::vector<Effekseer::Model::VertexWithIndex> vs;
			for (int32_t m = 0; m < model->ModelCount; m++)
			{
				for (int32_t i = 0; i < model->GetVertexCount(f); i++)
				{
					Effekseer::Model::VertexWithIndex v;
					v.Position = model->GetVertexes(f)[i].Position;
					v.Normal = model->GetVertexes(f)[i].Normal;
					v.Binormal = model->GetVertexes(f)[i].Binormal;
					v.Tangent = model->GetVertexes(f)[i].Tangent;
					v.UV = model->GetVertexes(f)[i].UV;
					v.VColor = model->GetVertexes(f)[i].VColor;
					v.Index[0] = m;

					vs.push_back(v);
				}
			}

			ID3D11Buffer* vb = NULL;

			D3D11_BUFFER_DESC hBufferDesc;
			hBufferDesc.ByteWidth = sizeof(Effekseer::Model::VertexWithIndex) * model->GetVertexCount(f) * model->ModelCount;
			hBufferDesc.Usage = D3D11_USAGE_DEFAULT;
			hBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
			hBufferDesc.CPUAccessFlags = 0;
			hBufferDesc.MiscFlags = 0;
			hBufferDesc.StructureByteStride = sizeof(float);

			D3D11_SUBRESOURCE_DATA hSubResourceData;
			hSubResourceData.pSysMem = &(vs[0]);
			hSubResourceData.SysMemPitch = 0;
			hSubResourceData.SysMemSlicePitch = 0;

			if (FAILED(device->CreateBuffer(&hBufferDesc, &hSubResourceData, &vb)))
			{
				return NULL;
			}

			model->InternalModels[f].VertexBuffer = vb;
		}

		model->InternalModels[f].FaceCount = model->GetFaceCount(f);
		model->InternalModels[f].IndexCount = model->InternalModels[f].FaceCount * 3;

		{
			std::vector<Effekseer::Model::Face> fs;
			for (int32_t m = 0; m < model->ModelCount; m++)
			{
				for (int32_t i = 0; i < model->InternalModels[f].FaceCount; i++)
				{
					Effekseer::Model::Face face;
					face.Indexes[0] = model->GetFaces(f)[i].Indexes[0] + model->GetVertexCount(f) * m;
					face.Indexes[1] = model->GetFaces(f)[i].Indexes[1] + model->GetVertexCount(f) * m;
					face.Indexes[2] = model->GetFaces(f)[i].Indexes[2] + model->GetVertexCount(f) * m;
					fs.push_back(face);
				}
			}

			ID3D11Buffer* ib = NULL;
			D3D11_BUFFER_DESC hBufferDesc;
			hBufferDesc.Usage = D3D11_USAGE_DEFAULT;
			hBufferDesc.ByteWidth = sizeof(int32_t) * 3 * model->InternalModels[f].FaceCount * model->ModelCount;
			hBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
			hBufferDesc.CPUAccessFlags = 0;
			hBufferDesc.MiscFlags = 0;
			hBufferDesc.StructureByteStride = sizeof(int32_t);

			D3D11_SUBRESOURCE_DATA hSubResourceData;
			hSubResourceData.pSysMem = &(fs[0]);
			hSubResourceData.SysMemPitch = 0;
			hSubResourceData.SysMemSlicePitch = 0;

			if (FAILED(device->CreateBuffer(&hBufferDesc, &hSubResourceData, &ib)))
			{
				ES_SAFE_DELETE(model);
				return nullptr;
			}

			model->InternalModels[f].IndexBuffer = ib;
		}
	}

	return model;
}