1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
/************************************************************************************
Filename : WavPlayer_OSX.h
Content : A DDS file loader for cross-platform compressed texture support.
Created : March 5, 2013
Authors : Peter Hoff, Dan Goodman, Bryan Croteau
Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
************************************************************************************/
#include "Render_Device.h"
#ifdef OVR_DEFINE_NEW
#undef new
#endif
namespace OVR { namespace Render {
static const UPInt OVR_DDS_PF_FOURCC = 0x4;
static const UInt32 OVR_DTX1_MAGIC_NUMBER = 827611204;
static const UInt32 OVR_DTX5_MAGIC_NUMBER = 894720068;
struct OVR_DDS_PIXELFORMAT
{
UInt32 Size;
UInt32 Flags;
UInt32 FourCC;
UInt32 RGBBitCount;
UInt32 RBitMask;
UInt32 GBitMask;
UInt32 BBitMask;
UInt32 ABitMask;
};
struct OVR_DDS_HEADER
{
UInt32 Size;
UInt32 Flags;
UInt32 Height;
UInt32 Width;
UInt32 PitchOrLinearSize;
UInt32 Depth;
UInt32 MipMapCount;
UInt32 Reserved1[11];
OVR_DDS_PIXELFORMAT PixelFormat;
UInt32 Caps;
UInt32 Caps2;
UInt32 Caps3;
UInt32 Caps4;
UInt32 Reserved2;
};
Texture* LoadTextureDDS(RenderDevice* ren, File* f)
{
OVR_DDS_HEADER header;
unsigned char filecode[4];
f->Read(filecode, 4);
if (strncmp((const char*)filecode, "DDS ", 4) != 0)
{
return NULL;
}
f->Read((unsigned char*)(&header), sizeof(header));
int width = header.Width;
int height = header.Height;
int format = Texture_RGBA;
UInt32 mipCount = header.MipMapCount;
if(mipCount <= 0)
{
mipCount = 1;
}
if(header.PixelFormat.Flags & OVR_DDS_PF_FOURCC)
{
if(header.PixelFormat.FourCC == OVR_DTX1_MAGIC_NUMBER)
{
format = Texture_DXT1;
}
else if(header.PixelFormat.FourCC == OVR_DTX5_MAGIC_NUMBER)
{
format = Texture_DXT5;
}
else
{
return NULL;
}
}
int byteLen = f->BytesAvailable();
unsigned char* bytes = new unsigned char[byteLen];
f->Read(bytes, byteLen);
Texture* out = ren->CreateTexture(format, (int)width, (int)height, bytes, mipCount);
if(strstr(f->GetFilePath(), "_c."))
{
out->SetSampleMode(Sample_Clamp);
}
OVR_FREE(bytes);
return out;
}
}}
#ifdef OVR_DEFINE_NEW
#define new OVR_DEFINE_NEW
#endif
|