mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-28 23:12:24 +00:00
- split off the data generation parts of gl_skydome.cpp
This commit is contained in:
parent
785a6c2ce5
commit
d694e19f01
5 changed files with 341 additions and 284 deletions
|
@ -1054,6 +1054,7 @@ set (PCH_SOURCES
|
||||||
gl/textures/gl_samplers.cpp
|
gl/textures/gl_samplers.cpp
|
||||||
hwrenderer/data/flatvertices.cpp
|
hwrenderer/data/flatvertices.cpp
|
||||||
hwrenderer/dynlights/hw_aabbtree.cpp
|
hwrenderer/dynlights/hw_aabbtree.cpp
|
||||||
|
hwrenderer/scene/hw_skydome.cpp
|
||||||
hwrenderer/textures/hw_material.cpp
|
hwrenderer/textures/hw_material.cpp
|
||||||
hwrenderer/textures/hw_precache.cpp
|
hwrenderer/textures/hw_precache.cpp
|
||||||
hwrenderer/utility/hw_clock.cpp
|
hwrenderer/utility/hw_clock.cpp
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "gl/system/gl_interface.h"
|
#include "gl/system/gl_interface.h"
|
||||||
#include "r_data/models/models.h"
|
#include "r_data/models/models.h"
|
||||||
#include "hwrenderer/data/flatvertices.h"
|
#include "hwrenderer/data/flatvertices.h"
|
||||||
|
#include "hwrenderer/scene/hw_skydome.h"
|
||||||
|
|
||||||
struct vertex_t;
|
struct vertex_t;
|
||||||
struct secplane_t;
|
struct secplane_t;
|
||||||
|
@ -196,73 +197,15 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct FSkyVertex
|
class FSkyVertexBuffer : public FVertexBuffer, public FSkyDomeCreator
|
||||||
{
|
{
|
||||||
float x, y, z, u, v;
|
|
||||||
PalEntry color;
|
|
||||||
|
|
||||||
void Set(float xx, float zz, float yy, float uu=0, float vv=0, PalEntry col=0xffffffff)
|
|
||||||
{
|
|
||||||
x = xx;
|
|
||||||
z = zz;
|
|
||||||
y = yy;
|
|
||||||
u = uu;
|
|
||||||
v = vv;
|
|
||||||
color = col;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetXYZ(float xx, float yy, float zz, float uu = 0, float vv = 0, PalEntry col = 0xffffffff)
|
|
||||||
{
|
|
||||||
x = xx;
|
|
||||||
y = yy;
|
|
||||||
z = zz;
|
|
||||||
u = uu;
|
|
||||||
v = vv;
|
|
||||||
color = col;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
class FSkyVertexBuffer : public FVertexBuffer
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static const int SKYHEMI_UPPER = 1;
|
|
||||||
static const int SKYHEMI_LOWER = 2;
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
SKYMODE_MAINLAYER = 0,
|
|
||||||
SKYMODE_SECONDLAYER = 1,
|
|
||||||
SKYMODE_FOGLAYER = 2
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
|
||||||
TArray<FSkyVertex> mVertices;
|
|
||||||
TArray<unsigned int> mPrimStart;
|
|
||||||
|
|
||||||
int mRows, mColumns;
|
|
||||||
|
|
||||||
// indices for sky cubemap faces
|
|
||||||
int mFaceStart[7];
|
|
||||||
int mSideStart;
|
|
||||||
|
|
||||||
void SkyVertex(int r, int c, bool yflip);
|
|
||||||
void CreateSkyHemisphere(int hemi);
|
|
||||||
void CreateDome();
|
|
||||||
void RenderRow(int prim, int row);
|
void RenderRow(int prim, int row);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
FSkyVertexBuffer();
|
FSkyVertexBuffer();
|
||||||
virtual ~FSkyVertexBuffer();
|
|
||||||
void RenderDome(FMaterial *tex, int mode);
|
void RenderDome(FMaterial *tex, int mode);
|
||||||
void BindVBO();
|
void BindVBO();
|
||||||
int FaceStart(int i)
|
|
||||||
{
|
|
||||||
if (i >= 0 && i < 7) return mFaceStart[i];
|
|
||||||
else return mSideStart;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class FModelVertexBuffer : public FVertexBuffer, public IModelVertexBuffer
|
class FModelVertexBuffer : public FVertexBuffer, public IModelVertexBuffer
|
||||||
|
|
|
@ -19,40 +19,7 @@
|
||||||
//
|
//
|
||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
/*
|
|
||||||
**
|
|
||||||
** Draws the sky. Loosely based on the JDoom sky and the ZDoomGL 0.66.2 sky.
|
|
||||||
**
|
|
||||||
** for FSkyVertexBuffer::SkyVertex only:
|
|
||||||
**---------------------------------------------------------------------------
|
|
||||||
** Copyright 2003 Tim Stump
|
|
||||||
** All rights reserved.
|
|
||||||
**
|
|
||||||
** Redistribution and use in source and binary forms, with or without
|
|
||||||
** modification, are permitted provided that the following conditions
|
|
||||||
** are met:
|
|
||||||
**
|
|
||||||
** 1. Redistributions of source code must retain the above copyright
|
|
||||||
** notice, this list of conditions and the following disclaimer.
|
|
||||||
** 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
** notice, this list of conditions and the following disclaimer in the
|
|
||||||
** documentation and/or other materials provided with the distribution.
|
|
||||||
** 3. The name of the author may not be used to endorse or promote products
|
|
||||||
** derived from this software without specific prior written permission.
|
|
||||||
**
|
|
||||||
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
**---------------------------------------------------------------------------
|
|
||||||
**
|
|
||||||
*/
|
|
||||||
#include "gl/system/gl_system.h"
|
#include "gl/system/gl_system.h"
|
||||||
#include "doomtype.h"
|
#include "doomtype.h"
|
||||||
#include "g_level.h"
|
#include "g_level.h"
|
||||||
|
@ -71,15 +38,6 @@
|
||||||
#include "gl/shaders/gl_shader.h"
|
#include "gl/shaders/gl_shader.h"
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Shamelessly lifted from Doomsday (written by Jaakko Keränen)
|
|
||||||
// also shamelessly lifted from ZDoomGL! ;)
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
CVAR(Float, skyoffset, 0, 0) // for testing
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
@ -88,11 +46,8 @@ CVAR(Float, skyoffset, 0, 0) // for testing
|
||||||
|
|
||||||
FSkyVertexBuffer::FSkyVertexBuffer()
|
FSkyVertexBuffer::FSkyVertexBuffer()
|
||||||
{
|
{
|
||||||
CreateDome();
|
glBindBuffer(GL_ARRAY_BUFFER, vbo_id);
|
||||||
}
|
glBufferData(GL_ARRAY_BUFFER, mVertices.Size() * sizeof(FSkyVertex), &mVertices[0], GL_STATIC_DRAW);
|
||||||
|
|
||||||
FSkyVertexBuffer::~FSkyVertexBuffer()
|
|
||||||
{
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FSkyVertexBuffer::BindVBO()
|
void FSkyVertexBuffer::BindVBO()
|
||||||
|
@ -126,183 +81,6 @@ void FSkyVertexBuffer::BindVBO()
|
||||||
//
|
//
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
void FSkyVertexBuffer::SkyVertex(int r, int c, bool zflip)
|
|
||||||
{
|
|
||||||
static const FAngle maxSideAngle = 60.f;
|
|
||||||
static const float scale = 10000.;
|
|
||||||
|
|
||||||
FAngle topAngle = (c / (float)mColumns * 360.f);
|
|
||||||
FAngle sideAngle = maxSideAngle * (mRows - r) / mRows;
|
|
||||||
float height = sideAngle.Sin();
|
|
||||||
float realRadius = scale * sideAngle.Cos();
|
|
||||||
FVector2 pos = topAngle.ToVector(realRadius);
|
|
||||||
float z = (!zflip) ? scale * height : -scale * height;
|
|
||||||
|
|
||||||
FSkyVertex vert;
|
|
||||||
|
|
||||||
vert.color = r == 0 ? 0xffffff : 0xffffffff;
|
|
||||||
|
|
||||||
// And the texture coordinates.
|
|
||||||
if (!zflip) // Flipped Y is for the lower hemisphere.
|
|
||||||
{
|
|
||||||
vert.u = (-c / (float)mColumns);
|
|
||||||
vert.v = (r / (float)mRows);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vert.u = (-c / (float)mColumns);
|
|
||||||
vert.v = 1.0f + ((mRows - r) / (float)mRows);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r != 4) z += 300;
|
|
||||||
// And finally the vertex.
|
|
||||||
vert.x = -pos.X; // Doom mirrors the sky vertically!
|
|
||||||
vert.y = z - 1.f;
|
|
||||||
vert.z = pos.Y;
|
|
||||||
|
|
||||||
mVertices.Push(vert);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void FSkyVertexBuffer::CreateSkyHemisphere(int hemi)
|
|
||||||
{
|
|
||||||
int r, c;
|
|
||||||
bool zflip = !!(hemi & SKYHEMI_LOWER);
|
|
||||||
|
|
||||||
mPrimStart.Push(mVertices.Size());
|
|
||||||
|
|
||||||
for (c = 0; c < mColumns; c++)
|
|
||||||
{
|
|
||||||
SkyVertex(1, c, zflip);
|
|
||||||
}
|
|
||||||
|
|
||||||
// The total number of triangles per hemisphere can be calculated
|
|
||||||
// as follows: rows * columns * 2 + 2 (for the top cap).
|
|
||||||
for (r = 0; r < mRows; r++)
|
|
||||||
{
|
|
||||||
mPrimStart.Push(mVertices.Size());
|
|
||||||
for (c = 0; c <= mColumns; c++)
|
|
||||||
{
|
|
||||||
SkyVertex(r + zflip, c, zflip);
|
|
||||||
SkyVertex(r + 1 - zflip, c, zflip);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void FSkyVertexBuffer::CreateDome()
|
|
||||||
{
|
|
||||||
// the first thing we put into the buffer is the fog layer object which is just 4 triangles around the viewpoint.
|
|
||||||
|
|
||||||
mVertices.Reserve(12);
|
|
||||||
mVertices[0].Set(1.0f, 1.0f, -1.0f);
|
|
||||||
mVertices[1].Set(1.0f, -1.0f, -1.0f);
|
|
||||||
mVertices[2].Set(-1.0f, 0.0f, -1.0f);
|
|
||||||
|
|
||||||
mVertices[3].Set(1.0f, 1.0f, -1.0f);
|
|
||||||
mVertices[4].Set(1.0f, -1.0f, -1.0f);
|
|
||||||
mVertices[5].Set(0.0f, 0.0f, 1.0f);
|
|
||||||
|
|
||||||
mVertices[6].Set(-1.0f, 0.0f, -1.0f);
|
|
||||||
mVertices[7].Set(1.0f, 1.0f, -1.0f);
|
|
||||||
mVertices[8].Set(0.0f, 0.0f, 1.0f);
|
|
||||||
|
|
||||||
mVertices[9].Set(1.0f, -1.0f, -1.0f);
|
|
||||||
mVertices[10].Set(-1.0f, 0.0f, -1.0f);
|
|
||||||
mVertices[11].Set(0.0f, 0.0f, 1.0f);
|
|
||||||
|
|
||||||
mColumns = 128;
|
|
||||||
mRows = 4;
|
|
||||||
CreateSkyHemisphere(SKYHEMI_UPPER);
|
|
||||||
CreateSkyHemisphere(SKYHEMI_LOWER);
|
|
||||||
mPrimStart.Push(mVertices.Size());
|
|
||||||
|
|
||||||
mSideStart = mVertices.Size();
|
|
||||||
mFaceStart[0] = mSideStart + 10;
|
|
||||||
mFaceStart[1] = mFaceStart[0] + 4;
|
|
||||||
mFaceStart[2] = mFaceStart[1] + 4;
|
|
||||||
mFaceStart[3] = mFaceStart[2] + 4;
|
|
||||||
mFaceStart[4] = mFaceStart[3] + 4;
|
|
||||||
mFaceStart[5] = mFaceStart[4] + 4;
|
|
||||||
mFaceStart[6] = mFaceStart[5] + 4;
|
|
||||||
mVertices.Reserve(10 + 7*4);
|
|
||||||
FSkyVertex *ptr = &mVertices[mSideStart];
|
|
||||||
|
|
||||||
// all sides
|
|
||||||
ptr[0].SetXYZ(128.f, 128.f, -128.f, 0, 0);
|
|
||||||
ptr[1].SetXYZ(128.f, -128.f, -128.f, 0, 1);
|
|
||||||
ptr[2].SetXYZ(-128.f, 128.f, -128.f, 0.25f, 0);
|
|
||||||
ptr[3].SetXYZ(-128.f, -128.f, -128.f, 0.25f, 1);
|
|
||||||
ptr[4].SetXYZ(-128.f, 128.f, 128.f, 0.5f, 0);
|
|
||||||
ptr[5].SetXYZ(-128.f, -128.f, 128.f, 0.5f, 1);
|
|
||||||
ptr[6].SetXYZ(128.f, 128.f, 128.f, 0.75f, 0);
|
|
||||||
ptr[7].SetXYZ(128.f, -128.f, 128.f, 0.75f, 1);
|
|
||||||
ptr[8].SetXYZ(128.f, 128.f, -128.f, 1, 0);
|
|
||||||
ptr[9].SetXYZ(128.f, -128.f, -128.f, 1, 1);
|
|
||||||
|
|
||||||
// north face
|
|
||||||
ptr[10].SetXYZ(128.f, 128.f, -128.f, 0, 0);
|
|
||||||
ptr[11].SetXYZ(-128.f, 128.f, -128.f, 1, 0);
|
|
||||||
ptr[12].SetXYZ(128.f, -128.f, -128.f, 0, 1);
|
|
||||||
ptr[13].SetXYZ(-128.f, -128.f, -128.f, 1, 1);
|
|
||||||
|
|
||||||
// east face
|
|
||||||
ptr[14].SetXYZ(-128.f, 128.f, -128.f, 0, 0);
|
|
||||||
ptr[15].SetXYZ(-128.f, 128.f, 128.f, 1, 0);
|
|
||||||
ptr[16].SetXYZ(-128.f, -128.f, -128.f, 0, 1);
|
|
||||||
ptr[17].SetXYZ(-128.f, -128.f, 128.f, 1, 1);
|
|
||||||
|
|
||||||
// south face
|
|
||||||
ptr[18].SetXYZ(-128.f, 128.f, 128.f, 0, 0);
|
|
||||||
ptr[19].SetXYZ(128.f, 128.f, 128.f, 1, 0);
|
|
||||||
ptr[20].SetXYZ(-128.f, -128.f, 128.f, 0, 1);
|
|
||||||
ptr[21].SetXYZ(128.f, -128.f, 128.f, 1, 1);
|
|
||||||
|
|
||||||
// west face
|
|
||||||
ptr[22].SetXYZ(128.f, 128.f, 128.f, 0, 0);
|
|
||||||
ptr[23].SetXYZ(128.f, 128.f, -128.f, 1, 0);
|
|
||||||
ptr[24].SetXYZ(128.f, -128.f, 128.f, 0, 1);
|
|
||||||
ptr[25].SetXYZ(128.f, -128.f, -128.f, 1, 1);
|
|
||||||
|
|
||||||
// bottom face
|
|
||||||
ptr[26].SetXYZ(128.f, -128.f, -128.f, 0, 0);
|
|
||||||
ptr[27].SetXYZ(-128.f, -128.f, -128.f, 1, 0);
|
|
||||||
ptr[28].SetXYZ(128.f, -128.f, 128.f, 0, 1);
|
|
||||||
ptr[29].SetXYZ(-128.f, -128.f, 128.f, 1, 1);
|
|
||||||
|
|
||||||
// top face
|
|
||||||
ptr[30].SetXYZ(128.f, 128.f, -128.f, 0, 0);
|
|
||||||
ptr[31].SetXYZ(-128.f, 128.f, -128.f, 1, 0);
|
|
||||||
ptr[32].SetXYZ(128.f, 128.f, 128.f, 0, 1);
|
|
||||||
ptr[33].SetXYZ(-128.f, 128.f, 128.f, 1, 1);
|
|
||||||
|
|
||||||
// top face flipped
|
|
||||||
ptr[34].SetXYZ(128.f, 128.f, -128.f, 0, 1);
|
|
||||||
ptr[35].SetXYZ(-128.f, 128.f, -128.f, 1, 1);
|
|
||||||
ptr[36].SetXYZ(128.f, 128.f, 128.f, 0, 0);
|
|
||||||
ptr[37].SetXYZ(-128.f, 128.f, 128.f, 1, 0);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vbo_id);
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, mVertices.Size() * sizeof(FSkyVertex), &mVertices[0], GL_STATIC_DRAW);
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
inline void FSkyVertexBuffer::RenderRow(int prim, int row)
|
inline void FSkyVertexBuffer::RenderRow(int prim, int row)
|
||||||
{
|
{
|
||||||
glDrawArrays(prim, mPrimStart[row], mPrimStart[row + 1] - mPrimStart[row]);
|
glDrawArrays(prim, mPrimStart[row], mPrimStart[row + 1] - mPrimStart[row]);
|
||||||
|
|
264
src/hwrenderer/scene/hw_skydome.cpp
Normal file
264
src/hwrenderer/scene/hw_skydome.cpp
Normal file
|
@ -0,0 +1,264 @@
|
||||||
|
//
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Copyright(C) 2003-2018 Christoph Oelckers
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public License
|
||||||
|
// along with this program. If not, see http://www.gnu.org/licenses/
|
||||||
|
//
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Draws the sky. Loosely based on the JDoom sky and the ZDoomGL 0.66.2 sky.
|
||||||
|
**
|
||||||
|
** for FSkyDomeCreator::SkyVertex only:
|
||||||
|
**---------------------------------------------------------------------------
|
||||||
|
** Copyright 2003 Tim Stump
|
||||||
|
** All rights reserved.
|
||||||
|
**
|
||||||
|
** Redistribution and use in source and binary forms, with or without
|
||||||
|
** modification, are permitted provided that the following conditions
|
||||||
|
** are met:
|
||||||
|
**
|
||||||
|
** 1. Redistributions of source code must retain the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer.
|
||||||
|
** 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer in the
|
||||||
|
** documentation and/or other materials provided with the distribution.
|
||||||
|
** 3. The name of the author may not be used to endorse or promote products
|
||||||
|
** derived from this software without specific prior written permission.
|
||||||
|
**
|
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
**---------------------------------------------------------------------------
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
#include "gl/system/gl_system.h"
|
||||||
|
#include "doomtype.h"
|
||||||
|
#include "g_level.h"
|
||||||
|
#include "w_wad.h"
|
||||||
|
#include "r_state.h"
|
||||||
|
#include "r_utility.h"
|
||||||
|
#include "g_levellocals.h"
|
||||||
|
#include "textures/skyboxtexture.h"
|
||||||
|
#include "hw_skydome.h"
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Shamelessly lifted from Doomsday (written by Jaakko Keränen)
|
||||||
|
// also shamelessly lifted from ZDoomGL! ;)
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
CVAR(Float, skyoffset, 0, 0) // for testing
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
FSkyDomeCreator::FSkyDomeCreator()
|
||||||
|
{
|
||||||
|
CreateDome();
|
||||||
|
}
|
||||||
|
|
||||||
|
FSkyDomeCreator::~FSkyDomeCreator()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void FSkyDomeCreator::SkyVertex(int r, int c, bool zflip)
|
||||||
|
{
|
||||||
|
static const FAngle maxSideAngle = 60.f;
|
||||||
|
static const float scale = 10000.;
|
||||||
|
|
||||||
|
FAngle topAngle = (c / (float)mColumns * 360.f);
|
||||||
|
FAngle sideAngle = maxSideAngle * (mRows - r) / mRows;
|
||||||
|
float height = sideAngle.Sin();
|
||||||
|
float realRadius = scale * sideAngle.Cos();
|
||||||
|
FVector2 pos = topAngle.ToVector(realRadius);
|
||||||
|
float z = (!zflip) ? scale * height : -scale * height;
|
||||||
|
|
||||||
|
FSkyVertex vert;
|
||||||
|
|
||||||
|
vert.color = r == 0 ? 0xffffff : 0xffffffff;
|
||||||
|
|
||||||
|
// And the texture coordinates.
|
||||||
|
if (!zflip) // Flipped Y is for the lower hemisphere.
|
||||||
|
{
|
||||||
|
vert.u = (-c / (float)mColumns);
|
||||||
|
vert.v = (r / (float)mRows);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vert.u = (-c / (float)mColumns);
|
||||||
|
vert.v = 1.0f + ((mRows - r) / (float)mRows);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r != 4) z += 300;
|
||||||
|
// And finally the vertex.
|
||||||
|
vert.x = -pos.X; // Doom mirrors the sky vertically!
|
||||||
|
vert.y = z - 1.f;
|
||||||
|
vert.z = pos.Y;
|
||||||
|
|
||||||
|
mVertices.Push(vert);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void FSkyDomeCreator::CreateSkyHemisphere(int hemi)
|
||||||
|
{
|
||||||
|
int r, c;
|
||||||
|
bool zflip = !!(hemi & SKYHEMI_LOWER);
|
||||||
|
|
||||||
|
mPrimStart.Push(mVertices.Size());
|
||||||
|
|
||||||
|
for (c = 0; c < mColumns; c++)
|
||||||
|
{
|
||||||
|
SkyVertex(1, c, zflip);
|
||||||
|
}
|
||||||
|
|
||||||
|
// The total number of triangles per hemisphere can be calculated
|
||||||
|
// as follows: rows * columns * 2 + 2 (for the top cap).
|
||||||
|
for (r = 0; r < mRows; r++)
|
||||||
|
{
|
||||||
|
mPrimStart.Push(mVertices.Size());
|
||||||
|
for (c = 0; c <= mColumns; c++)
|
||||||
|
{
|
||||||
|
SkyVertex(r + zflip, c, zflip);
|
||||||
|
SkyVertex(r + 1 - zflip, c, zflip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void FSkyDomeCreator::CreateDome()
|
||||||
|
{
|
||||||
|
// the first thing we put into the buffer is the fog layer object which is just 4 triangles around the viewpoint.
|
||||||
|
|
||||||
|
mVertices.Reserve(12);
|
||||||
|
mVertices[0].Set(1.0f, 1.0f, -1.0f);
|
||||||
|
mVertices[1].Set(1.0f, -1.0f, -1.0f);
|
||||||
|
mVertices[2].Set(-1.0f, 0.0f, -1.0f);
|
||||||
|
|
||||||
|
mVertices[3].Set(1.0f, 1.0f, -1.0f);
|
||||||
|
mVertices[4].Set(1.0f, -1.0f, -1.0f);
|
||||||
|
mVertices[5].Set(0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
mVertices[6].Set(-1.0f, 0.0f, -1.0f);
|
||||||
|
mVertices[7].Set(1.0f, 1.0f, -1.0f);
|
||||||
|
mVertices[8].Set(0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
mVertices[9].Set(1.0f, -1.0f, -1.0f);
|
||||||
|
mVertices[10].Set(-1.0f, 0.0f, -1.0f);
|
||||||
|
mVertices[11].Set(0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
mColumns = 128;
|
||||||
|
mRows = 4;
|
||||||
|
CreateSkyHemisphere(SKYHEMI_UPPER);
|
||||||
|
CreateSkyHemisphere(SKYHEMI_LOWER);
|
||||||
|
mPrimStart.Push(mVertices.Size());
|
||||||
|
|
||||||
|
mSideStart = mVertices.Size();
|
||||||
|
mFaceStart[0] = mSideStart + 10;
|
||||||
|
mFaceStart[1] = mFaceStart[0] + 4;
|
||||||
|
mFaceStart[2] = mFaceStart[1] + 4;
|
||||||
|
mFaceStart[3] = mFaceStart[2] + 4;
|
||||||
|
mFaceStart[4] = mFaceStart[3] + 4;
|
||||||
|
mFaceStart[5] = mFaceStart[4] + 4;
|
||||||
|
mFaceStart[6] = mFaceStart[5] + 4;
|
||||||
|
mVertices.Reserve(10 + 7*4);
|
||||||
|
FSkyVertex *ptr = &mVertices[mSideStart];
|
||||||
|
|
||||||
|
// all sides
|
||||||
|
ptr[0].SetXYZ(128.f, 128.f, -128.f, 0, 0);
|
||||||
|
ptr[1].SetXYZ(128.f, -128.f, -128.f, 0, 1);
|
||||||
|
ptr[2].SetXYZ(-128.f, 128.f, -128.f, 0.25f, 0);
|
||||||
|
ptr[3].SetXYZ(-128.f, -128.f, -128.f, 0.25f, 1);
|
||||||
|
ptr[4].SetXYZ(-128.f, 128.f, 128.f, 0.5f, 0);
|
||||||
|
ptr[5].SetXYZ(-128.f, -128.f, 128.f, 0.5f, 1);
|
||||||
|
ptr[6].SetXYZ(128.f, 128.f, 128.f, 0.75f, 0);
|
||||||
|
ptr[7].SetXYZ(128.f, -128.f, 128.f, 0.75f, 1);
|
||||||
|
ptr[8].SetXYZ(128.f, 128.f, -128.f, 1, 0);
|
||||||
|
ptr[9].SetXYZ(128.f, -128.f, -128.f, 1, 1);
|
||||||
|
|
||||||
|
// north face
|
||||||
|
ptr[10].SetXYZ(128.f, 128.f, -128.f, 0, 0);
|
||||||
|
ptr[11].SetXYZ(-128.f, 128.f, -128.f, 1, 0);
|
||||||
|
ptr[12].SetXYZ(128.f, -128.f, -128.f, 0, 1);
|
||||||
|
ptr[13].SetXYZ(-128.f, -128.f, -128.f, 1, 1);
|
||||||
|
|
||||||
|
// east face
|
||||||
|
ptr[14].SetXYZ(-128.f, 128.f, -128.f, 0, 0);
|
||||||
|
ptr[15].SetXYZ(-128.f, 128.f, 128.f, 1, 0);
|
||||||
|
ptr[16].SetXYZ(-128.f, -128.f, -128.f, 0, 1);
|
||||||
|
ptr[17].SetXYZ(-128.f, -128.f, 128.f, 1, 1);
|
||||||
|
|
||||||
|
// south face
|
||||||
|
ptr[18].SetXYZ(-128.f, 128.f, 128.f, 0, 0);
|
||||||
|
ptr[19].SetXYZ(128.f, 128.f, 128.f, 1, 0);
|
||||||
|
ptr[20].SetXYZ(-128.f, -128.f, 128.f, 0, 1);
|
||||||
|
ptr[21].SetXYZ(128.f, -128.f, 128.f, 1, 1);
|
||||||
|
|
||||||
|
// west face
|
||||||
|
ptr[22].SetXYZ(128.f, 128.f, 128.f, 0, 0);
|
||||||
|
ptr[23].SetXYZ(128.f, 128.f, -128.f, 1, 0);
|
||||||
|
ptr[24].SetXYZ(128.f, -128.f, 128.f, 0, 1);
|
||||||
|
ptr[25].SetXYZ(128.f, -128.f, -128.f, 1, 1);
|
||||||
|
|
||||||
|
// bottom face
|
||||||
|
ptr[26].SetXYZ(128.f, -128.f, -128.f, 0, 0);
|
||||||
|
ptr[27].SetXYZ(-128.f, -128.f, -128.f, 1, 0);
|
||||||
|
ptr[28].SetXYZ(128.f, -128.f, 128.f, 0, 1);
|
||||||
|
ptr[29].SetXYZ(-128.f, -128.f, 128.f, 1, 1);
|
||||||
|
|
||||||
|
// top face
|
||||||
|
ptr[30].SetXYZ(128.f, 128.f, -128.f, 0, 0);
|
||||||
|
ptr[31].SetXYZ(-128.f, 128.f, -128.f, 1, 0);
|
||||||
|
ptr[32].SetXYZ(128.f, 128.f, 128.f, 0, 1);
|
||||||
|
ptr[33].SetXYZ(-128.f, 128.f, 128.f, 1, 1);
|
||||||
|
|
||||||
|
// top face flipped
|
||||||
|
ptr[34].SetXYZ(128.f, 128.f, -128.f, 0, 1);
|
||||||
|
ptr[35].SetXYZ(-128.f, 128.f, -128.f, 1, 1);
|
||||||
|
ptr[36].SetXYZ(128.f, 128.f, 128.f, 0, 0);
|
||||||
|
ptr[37].SetXYZ(-128.f, 128.f, 128.f, 1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
71
src/hwrenderer/scene/hw_skydome.h
Normal file
71
src/hwrenderer/scene/hw_skydome.h
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "v_palette.h"
|
||||||
|
|
||||||
|
struct FSkyVertex
|
||||||
|
{
|
||||||
|
float x, y, z, u, v;
|
||||||
|
PalEntry color;
|
||||||
|
|
||||||
|
void Set(float xx, float zz, float yy, float uu=0, float vv=0, PalEntry col=0xffffffff)
|
||||||
|
{
|
||||||
|
x = xx;
|
||||||
|
z = zz;
|
||||||
|
y = yy;
|
||||||
|
u = uu;
|
||||||
|
v = vv;
|
||||||
|
color = col;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetXYZ(float xx, float yy, float zz, float uu = 0, float vv = 0, PalEntry col = 0xffffffff)
|
||||||
|
{
|
||||||
|
x = xx;
|
||||||
|
y = yy;
|
||||||
|
z = zz;
|
||||||
|
u = uu;
|
||||||
|
v = vv;
|
||||||
|
color = col;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class FSkyDomeCreator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static const int SKYHEMI_UPPER = 1;
|
||||||
|
static const int SKYHEMI_LOWER = 2;
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
SKYMODE_MAINLAYER = 0,
|
||||||
|
SKYMODE_SECONDLAYER = 1,
|
||||||
|
SKYMODE_FOGLAYER = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
protected:
|
||||||
|
TArray<FSkyVertex> mVertices;
|
||||||
|
TArray<unsigned int> mPrimStart;
|
||||||
|
|
||||||
|
int mRows, mColumns;
|
||||||
|
|
||||||
|
// indices for sky cubemap faces
|
||||||
|
int mFaceStart[7];
|
||||||
|
int mSideStart;
|
||||||
|
|
||||||
|
void SkyVertex(int r, int c, bool yflip);
|
||||||
|
void CreateSkyHemisphere(int hemi);
|
||||||
|
void CreateDome();
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
FSkyDomeCreator();
|
||||||
|
virtual ~FSkyDomeCreator();
|
||||||
|
void RenderDome(FMaterial *tex, int mode);
|
||||||
|
|
||||||
|
int FaceStart(int i)
|
||||||
|
{
|
||||||
|
if (i >= 0 && i < 7) return mFaceStart[i];
|
||||||
|
else return mSideStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
Loading…
Reference in a new issue