mirror of
https://github.com/ZDoom/ZDRay.git
synced 2024-11-21 19:50:54 +00:00
Add a bit more of the texture loading
This commit is contained in:
parent
4d37a89070
commit
ff91b34939
5 changed files with 71 additions and 9 deletions
|
@ -1,4 +1,35 @@
|
||||||
|
|
||||||
#include "textureid.h"
|
#include "textureid.h"
|
||||||
|
#include "filesystem.h"
|
||||||
|
#include "picopng/picopng.h"
|
||||||
|
|
||||||
FTextureManager TexMan;
|
FTextureManager TexMan;
|
||||||
|
|
||||||
|
FGameTexture::FGameTexture(FString name) : Name(name)
|
||||||
|
{
|
||||||
|
int lump = fileSystem.CheckNumForFullName(name);
|
||||||
|
if (lump < 0)
|
||||||
|
{
|
||||||
|
// Not found - should we mark it as invalid or use a dummy texture?
|
||||||
|
DisplayWidth = 64.0f;
|
||||||
|
DisplayHeight = 64.0f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// To do: figure out what type of data we got here instead of assuming it is a png.
|
||||||
|
|
||||||
|
FileData filedata = fileSystem.ReadFile(lump);
|
||||||
|
int result = decodePNG(Pixels, Width, Height, (const unsigned char*)filedata.GetMem(), fileSystem.FileLength(lump), true);
|
||||||
|
if (result == 0)
|
||||||
|
{
|
||||||
|
DisplayWidth = (float)Width;
|
||||||
|
DisplayHeight = (float)Height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Not a png.
|
||||||
|
DisplayWidth = 64.0f;
|
||||||
|
DisplayHeight = 64.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -75,14 +75,28 @@ public:
|
||||||
class FGameTexture
|
class FGameTexture
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
FGameTexture() { Name = "-"; Valid = false; }
|
||||||
|
FGameTexture(FString name);
|
||||||
|
|
||||||
bool isValid() const { return Valid; }
|
bool isValid() const { return Valid; }
|
||||||
float GetDisplayWidth() const { return 64.0f; }
|
float GetDisplayWidth() const { return DisplayWidth; }
|
||||||
float GetDisplayHeight() const { return 64.0f; }
|
float GetDisplayHeight() const { return DisplayHeight; }
|
||||||
float GetScaleY() const { return 1.0f; }
|
float GetScaleY() const { return ScaleY; }
|
||||||
|
|
||||||
|
const void* GetImagePixels() const { return Pixels.data(); }
|
||||||
|
int GetImageWidth() const { return Width; }
|
||||||
|
int GetImageHeight() const { return Height; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FString Name;
|
FString Name;
|
||||||
bool Valid = true;
|
bool Valid = true;
|
||||||
|
float DisplayWidth = 0.0f;
|
||||||
|
float DisplayHeight = 0.0f;
|
||||||
|
float ScaleY = 1.0f;
|
||||||
|
|
||||||
|
std::vector<unsigned char> Pixels;
|
||||||
|
unsigned long Width = 0;
|
||||||
|
unsigned long Height = 0;
|
||||||
|
|
||||||
friend class FTextureManager;
|
friend class FTextureManager;
|
||||||
};
|
};
|
||||||
|
@ -93,8 +107,6 @@ public:
|
||||||
FTextureManager()
|
FTextureManager()
|
||||||
{
|
{
|
||||||
Textures.Push(std::make_unique<FGameTexture>());
|
Textures.Push(std::make_unique<FGameTexture>());
|
||||||
Textures.Last()->Name = "-";
|
|
||||||
Textures.Last()->Valid = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FGameTexture* GetGameTexture(FTextureID texnum, bool animate = false)
|
FGameTexture* GetGameTexture(FTextureID texnum, bool animate = false)
|
||||||
|
@ -140,8 +152,7 @@ public:
|
||||||
return FTextureID(it->second);
|
return FTextureID(it->second);
|
||||||
|
|
||||||
int id = Textures.Size();
|
int id = Textures.Size();
|
||||||
Textures.Push(std::make_unique<FGameTexture>());
|
Textures.Push(std::make_unique<FGameTexture>(name));
|
||||||
Textures.Last()->Name = name;
|
|
||||||
NameToID[name] = id;
|
NameToID[name] = id;
|
||||||
|
|
||||||
return FTextureID(id);
|
return FTextureID(id);
|
||||||
|
|
|
@ -54,6 +54,7 @@ void GPURaytracer::Raytrace(DoomLevelMesh* mesh)
|
||||||
{
|
{
|
||||||
levelmesh->BeginFrame();
|
levelmesh->BeginFrame();
|
||||||
lightmapper->BeginFrame();
|
lightmapper->BeginFrame();
|
||||||
|
mDevice->GetDescriptorSetManager()->UpdateBindlessDescriptorSet();
|
||||||
|
|
||||||
TArray<LightmapTile*> tiles;
|
TArray<LightmapTile*> tiles;
|
||||||
for (unsigned int i = 0, count = mesh->LightmapTiles.Size(); i < count; i++)
|
for (unsigned int i = 0, count = mesh->LightmapTiles.Size(); i < count; i++)
|
||||||
|
|
|
@ -81,7 +81,6 @@ VulkanRenderDevice::VulkanRenderDevice(LevelMeshViewer* viewer)
|
||||||
levelmesh = std::make_unique<VkLevelMesh>(this);
|
levelmesh = std::make_unique<VkLevelMesh>(this);
|
||||||
lightmapper = std::make_unique<VkLightmapper>(this);
|
lightmapper = std::make_unique<VkLightmapper>(this);
|
||||||
|
|
||||||
descriptors->AddBindlessTextureIndex(GetTextureManager()->GetNullTextureView(), GetSamplerManager()->Get());
|
|
||||||
descriptors->AddBindlessTextureIndex(GetTextureManager()->GetNullTextureView(), GetSamplerManager()->Get());
|
descriptors->AddBindlessTextureIndex(GetTextureManager()->GetNullTextureView(), GetSamplerManager()->Get());
|
||||||
descriptors->UpdateBindlessDescriptorSet();
|
descriptors->UpdateBindlessDescriptorSet();
|
||||||
|
|
||||||
|
@ -93,6 +92,25 @@ VulkanRenderDevice::~VulkanRenderDevice()
|
||||||
vkDeviceWaitIdle(device->device);
|
vkDeviceWaitIdle(device->device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int VulkanRenderDevice::GetBindlessTextureIndex(FTextureID textureID)
|
||||||
|
{
|
||||||
|
if (!textureID.isValid())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
FGameTexture* tex = TexMan.GetGameTexture(textureID);
|
||||||
|
int& textureIndex = TextureIndexes[tex];
|
||||||
|
if (textureIndex != 0)
|
||||||
|
return textureIndex;
|
||||||
|
|
||||||
|
// To do: upload image
|
||||||
|
|
||||||
|
VulkanImageView* view = GetTextureManager()->GetNullTextureView();
|
||||||
|
VulkanSampler* sampler = GetSamplerManager()->Get();
|
||||||
|
|
||||||
|
textureIndex = GetDescriptorSetManager()->AddBindlessTextureIndex(view, sampler);
|
||||||
|
return textureIndex;
|
||||||
|
}
|
||||||
|
|
||||||
void VulkanRenderDevice::DrawViewer(const FVector3& cameraPos, const VSMatrix& viewToWorld, float fovy, float aspect, const FVector3& sundir, const FVector3& suncolor, float sunintensity)
|
void VulkanRenderDevice::DrawViewer(const FVector3& cameraPos, const VSMatrix& viewToWorld, float fovy, float aspect, const FVector3& sundir, const FVector3& suncolor, float sunintensity)
|
||||||
{
|
{
|
||||||
int imageIndex = GetCommands()->AcquireImage();
|
int imageIndex = GetCommands()->AcquireImage();
|
||||||
|
|
|
@ -32,7 +32,7 @@ public:
|
||||||
VkLevelMesh* GetLevelMesh() { return levelmesh.get(); }
|
VkLevelMesh* GetLevelMesh() { return levelmesh.get(); }
|
||||||
VkLightmapper* GetLightmapper() { return lightmapper.get(); }
|
VkLightmapper* GetLightmapper() { return lightmapper.get(); }
|
||||||
|
|
||||||
int GetBindlessTextureIndex(FTextureID texture) { return texture.isValid() ? 1 : 0; }
|
int GetBindlessTextureIndex(FTextureID texture);
|
||||||
|
|
||||||
bool IsRayQueryEnabled() const { return useRayQuery; }
|
bool IsRayQueryEnabled() const { return useRayQuery; }
|
||||||
|
|
||||||
|
@ -68,6 +68,7 @@ private:
|
||||||
int CurrentWidth = 0;
|
int CurrentWidth = 0;
|
||||||
int CurrentHeight = 0;
|
int CurrentHeight = 0;
|
||||||
std::vector<std::unique_ptr<VulkanFramebuffer>> Framebuffers;
|
std::vector<std::unique_ptr<VulkanFramebuffer>> Framebuffers;
|
||||||
|
std::unordered_map<FGameTexture*, int> TextureIndexes;
|
||||||
};
|
};
|
||||||
|
|
||||||
class VkCommandBufferManager
|
class VkCommandBufferManager
|
||||||
|
|
Loading…
Reference in a new issue