mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-06 13:16:52 +02:00
fix 3DS build, fix autostereoscopy display support
This commit is contained in:
@@ -286,7 +286,7 @@ struct AmbientCache {
|
|||||||
|
|
||||||
mat4 mProj, mView;
|
mat4 mProj, mView;
|
||||||
mView.identity();
|
mView.identity();
|
||||||
mProj.identity();
|
mProj = GAPI::ortho(-1, +1, -1, +1, 0, 1);
|
||||||
mProj.scale(vec3(1.0f / 32767.0f));
|
mProj.scale(vec3(1.0f / 32767.0f));
|
||||||
Core::setViewProj(mView, mProj);
|
Core::setViewProj(mView, mProj);
|
||||||
game->setShader(Core::passFilter, Shader::FILTER_DOWNSAMPLE);
|
game->setShader(Core::passFilter, Shader::FILTER_DOWNSAMPLE);
|
||||||
|
@@ -122,7 +122,11 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
// muse be equal with base shader
|
// muse be equal with base shader
|
||||||
#define SHADOW_TEX_SIZE 2048
|
#ifdef __OS_3DS
|
||||||
|
#define SHADOW_TEX_SIZE 512
|
||||||
|
#else
|
||||||
|
#define SHADOW_TEX_SIZE 2048
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void* osMutexInit ();
|
extern void* osMutexInit ();
|
||||||
extern void osMutexFree (void *obj);
|
extern void osMutexFree (void *obj);
|
||||||
|
@@ -143,8 +143,7 @@ namespace GAPI {
|
|||||||
cbCount[uType] = count * 4;
|
cbCount[uType] = count * 4;
|
||||||
|
|
||||||
ASSERT(count == 1);
|
ASSERT(count == 1);
|
||||||
mat4 m = value.transpose();
|
memcpy(cbMem + bindings[uType], &value, sizeof(value));
|
||||||
memcpy(cbMem + bindings[uType], &m, sizeof(m));
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -477,26 +476,14 @@ namespace GAPI {
|
|||||||
|
|
||||||
mat4 ortho(float l, float r, float b, float t, float znear, float zfar) {
|
mat4 ortho(float l, float r, float b, float t, float znear, float zfar) {
|
||||||
mat4 m;
|
mat4 m;
|
||||||
Mtx_OrthoTilt((C3D_Mtx*)&m, l, r, b, t, znear, zfar, false);
|
m.ortho(mat4::PROJ_NEG_ZERO, l, r, b, t, znear, zfar, true);
|
||||||
|
return m;
|
||||||
mat4 res;
|
|
||||||
res.e00 = m.e30; res.e10 = m.e31; res.e20 = m.e32; res.e30 = m.e33;
|
|
||||||
res.e01 = m.e20; res.e11 = m.e21; res.e21 = m.e22; res.e31 = m.e23;
|
|
||||||
res.e02 = m.e10; res.e12 = m.e11; res.e22 = m.e12; res.e32 = m.e13;
|
|
||||||
res.e03 = m.e00; res.e13 = m.e01; res.e23 = m.e02; res.e33 = m.e03;
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mat4 perspective(float fov, float aspect, float znear, float zfar, float eye) {
|
mat4 perspective(float fov, float aspect, float znear, float zfar, float eye) {
|
||||||
mat4 m;
|
mat4 m;
|
||||||
Mtx_PerspTilt((C3D_Mtx*)&m, fov * DEG2RAD, aspect, znear, zfar, false);
|
m.perspective(mat4::PROJ_NEG_ZERO, fov, aspect, znear, zfar, eye, true);
|
||||||
|
return m;
|
||||||
mat4 res;
|
|
||||||
res.e00 = m.e30; res.e10 = m.e31; res.e20 = m.e32; res.e30 = m.e33;
|
|
||||||
res.e01 = m.e20; res.e11 = m.e21; res.e21 = m.e22; res.e31 = m.e23;
|
|
||||||
res.e02 = m.e10; res.e12 = m.e11; res.e22 = m.e12; res.e32 = m.e13;
|
|
||||||
res.e03 = m.e00; res.e13 = m.e01; res.e23 = m.e02; res.e33 = m.e03;
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool beginFrame() {
|
bool beginFrame() {
|
||||||
|
@@ -430,6 +430,7 @@ namespace GAPI {
|
|||||||
typedef ::Vertex Vertex;
|
typedef ::Vertex Vertex;
|
||||||
|
|
||||||
int cullMode, blendMode;
|
int cullMode, blendMode;
|
||||||
|
bool depthWrite;
|
||||||
|
|
||||||
char GLSL_HEADER_VERT[512];
|
char GLSL_HEADER_VERT[512];
|
||||||
char GLSL_HEADER_FRAG[512];
|
char GLSL_HEADER_FRAG[512];
|
||||||
@@ -1454,7 +1455,15 @@ namespace GAPI {
|
|||||||
|
|
||||||
void clear(bool color, bool depth) {
|
void clear(bool color, bool depth) {
|
||||||
uint32 mask = (color ? GL_COLOR_BUFFER_BIT : 0) | (depth ? GL_DEPTH_BUFFER_BIT : 0);
|
uint32 mask = (color ? GL_COLOR_BUFFER_BIT : 0) | (depth ? GL_DEPTH_BUFFER_BIT : 0);
|
||||||
if (mask) glClear(mask);
|
if (mask) {
|
||||||
|
if (depth && !depthWrite) {
|
||||||
|
glDepthMask(GL_TRUE);
|
||||||
|
glClear(mask);
|
||||||
|
glDepthMask(GL_FALSE);
|
||||||
|
} else {
|
||||||
|
glClear(mask);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setClearColor(const vec4 &color) {
|
void setClearColor(const vec4 &color) {
|
||||||
@@ -1474,6 +1483,7 @@ namespace GAPI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void setDepthWrite(bool enable) {
|
void setDepthWrite(bool enable) {
|
||||||
|
depthWrite = enable;
|
||||||
glDepthMask(enable ? GL_TRUE : GL_FALSE);
|
glDepthMask(enable ? GL_TRUE : GL_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1401,6 +1401,10 @@ struct Inventory {
|
|||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _OS_3DS
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
game->renderGame(false, true);
|
game->renderGame(false, true);
|
||||||
|
|
||||||
Core::setDepthTest(false);
|
Core::setDepthTest(false);
|
||||||
@@ -1417,7 +1421,7 @@ struct Inventory {
|
|||||||
|
|
||||||
mat4 mProj, mView;
|
mat4 mProj, mView;
|
||||||
mView.identity();
|
mView.identity();
|
||||||
mProj.identity();
|
mProj = GAPI::ortho(-1, +1, -1, +1, 0, 1);
|
||||||
mProj.scale(vec3(1.0f / 32767.0f));
|
mProj.scale(vec3(1.0f / 32767.0f));
|
||||||
Core::setViewProj(mView, mProj);
|
Core::setViewProj(mView, mProj);
|
||||||
|
|
||||||
@@ -1716,20 +1720,20 @@ struct Inventory {
|
|||||||
Index indices[10 * 3] = { 0,1,2, 0,2,3, 8,9,5, 8,5,4, 9,10,6, 9,6,5, 10,11,7, 10,7,6, 11,8,4, 11,4,7 };
|
Index indices[10 * 3] = { 0,1,2, 0,2,3, 8,9,5, 8,5,4, 9,10,6, 9,6,5, 10,11,7, 10,7,6, 11,8,4, 11,4,7 };
|
||||||
Vertex vertices[4 * 3];
|
Vertex vertices[4 * 3];
|
||||||
|
|
||||||
vertices[ 0].coord = short4(-size.x, size.y, 0, 0);
|
vertices[ 0].coord = short4(-size.x, size.y, 0, 1);
|
||||||
vertices[ 1].coord = short4( size.x, size.y, 0, 0);
|
vertices[ 1].coord = short4( size.x, size.y, 0, 1);
|
||||||
vertices[ 2].coord = short4( size.x, -size.y, 0, 0);
|
vertices[ 2].coord = short4( size.x, -size.y, 0, 1);
|
||||||
vertices[ 3].coord = short4(-size.x, -size.y, 0, 0);
|
vertices[ 3].coord = short4(-size.x, -size.y, 0, 1);
|
||||||
|
|
||||||
vertices[ 4].coord = vertices[0].coord;
|
vertices[ 4].coord = vertices[0].coord;
|
||||||
vertices[ 5].coord = vertices[1].coord;
|
vertices[ 5].coord = vertices[1].coord;
|
||||||
vertices[ 6].coord = vertices[2].coord;
|
vertices[ 6].coord = vertices[2].coord;
|
||||||
vertices[ 7].coord = vertices[3].coord;
|
vertices[ 7].coord = vertices[3].coord;
|
||||||
|
|
||||||
vertices[ 8].coord = short4(-o_frame, o_frame, 0, 0);
|
vertices[ 8].coord = short4(-o_frame, o_frame, 0, 1);
|
||||||
vertices[ 9].coord = short4( o_frame, o_frame, 0, 0);
|
vertices[ 9].coord = short4( o_frame, o_frame, 0, 1);
|
||||||
vertices[10].coord = short4( o_frame, -o_frame, 0, 0);
|
vertices[10].coord = short4( o_frame, -o_frame, 0, 1);
|
||||||
vertices[11].coord = short4(-o_frame, -o_frame, 0, 0);
|
vertices[11].coord = short4(-o_frame, -o_frame, 0, 1);
|
||||||
|
|
||||||
vertices[ 0].light =
|
vertices[ 0].light =
|
||||||
vertices[ 1].light =
|
vertices[ 1].light =
|
||||||
@@ -1770,7 +1774,7 @@ struct Inventory {
|
|||||||
|
|
||||||
mat4 mProj, mView;
|
mat4 mProj, mView;
|
||||||
mView.identity();
|
mView.identity();
|
||||||
mProj.identity();
|
mProj = GAPI::ortho(-1, +1, -1, +1, 0, 1);
|
||||||
mProj.scale(vec3(1.0f / max(size.x, size.y)));
|
mProj.scale(vec3(1.0f / max(size.x, size.y)));
|
||||||
mProj.translate(vec3(eye, 0.0f, 0.0f));
|
mProj.translate(vec3(eye, 0.0f, 0.0f));
|
||||||
Core::setViewProj(mView, mProj);
|
Core::setViewProj(mView, mProj);
|
||||||
@@ -1783,10 +1787,10 @@ struct Inventory {
|
|||||||
void renderGameBG(int view) {
|
void renderGameBG(int view) {
|
||||||
Index indices[6] = { 0, 1, 2, 0, 2, 3 };
|
Index indices[6] = { 0, 1, 2, 0, 2, 3 };
|
||||||
Vertex vertices[4];
|
Vertex vertices[4];
|
||||||
vertices[0].coord = short4(-32767, 32767, 0, 0);
|
vertices[0].coord = short4(-32767, 32767, 0, 1);
|
||||||
vertices[1].coord = short4( 32767, 32767, 0, 0);
|
vertices[1].coord = short4( 32767, 32767, 0, 1);
|
||||||
vertices[2].coord = short4( 32767, -32767, 0, 0);
|
vertices[2].coord = short4( 32767, -32767, 0, 1);
|
||||||
vertices[3].coord = short4(-32767, -32767, 0, 0);
|
vertices[3].coord = short4(-32767, -32767, 0, 1);
|
||||||
vertices[0].light =
|
vertices[0].light =
|
||||||
vertices[1].light =
|
vertices[1].light =
|
||||||
vertices[2].light =
|
vertices[2].light =
|
||||||
@@ -1821,7 +1825,7 @@ struct Inventory {
|
|||||||
|
|
||||||
mat4 mProj, mView;
|
mat4 mProj, mView;
|
||||||
mView.identity();
|
mView.identity();
|
||||||
mProj.identity();
|
mProj = GAPI::ortho(-1, +1, -1, +1, 0, 1);
|
||||||
mProj.scale(vec3(1.0f / 32767.0f));
|
mProj.scale(vec3(1.0f / 32767.0f));
|
||||||
Core::setViewProj(mView, mProj);
|
Core::setViewProj(mView, mProj);
|
||||||
|
|
||||||
@@ -1837,6 +1841,7 @@ struct Inventory {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
Core::setDepthTest(false);
|
Core::setDepthTest(false);
|
||||||
|
Core::setDepthWrite(false);
|
||||||
|
|
||||||
uint8 alpha;
|
uint8 alpha;
|
||||||
if (!isActive() && titleTimer > 0.0f && titleTimer < 1.0f)
|
if (!isActive() && titleTimer > 0.0f && titleTimer < 1.0f)
|
||||||
@@ -1863,6 +1868,7 @@ struct Inventory {
|
|||||||
|
|
||||||
Core::setBlendMode(bmPremult);
|
Core::setBlendMode(bmPremult);
|
||||||
Core::setDepthTest(true);
|
Core::setDepthTest(true);
|
||||||
|
Core::setDepthWrite(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setupCamera(float aspect, bool ui = false) {
|
void setupCamera(float aspect, bool ui = false) {
|
||||||
|
10
src/level.h
10
src/level.h
@@ -3000,7 +3000,7 @@ struct Level : IGame {
|
|||||||
int texIndex = eye <= 0 ? 0 : 1;
|
int texIndex = eye <= 0 ? 0 : 1;
|
||||||
|
|
||||||
#ifdef _OS_3DS
|
#ifdef _OS_3DS
|
||||||
Core::eye *= osGet3DSliderState() / 3.0f;
|
Core::eye *= osGet3DSliderState();
|
||||||
|
|
||||||
GAPI::curTarget = GAPI::defTarget[texIndex];
|
GAPI::curTarget = GAPI::defTarget[texIndex];
|
||||||
|
|
||||||
@@ -3081,9 +3081,12 @@ struct Level : IGame {
|
|||||||
if (Core::settings.detail.stereo == Core::Settings::STEREO_ANAGLYPH && !invBG) {
|
if (Core::settings.detail.stereo == Core::Settings::STEREO_ANAGLYPH && !invBG) {
|
||||||
mat4 mProj, mView;
|
mat4 mProj, mView;
|
||||||
mView.identity();
|
mView.identity();
|
||||||
mProj.identity();
|
mProj = GAPI::ortho(-1, +1, -1, +1, 0, 1);
|
||||||
mProj.scale(vec3(1.0f / 32767.0f));
|
mProj.scale(vec3(1.0f / 32767.0f));
|
||||||
Core::setViewProj(mView, mProj);
|
Core::setViewProj(mView, mProj);
|
||||||
|
\
|
||||||
|
Core::setDepthTest(false);
|
||||||
|
Core::setDepthWrite(false);
|
||||||
|
|
||||||
Core::setTarget(NULL, NULL, RT_STORE_COLOR);
|
Core::setTarget(NULL, NULL, RT_STORE_COLOR);
|
||||||
setShader(Core::passFilter, Shader::FILTER_ANAGLYPH, false, false);
|
setShader(Core::passFilter, Shader::FILTER_ANAGLYPH, false, false);
|
||||||
@@ -3091,6 +3094,9 @@ struct Level : IGame {
|
|||||||
Core::eyeTex[1]->bind(sNormal);
|
Core::eyeTex[1]->bind(sNormal);
|
||||||
Core::setDepthTest(false);
|
Core::setDepthTest(false);
|
||||||
mesh->renderQuad();
|
mesh->renderQuad();
|
||||||
|
|
||||||
|
Core::setDepthTest(true);
|
||||||
|
Core::setDepthWrite(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
56
src/mesh.h
56
src/mesh.h
@@ -1208,17 +1208,17 @@ struct MeshBuilder {
|
|||||||
#ifndef MERGE_SPRITES
|
#ifndef MERGE_SPRITES
|
||||||
if (!expand) {
|
if (!expand) {
|
||||||
vec3 pos = vec3(float(x), float(y), float(z));
|
vec3 pos = vec3(float(x), float(y), float(z));
|
||||||
quad[0].coord = coordTransform(pos, vec3( float(sprite.l), float(-sprite.t), 0 ));
|
quad[0].coord = coordTransform(pos, vec3( float(sprite.l), float(-sprite.t), 1 ));
|
||||||
quad[1].coord = coordTransform(pos, vec3( float(sprite.r), float(-sprite.t), 0 ));
|
quad[1].coord = coordTransform(pos, vec3( float(sprite.r), float(-sprite.t), 1 ));
|
||||||
quad[2].coord = coordTransform(pos, vec3( float(sprite.r), float(-sprite.b), 0 ));
|
quad[2].coord = coordTransform(pos, vec3( float(sprite.r), float(-sprite.b), 1 ));
|
||||||
quad[3].coord = coordTransform(pos, vec3( float(sprite.l), float(-sprite.b), 0 ));
|
quad[3].coord = coordTransform(pos, vec3( float(sprite.l), float(-sprite.b), 1 ));
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
quad[0].coord = short4( x0, y0, z, 0 );
|
quad[0].coord = short4( x0, y0, z, 1 );
|
||||||
quad[1].coord = short4( x1, y0, z, 0 );
|
quad[1].coord = short4( x1, y0, z, 1 );
|
||||||
quad[2].coord = short4( x1, y1, z, 0 );
|
quad[2].coord = short4( x1, y1, z, 1 );
|
||||||
quad[3].coord = short4( x0, y1, z, 0 );
|
quad[3].coord = short4( x0, y1, z, 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
quad[0].normal = quad[1].normal = quad[2].normal = quad[3].normal = short4( 0, 0, 0, 0 );
|
quad[0].normal = quad[1].normal = quad[2].normal = quad[3].normal = short4( 0, 0, 0, 0 );
|
||||||
@@ -1250,10 +1250,10 @@ struct MeshBuilder {
|
|||||||
int16 maxX = int16(size.x) + minX;
|
int16 maxX = int16(size.x) + minX;
|
||||||
int16 maxY = int16(size.y) + minY;
|
int16 maxY = int16(size.y) + minY;
|
||||||
|
|
||||||
vertices[vCount + 0].coord = short4( minX, minY, 0, 0 );
|
vertices[vCount + 0].coord = short4( minX, minY, 0, 1 );
|
||||||
vertices[vCount + 1].coord = short4( maxX, minY, 0, 0 );
|
vertices[vCount + 1].coord = short4( maxX, minY, 0, 1 );
|
||||||
vertices[vCount + 2].coord = short4( maxX, maxY, 0, 0 );
|
vertices[vCount + 2].coord = short4( maxX, maxY, 0, 1 );
|
||||||
vertices[vCount + 3].coord = short4( minX, maxY, 0, 0 );
|
vertices[vCount + 3].coord = short4( minX, maxY, 0, 1 );
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
Vertex &v = vertices[vCount + i];
|
Vertex &v = vertices[vCount + i];
|
||||||
@@ -1286,15 +1286,15 @@ struct MeshBuilder {
|
|||||||
int16 maxX = int16(size.x) + minX;
|
int16 maxX = int16(size.x) + minX;
|
||||||
int16 maxY = int16(size.y) + minY;
|
int16 maxY = int16(size.y) + minY;
|
||||||
|
|
||||||
vertices[vCount + 0].coord = short4( minX, minY, 0, 0 );
|
vertices[vCount + 0].coord = short4( minX, minY, 0, 1 );
|
||||||
vertices[vCount + 1].coord = short4( maxX, minY, 0, 0 );
|
vertices[vCount + 1].coord = short4( maxX, minY, 0, 1 );
|
||||||
vertices[vCount + 2].coord = short4( maxX, int16(minY + 1), 0, 0 );
|
vertices[vCount + 2].coord = short4( maxX, int16(minY + 1), 0, 1 );
|
||||||
vertices[vCount + 3].coord = short4( minX, int16(minY + 1), 0, 0 );
|
vertices[vCount + 3].coord = short4( minX, int16(minY + 1), 0, 1 );
|
||||||
|
|
||||||
vertices[vCount + 4].coord = short4( minX, minY, 0, 0 );
|
vertices[vCount + 4].coord = short4( minX, minY, 0, 1 );
|
||||||
vertices[vCount + 5].coord = short4( int16(minX + 1), minY, 0, 0 );
|
vertices[vCount + 5].coord = short4( int16(minX + 1), minY, 0, 1 );
|
||||||
vertices[vCount + 6].coord = short4( int16(minX + 1), maxY, 0, 0 );
|
vertices[vCount + 6].coord = short4( int16(minX + 1), maxY, 0, 1 );
|
||||||
vertices[vCount + 7].coord = short4( minX, maxY, 0, 0 );
|
vertices[vCount + 7].coord = short4( minX, maxY, 0, 1 );
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
Vertex &v = vertices[vCount + i];
|
Vertex &v = vertices[vCount + i];
|
||||||
@@ -1306,15 +1306,15 @@ struct MeshBuilder {
|
|||||||
addQuad(indices, iCount, vCount, 0, vertices, NULL, false, false); vCount += 4;
|
addQuad(indices, iCount, vCount, 0, vertices, NULL, false, false); vCount += 4;
|
||||||
addQuad(indices, iCount, vCount, 0, vertices, NULL, false, false); vCount += 4;
|
addQuad(indices, iCount, vCount, 0, vertices, NULL, false, false); vCount += 4;
|
||||||
|
|
||||||
vertices[vCount + 0].coord = short4( minX, int16(maxY - 1), 0, 0 );
|
vertices[vCount + 0].coord = short4( minX, int16(maxY - 1), 0, 1 );
|
||||||
vertices[vCount + 1].coord = short4( maxX, int16(maxY - 1), 0, 0 );
|
vertices[vCount + 1].coord = short4( maxX, int16(maxY - 1), 0, 1 );
|
||||||
vertices[vCount + 2].coord = short4( maxX, maxY, 0, 0 );
|
vertices[vCount + 2].coord = short4( maxX, maxY, 0, 1 );
|
||||||
vertices[vCount + 3].coord = short4( minX, maxY, 0, 0 );
|
vertices[vCount + 3].coord = short4( minX, maxY, 0, 1 );
|
||||||
|
|
||||||
vertices[vCount + 4].coord = short4( int16(maxX - 1), minY, 0, 0 );
|
vertices[vCount + 4].coord = short4( int16(maxX - 1), minY, 0, 1 );
|
||||||
vertices[vCount + 5].coord = short4( maxX, minY, 0, 0 );
|
vertices[vCount + 5].coord = short4( maxX, minY, 0, 1 );
|
||||||
vertices[vCount + 6].coord = short4( maxX, maxY, 0, 0 );
|
vertices[vCount + 6].coord = short4( maxX, maxY, 0, 1 );
|
||||||
vertices[vCount + 7].coord = short4( int16(maxX - 1), maxY, 0, 0 );
|
vertices[vCount + 7].coord = short4( int16(maxX - 1), maxY, 0, 1 );
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
Vertex &v = vertices[vCount + i];
|
Vertex &v = vertices[vCount + i];
|
||||||
|
@@ -20,19 +20,8 @@
|
|||||||
|
|
||||||
.proc main
|
.proc main
|
||||||
; mulQuat
|
; mulQuat
|
||||||
;mul r0.xyz, uBasis[0], aCoord.zxy
|
|
||||||
;mad r0.xyz, aCoord, uBasis[0].zxy, -r0
|
|
||||||
;mad r0.xyz, aCoord.yzx, uBasis[0].w, r0
|
|
||||||
;mul r1.xyz, uBasis[0].zxy, r0
|
|
||||||
;mad r0.xyz, r0.yzx, uBasis[0].yzx, -r1
|
|
||||||
;mad r0.xyz, r0, const0.x, aCoord
|
|
||||||
;add r0.xyz, uBasis[1], r0
|
|
||||||
;mov r0.w, uBasis[1].w
|
|
||||||
|
|
||||||
mul r0.x, const0.xxxx, aCoord.wwww
|
mul r0.x, const0.xxxx, aCoord.wwww
|
||||||
|
|
||||||
;frc r0.x, v0.w
|
|
||||||
;add r0.x, -r0.x, v0.w
|
|
||||||
mova a0.x, r0.x
|
mova a0.x, r0.x
|
||||||
mul r0.xyz, uBasis[a0.x], aCoord.zxyw
|
mul r0.xyz, uBasis[a0.x], aCoord.zxyw
|
||||||
mad r0.xyz, aCoord, uBasis[a0.x].zxyw, -r0
|
mad r0.xyz, aCoord, uBasis[a0.x].zxyw, -r0
|
||||||
@@ -44,24 +33,16 @@
|
|||||||
mov r0.w, uBasis[a0.x + 1].w
|
mov r0.w, uBasis[a0.x + 1].w
|
||||||
|
|
||||||
; uViewProj * coord
|
; uViewProj * coord
|
||||||
dp4 vPosition.x, uViewProj[0], r0
|
mul r1, uViewProj[0], r0.xxxx
|
||||||
dp4 vPosition.y, uViewProj[1], r0
|
mad r1, r0.yyyy, uViewProj[1], r1
|
||||||
dp4 vPosition.z, uViewProj[2], r0
|
mad r1, r0.zzzz, uViewProj[2], r1
|
||||||
dp4 vPosition.w, uViewProj[3], r0
|
mad vPosition, r0.wwww, uViewProj[3], r1
|
||||||
|
|
||||||
mul r2, const1.xxxx, aTexCoord.xyzw
|
mul vTexCoord, const1.xxxx, aTexCoord.xyzw
|
||||||
mov vTexCoord, r2
|
|
||||||
|
|
||||||
mov r3, aColor
|
|
||||||
mul r3, const1.yyyy, r3.xyzw
|
|
||||||
|
|
||||||
mov r4, aLight
|
|
||||||
mul r4, const1.yyyy, r4.xyzw
|
|
||||||
|
|
||||||
|
mul r3, const1.yyyy, aColor
|
||||||
|
mul r4, const1.yyyy, aLight
|
||||||
mul vColor, r3, r4
|
mul vColor, r3, r4
|
||||||
;mov vColor, r3
|
|
||||||
;mov vColor.xyz, r2.xyz
|
|
||||||
;mov vColor.w, const0.yyyy
|
|
||||||
|
|
||||||
end
|
end
|
||||||
.end
|
.end
|
||||||
|
@@ -1,5 +1,8 @@
|
|||||||
; constants
|
; constants
|
||||||
.constf const0(1.0, 3.05185094e-005, 0.00392156886, -0.5)
|
.constf const0(3.05185094e-005, 0.00392156886, 0.0, 0.0)
|
||||||
|
|
||||||
|
; uniforms
|
||||||
|
.fvec uViewProj[4]
|
||||||
|
|
||||||
; in
|
; in
|
||||||
.alias aCoord v0
|
.alias aCoord v0
|
||||||
@@ -12,13 +15,14 @@
|
|||||||
.out vColor color
|
.out vColor color
|
||||||
|
|
||||||
.proc main
|
.proc main
|
||||||
mul r0.xyzw, const0.yyyy, aCoord.yxzw
|
; uViewProj * coord
|
||||||
mov r0.w, const0.xxxx
|
mov r0, uViewProj[3]
|
||||||
mov r0.y, -r0.y
|
mad r1, aCoord.xxxx, uViewProj[0], r0
|
||||||
mov vPosition, r0
|
mad r1, aCoord.yyyy, uViewProj[1], r1
|
||||||
|
mad vPosition, aCoord.zzzz, uViewProj[2], r1
|
||||||
|
|
||||||
mul vTexCoord, const0.yyyy, aTexCoord
|
mul vTexCoord, const0.xxxx, aTexCoord
|
||||||
mul vColor, const0.zzzz, aLight
|
mul vColor, const0.yyyy, aLight
|
||||||
|
|
||||||
end
|
end
|
||||||
.end
|
.end
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
; constants
|
; constants
|
||||||
.constf const0(2.0, 1.0, 0.5, 0.25)
|
.constf const0(3.05185094e-005, 0.00392156886, 1.0, 0.0)
|
||||||
.constf const1(3.05185094e-005, 0.00392156886, 0.00784313725, 0.0)
|
|
||||||
|
|
||||||
; uniforms
|
; uniforms
|
||||||
.fvec uViewProj[4]
|
.fvec uViewProj[4]
|
||||||
@@ -8,9 +7,7 @@
|
|||||||
|
|
||||||
; in
|
; in
|
||||||
.alias aCoord v0
|
.alias aCoord v0
|
||||||
.alias aNormal v1
|
|
||||||
.alias aTexCoord v2
|
.alias aTexCoord v2
|
||||||
.alias aColor v3
|
|
||||||
.alias aLight v4
|
.alias aLight v4
|
||||||
|
|
||||||
; out
|
; out
|
||||||
@@ -19,21 +16,15 @@
|
|||||||
.out vColor color
|
.out vColor color
|
||||||
|
|
||||||
.proc main
|
.proc main
|
||||||
mov r0.xyz, aCoord
|
|
||||||
mov r0.w, const0.yyyy
|
|
||||||
|
|
||||||
; uViewProj * coord
|
; uViewProj * coord
|
||||||
dp4 vPosition.x, uViewProj[0], r0
|
mov r0, uViewProj[3]
|
||||||
dp4 vPosition.y, uViewProj[1], r0
|
mad r1, aCoord.xxxx, uViewProj[0], r0
|
||||||
dp4 vPosition.z, uViewProj[2], r0
|
mad r1, aCoord.yyyy, uViewProj[1], r1
|
||||||
dp4 vPosition.w, uViewProj[3], r0
|
mad vPosition, aCoord.zzzz, uViewProj[2], r1
|
||||||
|
|
||||||
mul r2, const1.xxxx, aTexCoord.xyzw
|
mul vTexCoord, const0.xxxx, aTexCoord
|
||||||
mov vTexCoord, r2
|
mul r2, const0.yyyy, aLight
|
||||||
|
mul vColor, uMaterial, r2
|
||||||
mov r3, aLight
|
|
||||||
mul r3, const1.yyyy, r3.xyzw
|
|
||||||
mul vColor, uMaterial, r3
|
|
||||||
|
|
||||||
end
|
end
|
||||||
.end
|
.end
|
||||||
|
@@ -11,12 +11,12 @@ varying vec4 vColor;
|
|||||||
attribute vec4 aLight;
|
attribute vec4 aLight;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
vTexCoord = aTexCoord.xy;
|
vTexCoord = aTexCoord.xy;
|
||||||
vColor = aLight * uMaterial;
|
vColor = aLight * uMaterial;
|
||||||
gl_Position = uViewProj * vec4(aCoord.xyz, 1.0);
|
gl_Position = uViewProj * aCoord;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
uniform sampler2D sDiffuse;
|
uniform sampler2D sDiffuse;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
fragColor = texture2D(sDiffuse, vTexCoord) * vColor;
|
fragColor = texture2D(sDiffuse, vTexCoord) * vColor;
|
||||||
|
43
src/ui.h
43
src/ui.h
@@ -105,8 +105,14 @@ namespace UI {
|
|||||||
void patchGlyphs(TR::Level &level) {
|
void patchGlyphs(TR::Level &level) {
|
||||||
UI::advGlyphsStart = level.spriteTexturesCount;
|
UI::advGlyphsStart = level.spriteTexturesCount;
|
||||||
|
|
||||||
TR::TextureInfo ruSprites[RU_GLYPH_COUNT];
|
// init new sprites array with additional sprites
|
||||||
for (int i = 0; i < COUNT(ruSprites); i++) {
|
TR::TextureInfo *newSprites = new TR::TextureInfo[level.spriteTexturesCount + RU_GLYPH_COUNT + JA_GLYPH_COUNT + GR_GLYPH_COUNT];
|
||||||
|
|
||||||
|
// copy original sprites
|
||||||
|
memcpy(newSprites, level.spriteTextures, sizeof(TR::TextureInfo) * level.spriteTexturesCount);
|
||||||
|
// append russian glyphs
|
||||||
|
TR::TextureInfo *ruSprites = newSprites + level.spriteTexturesCount;
|
||||||
|
for (int i = 0; i < RU_GLYPH_COUNT; i++) {
|
||||||
int idx = 110 + i; // mapped index
|
int idx = 110 + i; // mapped index
|
||||||
int w = char_width[idx];
|
int w = char_width[idx];
|
||||||
int h = upperCase(idx) ? 13 : 9;
|
int h = upperCase(idx) ? 13 : 9;
|
||||||
@@ -119,34 +125,21 @@ namespace UI {
|
|||||||
|
|
||||||
ruSprites[i] = TR::TextureInfo(TR::TEX_TYPE_SPRITE, 0, -h + o, w, o, (i % 16) * 16, (i / 16) * 16 + (16 - h), w, h);
|
ruSprites[i] = TR::TextureInfo(TR::TEX_TYPE_SPRITE, 0, -h + o, w, o, (i % 16) * 16, (i / 16) * 16 + (16 - h), w, h);
|
||||||
}
|
}
|
||||||
|
// append japanese glyphs
|
||||||
TR::TextureInfo jaSprites[JA_GLYPH_COUNT];
|
TR::TextureInfo *jaSprites = newSprites + level.spriteTexturesCount + RU_GLYPH_COUNT;
|
||||||
for (int i = 0; i < COUNT(jaSprites); i++) {
|
for (int i = 0; i < JA_GLYPH_COUNT; i++) {
|
||||||
jaSprites[i] = TR::TextureInfo(TR::TEX_TYPE_SPRITE, 0, -16, 16, 0, (i % 16) * 16, ((i % 256) / 16) * 16, 16, 16);
|
jaSprites[i] = TR::TextureInfo(TR::TEX_TYPE_SPRITE, 0, -16, 16, 0, (i % 16) * 16, ((i % 256) / 16) * 16, 16, 16);
|
||||||
}
|
}
|
||||||
|
// append greek glyphs
|
||||||
TR::TextureInfo grSprites[GR_GLYPH_COUNT];
|
TR::TextureInfo *grSprites = newSprites + level.spriteTexturesCount + RU_GLYPH_COUNT + JA_GLYPH_COUNT;
|
||||||
for (int i = 0; i < COUNT(grSprites); i++) {
|
for (int i = 0; i < GR_GLYPH_COUNT; i++) {
|
||||||
grSprites[i] = TR::TextureInfo(TR::TEX_TYPE_SPRITE, 0, -16 + GR_GLYPH_BASE - 1, GR_GLYPH_WIDTH[i], 0 + GR_GLYPH_BASE - 1, (i % 16) * 16, ((i % 256) / 16) * 16, GR_GLYPH_WIDTH[i], 16);
|
grSprites[i] = TR::TextureInfo(TR::TEX_TYPE_SPRITE, 0, -16 + GR_GLYPH_BASE - 1, GR_GLYPH_WIDTH[i], 0 + GR_GLYPH_BASE - 1, (i % 16) * 16, ((i % 256) / 16) * 16, GR_GLYPH_WIDTH[i], 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
// init new sprites array with additional sprites
|
level.spriteTexturesCount += RU_GLYPH_COUNT + JA_GLYPH_COUNT + GR_GLYPH_COUNT;
|
||||||
TR::TextureInfo *newSprites = new TR::TextureInfo[level.spriteTexturesCount + COUNT(ruSprites) + COUNT(jaSprites) + COUNT(grSprites)];
|
|
||||||
// copy original sprites
|
|
||||||
memcpy(newSprites, level.spriteTextures, sizeof(TR::TextureInfo) * level.spriteTexturesCount);
|
|
||||||
// append russian glyphs
|
|
||||||
memcpy(newSprites + level.spriteTexturesCount, ruSprites, sizeof(TR::TextureInfo) * COUNT(ruSprites));
|
|
||||||
level.spriteTexturesCount += COUNT(ruSprites);
|
|
||||||
// append japanese glyphs
|
|
||||||
memcpy(newSprites + level.spriteTexturesCount, jaSprites, sizeof(TR::TextureInfo) * COUNT(jaSprites));
|
|
||||||
level.spriteTexturesCount += COUNT(jaSprites);
|
|
||||||
// append greek glyphs
|
|
||||||
memcpy(newSprites + level.spriteTexturesCount, grSprites, sizeof(TR::TextureInfo) * COUNT(grSprites));
|
|
||||||
level.spriteTexturesCount += COUNT(grSprites);
|
|
||||||
|
|
||||||
delete[] level.spriteTextures;
|
delete[] level.spriteTextures;
|
||||||
level.spriteTextures = newSprites;
|
TR::gSpriteTextures = level.spriteTextures = newSprites;
|
||||||
TR::gSpriteTextures = level.spriteTextures;
|
|
||||||
TR::gSpriteTexturesCount = level.spriteTexturesCount;
|
TR::gSpriteTexturesCount = level.spriteTexturesCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,6 +269,7 @@ namespace UI {
|
|||||||
ensureLanguage(Core::settings.audio.language);
|
ensureLanguage(Core::settings.audio.language);
|
||||||
|
|
||||||
Core::setDepthTest(false);
|
Core::setDepthTest(false);
|
||||||
|
Core::setDepthWrite(false);
|
||||||
Core::setBlendMode(bmPremult);
|
Core::setBlendMode(bmPremult);
|
||||||
Core::setCullMode(cmNone);
|
Core::setCullMode(cmNone);
|
||||||
game->setupBinding();
|
game->setupBinding();
|
||||||
@@ -298,6 +292,7 @@ namespace UI {
|
|||||||
Core::setCullMode(cmFront);
|
Core::setCullMode(cmFront);
|
||||||
Core::setBlendMode(bmNone);
|
Core::setBlendMode(bmNone);
|
||||||
Core::setDepthTest(true);
|
Core::setDepthTest(true);
|
||||||
|
Core::setDepthWrite(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ShadeType {
|
enum ShadeType {
|
||||||
@@ -802,6 +797,7 @@ namespace UI {
|
|||||||
Basis joints[MAX_SPHERES];
|
Basis joints[MAX_SPHERES];
|
||||||
|
|
||||||
Core::setDepthTest(true);
|
Core::setDepthTest(true);
|
||||||
|
Core::setDepthWrite(true);
|
||||||
|
|
||||||
for (int i = 0; i < pickups.length; i++) {
|
for (int i = 0; i < pickups.length; i++) {
|
||||||
const PickupItem &item = pickups[i];
|
const PickupItem &item = pickups[i];
|
||||||
@@ -836,6 +832,7 @@ namespace UI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Core::setDepthTest(false);
|
Core::setDepthTest(false);
|
||||||
|
Core::setDepthWrite(false);
|
||||||
|
|
||||||
Core::setViewProj(mView, Core::mProj);
|
Core::setViewProj(mView, Core::mProj);
|
||||||
game->setShader(Core::passGUI, Shader::DEFAULT);
|
game->setShader(Core::passGUI, Shader::DEFAULT);
|
||||||
|
55
src/utils.h
55
src/utils.h
@@ -615,6 +615,7 @@ struct mat4 {
|
|||||||
|
|
||||||
enum ProjRange {
|
enum ProjRange {
|
||||||
PROJ_NEG_POS,
|
PROJ_NEG_POS,
|
||||||
|
PROJ_NEG_ZERO,
|
||||||
PROJ_ZERO_POS,
|
PROJ_ZERO_POS,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -646,30 +647,49 @@ struct mat4 {
|
|||||||
e33 = 1.0f;
|
e33 = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ortho(ProjRange range, float l, float r, float b, float t, float znear, float zfar) {
|
void ortho(ProjRange range, float l, float r, float b, float t, float znear, float zfar, bool rotate90 = false) {
|
||||||
identity();
|
identity();
|
||||||
|
|
||||||
e00 = 2.0f / (r - l);
|
if (rotate90) {
|
||||||
e11 = 2.0f / (t - b);
|
e00 = e11 = 0.0f;
|
||||||
e22 = 2.0f / (znear - zfar);
|
e01 = 2.0f / (r - l);
|
||||||
|
e10 = 2.0f / (b - t);
|
||||||
|
} else {
|
||||||
|
e00 = 2.0f / (r - l);
|
||||||
|
e11 = 2.0f / (t - b);
|
||||||
|
}
|
||||||
|
|
||||||
e03 = (l + r) / (l - r);
|
e03 = (l + r) / (l - r);
|
||||||
e13 = (t + b) / (b - t);
|
e13 = (t + b) / (b - t);
|
||||||
|
|
||||||
switch (range) {
|
switch (range) {
|
||||||
case PROJ_NEG_POS :
|
case PROJ_NEG_POS :
|
||||||
e23 = (zfar + znear) / (znear - zfar);
|
e22 = 2.0f / (znear - zfar);
|
||||||
|
e23 = (znear + zfar) / (znear - zfar);
|
||||||
|
break;
|
||||||
|
case PROJ_NEG_ZERO :
|
||||||
|
e22 = 1.0f / (znear - zfar);
|
||||||
|
e23 = (znear + zfar) / (znear - zfar) * 0.5f - 0.5f;
|
||||||
break;
|
break;
|
||||||
case PROJ_ZERO_POS :
|
case PROJ_ZERO_POS :
|
||||||
|
e22 = 2.0f / (znear - zfar);
|
||||||
e23 = znear / (znear - zfar);
|
e23 = znear / (znear - zfar);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void frustum(ProjRange range, float l, float r, float b, float t, float znear, float zfar) {
|
void frustum(ProjRange range, float l, float r, float b, float t, float znear, float zfar, bool rotate90 = false) {
|
||||||
identity();
|
identity();
|
||||||
|
|
||||||
e00 = 2.0f * znear / (r - l);
|
if (rotate90) {
|
||||||
e11 = 2.0f * znear / (t - b);
|
e00 = e11 = 0.0f;
|
||||||
|
e01 = 2.0f * znear / (r - l);
|
||||||
|
e10 = 2.0f * znear / (b - t);
|
||||||
|
} else {
|
||||||
|
e00 = 2.0f * znear / (r - l);
|
||||||
|
e11 = 2.0f * znear / (t - b);
|
||||||
|
}
|
||||||
|
|
||||||
e02 = (r + l) / (r - l);
|
e02 = (r + l) / (r - l);
|
||||||
e12 = (t + b) / (t - b);
|
e12 = (t + b) / (t - b);
|
||||||
e32 = -1.0f;
|
e32 = -1.0f;
|
||||||
@@ -680,6 +700,10 @@ struct mat4 {
|
|||||||
e22 = (znear + zfar) / (znear - zfar);
|
e22 = (znear + zfar) / (znear - zfar);
|
||||||
e23 = 2.0f * zfar * znear / (znear - zfar);
|
e23 = 2.0f * zfar * znear / (znear - zfar);
|
||||||
break;
|
break;
|
||||||
|
case PROJ_NEG_ZERO :
|
||||||
|
e22 = znear / (znear - zfar);
|
||||||
|
e23 = zfar * znear / (znear - zfar);
|
||||||
|
break;
|
||||||
case PROJ_ZERO_POS :
|
case PROJ_ZERO_POS :
|
||||||
e22 = zfar / (znear - zfar);
|
e22 = zfar / (znear - zfar);
|
||||||
e23 = znear * e22;
|
e23 = znear * e22;
|
||||||
@@ -687,18 +711,27 @@ struct mat4 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void perspective(ProjRange range, float fov, float aspect, float znear, float zfar, float eye = 0.0f) {
|
void perspective(ProjRange range, float fov, float aspect, float znear, float zfar, float eye = 0.0f, bool rotate90 = false) {
|
||||||
float y = tanf(fov * 0.5f * DEG2RAD) * znear;
|
float y = tanf(fov * 0.5f * DEG2RAD) * znear;
|
||||||
float x = y;
|
float x = y;
|
||||||
|
|
||||||
|
float eyeX, eyeY;
|
||||||
|
if (rotate90) {
|
||||||
|
eyeX = 0.0f;
|
||||||
|
eyeY = -eye;
|
||||||
|
aspect = 1.0f / aspect;
|
||||||
|
} else {
|
||||||
|
eyeX = eye;
|
||||||
|
eyeY = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
if (aspect >= 1.0f) {
|
if (aspect >= 1.0f) {
|
||||||
x = y * aspect;
|
x = y * aspect;
|
||||||
} else {
|
} else {
|
||||||
x = y;
|
|
||||||
y /= aspect;
|
y /= aspect;
|
||||||
}
|
}
|
||||||
|
|
||||||
frustum(range, -x - eye, x - eye, -y, y, znear, zfar);
|
frustum(range, -x - eyeX, x - eyeX, -y - eyeY, y - eyeY, znear, zfar, rotate90);
|
||||||
}
|
}
|
||||||
|
|
||||||
mat4(const vec3 &from, const vec3 &at, const vec3 &up) {
|
mat4(const vec3 &from, const vec3 &at, const vec3 &up) {
|
||||||
|
Reference in New Issue
Block a user