mirror of
https://github.com/mapbase-source/source-sdk-2013.git
synced 2025-06-07 19:32:09 +03:00
Fix Lightmappedgeneric and vbsp matrix functions
Shiro assisted in this fix, and now we don't need the custom matrixinvert.h functions anymore, because we use built-in engine functions for inversing Parallax corrected cubemaps. LightmappedGeneric has also been updated so mat_specular 0 doesn't break brushs anymore
This commit is contained in:
parent
7976a21b51
commit
10a936f55d
@ -805,8 +805,8 @@ void DrawLightmappedGeneric_DX9_Internal(CBaseVSShader *pShader, IMaterialVar**
|
|||||||
(params[info.m_nBlendModulateTexture]->IsTexture() );
|
(params[info.m_nBlendModulateTexture]->IsTexture() );
|
||||||
bool hasNormalMapAlphaEnvmapMask = IS_FLAG_SET( MATERIAL_VAR_NORMALMAPALPHAENVMAPMASK );
|
bool hasNormalMapAlphaEnvmapMask = IS_FLAG_SET( MATERIAL_VAR_NORMALMAPALPHAENVMAPMASK );
|
||||||
#ifdef PARALLAX_CORRECTED_CUBEMAPS
|
#ifdef PARALLAX_CORRECTED_CUBEMAPS
|
||||||
// Parallax cubemaps
|
// Parallax cubemaps. Check for envmap because if we don't, white splotchs can appear at certain viewing angles when mat_specular is 0.
|
||||||
bool hasParallaxCorrection = params[info.m_nEnvmapParallax]->GetIntValue() > 0;
|
bool hasParallaxCorrection = params[info.m_nEnvmap]->IsDefined() && params[info.m_nEnvmapParallax]->GetIntValue() > 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ( hasFlashlight && !IsX360() )
|
if ( hasFlashlight && !IsX360() )
|
||||||
|
@ -15,9 +15,6 @@
|
|||||||
#include "materialsub.h"
|
#include "materialsub.h"
|
||||||
#include "fgdlib/fgdlib.h"
|
#include "fgdlib/fgdlib.h"
|
||||||
#include "manifest.h"
|
#include "manifest.h"
|
||||||
#ifdef PARALLAX_CORRECTED_CUBEMAPS
|
|
||||||
#include "matrixinvert.h"
|
|
||||||
#endif
|
|
||||||
#ifdef MAPBASE_VSCRIPT
|
#ifdef MAPBASE_VSCRIPT
|
||||||
#include "vscript_vbsp.h"
|
#include "vscript_vbsp.h"
|
||||||
#endif
|
#endif
|
||||||
@ -1657,9 +1654,11 @@ ChunkFileResult_t CMapFile::LoadEntityCallback(CChunkFile *pFile, int nParam)
|
|||||||
//
|
//
|
||||||
if (!strcmp("parallax_obb", pClassName))
|
if (!strcmp("parallax_obb", pClassName))
|
||||||
{
|
{
|
||||||
matrix3x4_t obbMatrix, invObbMatrix;
|
//Originally was matrix3x2. Now we use built-in functions to the engine instead of a custom invert matrix
|
||||||
SetIdentityMatrix(obbMatrix);
|
VMatrix obbMatrix, invObbMatrix;
|
||||||
SetIdentityMatrix(invObbMatrix);
|
MatrixSetIdentity(obbMatrix);
|
||||||
|
MatrixSetIdentity(invObbMatrix);
|
||||||
|
|
||||||
|
|
||||||
// Get corner and its 3 edges (scaled, local x, y, and z axes)
|
// Get corner and its 3 edges (scaled, local x, y, and z axes)
|
||||||
mapbrush_t *brush = &mapbrushes[mapent->firstbrush];
|
mapbrush_t *brush = &mapbrushes[mapent->firstbrush];
|
||||||
@ -1714,13 +1713,15 @@ ChunkFileResult_t CMapFile::LoadEntityCallback(CChunkFile *pFile, int nParam)
|
|||||||
x *= abs(DotProduct(diag, x));
|
x *= abs(DotProduct(diag, x));
|
||||||
|
|
||||||
// Build transformation matrix (what is needed to turn a [0,0,0] - [1,1,1] cube into this brush)
|
// Build transformation matrix (what is needed to turn a [0,0,0] - [1,1,1] cube into this brush)
|
||||||
MatrixSetColumn(x, 0, obbMatrix);
|
//Originally was MatrixSetColum. Since we use VMatrix now, changed to obbMatrix
|
||||||
MatrixSetColumn(y, 1, obbMatrix);
|
obbMatrix.SetForward(x);
|
||||||
MatrixSetColumn(z, 2, obbMatrix);
|
obbMatrix.SetLeft(y);
|
||||||
MatrixSetColumn(corner, 3, obbMatrix);
|
obbMatrix.SetUp(z);
|
||||||
|
obbMatrix.SetTranslation(corner);
|
||||||
|
|
||||||
//find inverse (we need the world to local matrix, "transformationmatrix" is kind of a misnomer)
|
//find inverse (we need the world to local matrix, "transformationmatrix" is kind of a misnomer)
|
||||||
MatrixInversion(obbMatrix, invObbMatrix);
|
//Originally was MatrixInversion. This is now using the built in functions, not relying on MatrixInversion and matrixinvert.h anymore
|
||||||
|
MatrixInverseGeneral(obbMatrix, invObbMatrix);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,117 +0,0 @@
|
|||||||
// By Jason Yu-Tseh Chi
|
|
||||||
// From http://chi3x10.wordpress.com/2008/05/28/calculate-matrix-inversion-in-c/
|
|
||||||
// Modified to work with valve's matrix_3x4_t
|
|
||||||
|
|
||||||
#include "mathlib\mathlib.h"
|
|
||||||
|
|
||||||
// Calculate the cofactor of element (row,col)
|
|
||||||
int GetMatrixMinor(float **src, float **dest, int row, int col, int order)
|
|
||||||
{
|
|
||||||
// Indicate which col and row is being copied to dest
|
|
||||||
int colCount = 0, rowCount = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < order; i++)
|
|
||||||
{
|
|
||||||
if (i != row)
|
|
||||||
{
|
|
||||||
colCount = 0;
|
|
||||||
for (int j = 0; j < order; j++)
|
|
||||||
{
|
|
||||||
// When j is not the element
|
|
||||||
if (j != col)
|
|
||||||
{
|
|
||||||
dest[rowCount][colCount] = src[i][j];
|
|
||||||
colCount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rowCount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate the determinant recursively.
|
|
||||||
double CalcMatrixDeterminant(float **mat, int order)
|
|
||||||
{
|
|
||||||
// Order must be >= 0
|
|
||||||
// Stop the recursion when matrix is a single element
|
|
||||||
if (order == 1)
|
|
||||||
return mat[0][0];
|
|
||||||
|
|
||||||
// The determinant value
|
|
||||||
float det = 0;
|
|
||||||
|
|
||||||
// Allocate the cofactor matrix
|
|
||||||
float **minor;
|
|
||||||
minor = new float*[order - 1];
|
|
||||||
for (int i = 0; i<order - 1; i++)
|
|
||||||
minor[i] = new float[order - 1];
|
|
||||||
|
|
||||||
for (int i = 0; i < order; i++)
|
|
||||||
{
|
|
||||||
// Get minor of element (0,i)
|
|
||||||
GetMatrixMinor(mat, minor, 0, i, order);
|
|
||||||
// The recusion is here!
|
|
||||||
|
|
||||||
det += (i % 2 == 1 ? -1.0 : 1.0) * mat[0][i] * CalcMatrixDeterminant(minor, order - 1);
|
|
||||||
//det += pow( -1.0, i ) * mat[0][i] * CalcMatrixDeterminant( minor,order-1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release memory
|
|
||||||
for (int i = 0; i<order - 1; i++)
|
|
||||||
delete[] minor[i];
|
|
||||||
delete[] minor;
|
|
||||||
|
|
||||||
return det;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Matrix inversion
|
|
||||||
void MatrixInversion(matrix3x4_t &in, matrix3x4_t &out)
|
|
||||||
{
|
|
||||||
float **A;
|
|
||||||
A = new float*[4];
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
A[i] = new float[4];
|
|
||||||
int order = 4;
|
|
||||||
|
|
||||||
// Load in into A
|
|
||||||
for (int i = 0; i < 3; i++)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < 4; j++)
|
|
||||||
{
|
|
||||||
A[i][j] = in[i][j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
A[3][0] = A[3][1] = A[3][2] = 0;
|
|
||||||
A[3][3] = 1;
|
|
||||||
|
|
||||||
// Get the determinant of a
|
|
||||||
double det = 1.0 / CalcMatrixDeterminant((float**)A, order);
|
|
||||||
|
|
||||||
// Memory allocation
|
|
||||||
float *temp = new float[(order - 1)*(order - 1)];
|
|
||||||
float **minor = new float*[order - 1];
|
|
||||||
for (int i = 0; i<order - 1; i++)
|
|
||||||
minor[i] = temp + (i*(order - 1));
|
|
||||||
|
|
||||||
for (int j = 0; j<order; j++)
|
|
||||||
{
|
|
||||||
for (int i = 0; i<order; i++)
|
|
||||||
{
|
|
||||||
// Get the co-factor (matrix) of A(j,i)
|
|
||||||
GetMatrixMinor((float**)A, minor, j, i, order);
|
|
||||||
out[i][j] = det*CalcMatrixDeterminant(minor, order - 1);
|
|
||||||
if ((i + j) % 2 == 1)
|
|
||||||
out[i][j] = -out[i][j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release memory
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
delete A[i];
|
|
||||||
delete A;
|
|
||||||
//delete [] minor[0];
|
|
||||||
delete[] temp;
|
|
||||||
delete[] minor;
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user