- Update to 1.4.1

This commit is contained in:
Dmitry Marakasov 2016-06-23 22:11:21 +00:00
parent df1487f8d3
commit b10f77df71
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=417402
4 changed files with 4 additions and 107 deletions

View File

@ -2,8 +2,7 @@
# $FreeBSD$
PORTNAME= dhewm3
PORTVERSION= 1.4.0
PORTREVISION= 1
PORTVERSION= 1.4.1
CATEGORIES= games
MAINTAINER= amdmi3@FreeBSD.org

View File

@ -1,2 +1,3 @@
SHA256 (dhewm-dhewm3-1.4.0_GH0.tar.gz) = b579cd2d07d4efc0ebb536c933857ee28a302d9e9484ebd5bda9b40f8da17f88
SIZE (dhewm-dhewm3-1.4.0_GH0.tar.gz) = 5311334
TIMESTAMP = 1466426532
SHA256 (dhewm-dhewm3-1.4.1_GH0.tar.gz) = 587586142d863ff98051619f0d49c056c5302e919c655a50af69a8293bc3ae08
SIZE (dhewm-dhewm3-1.4.1_GH0.tar.gz) = 5312533

View File

@ -1,52 +0,0 @@
commit b03fc9271aa5c4aaf4e90a940c78d004e2962148
Author: Daniel Gibson <metalcaedes@gmail.com>
Date: Sun Dec 13 03:06:52 2015 +0100
Fix crash by assert in last RoE level (and maybe elsewhere)
The assertion in idBounds::operator-(const idBounds&) was triggered
from idWeapon::Event_LaunchProjectiles() (ownerBounds - projBounds)
It only happened when using the BFG.
So I added a check to make sure calling operator- is legal.
I guess this also caused #122
diff --git neo/d3xp/Weapon.cpp neo/d3xp/Weapon.cpp
index 2101381..30f8882 100644
--- d3xp/Weapon.cpp
+++ d3xp/Weapon.cpp
@@ -3446,7 +3446,14 @@ void idWeapon::Event_LaunchProjectiles( int num_projectiles, float spread, float
// make sure the projectile starts inside the bounding box of the owner
if ( i == 0 ) {
muzzle_pos = muzzleOrigin + playerViewAxis[ 0 ] * 2.0f;
- if ( ( ownerBounds - projBounds).RayIntersection( muzzle_pos, playerViewAxis[0], distance ) ) {
+
+ // DG: sometimes the assertion in idBounds::operator-(const idBounds&) triggers
+ // (would get bounding box with negative volume)
+ // => check that before doing ownerBounds - projBounds (equivalent to the check in the assertion)
+ idVec3 obDiff = ownerBounds[1] - ownerBounds[0];
+ idVec3 pbDiff = projBounds[1] - projBounds[0];
+ bool boundsSubLegal = obDiff.x > pbDiff.x && obDiff.y > pbDiff.y && obDiff.z > pbDiff.z;
+ if ( boundsSubLegal && ( ownerBounds - projBounds ).RayIntersection( muzzle_pos, playerViewAxis[0], distance ) ) {
start = muzzle_pos + distance * playerViewAxis[0];
} else {
start = ownerBounds.GetCenter();
diff --git neo/game/Weapon.cpp neo/game/Weapon.cpp
index d889c68..a381ae2 100644
--- game/Weapon.cpp
+++ game/Weapon.cpp
@@ -2941,7 +2941,13 @@ void idWeapon::Event_LaunchProjectiles( int num_projectiles, float spread, float
// make sure the projectile starts inside the bounding box of the owner
if ( i == 0 ) {
muzzle_pos = muzzleOrigin + playerViewAxis[ 0 ] * 2.0f;
- if ( ( ownerBounds - projBounds).RayIntersection( muzzle_pos, playerViewAxis[0], distance ) ) {
+ // DG: sometimes the assertion in idBounds::operator-(const idBounds&) triggers
+ // (would get bounding box with negative volume)
+ // => check that before doing ownerBounds - projBounds (equivalent to the check in the assertion)
+ idVec3 obDiff = ownerBounds[1] - ownerBounds[0];
+ idVec3 pbDiff = projBounds[1] - projBounds[0];
+ bool boundsSubLegal = obDiff.x > pbDiff.x && obDiff.y > pbDiff.y && obDiff.z > pbDiff.z;
+ if ( boundsSubLegal && ( ownerBounds - projBounds ).RayIntersection( muzzle_pos, playerViewAxis[0], distance ) ) {
start = muzzle_pos + distance * playerViewAxis[0];
} else {
start = ownerBounds.GetCenter();

View File

@ -1,51 +0,0 @@
commit 9950a5721f98eaffc6d8360c6d52ea9bcc0afb9c
Author: Daniel Gibson <metalcaedes@gmail.com>
Date: Thu Dec 17 18:07:35 2015 +0100
Fix heap corruption when loading (broken?) .ma models
On FreeBSD, the game used to crash when loading the last level of RoE
(d3xp), while loading models/david/hell_h7.ma.
The problem could be reproduced on Linux whith #define USE_LIBC_MALLOC 1
and clang's AddressSanitizer.
Turns out that this file specifies a vertex transform for a non-existent
vertex (index 31, while we only have 0-30) and thus the bounds of
pMesh->vertexes[] are violated.
I added a check to ensure the index is within the bounds and a Warning
if it isn't.
It should work now. If however it turns out that more files have this
problem, maybe .ma is parsed incorrectly and we need a differently fix.
(Should) fix #138
diff --git neo/renderer/Model_ma.cpp neo/renderer/Model_ma.cpp
index e31ca40..1cd672a 100644
--- renderer/Model_ma.cpp
+++ renderer/Model_ma.cpp
@@ -203,7 +203,7 @@ bool MA_ParseVertex(idParser& parser, maAttribHeader_t* header) {
//Allocate enough space for all the verts if this is the first attribute for verticies
if(!pMesh->vertexes) {
- pMesh->numVertexes = header->size;
+ pMesh->numVertexes = header->size; // XXX: +1?
pMesh->vertexes = (idVec3 *)Mem_Alloc( sizeof( idVec3 ) * pMesh->numVertexes );
}
@@ -692,7 +692,16 @@ void MA_ParseMesh(idParser& parser) {
//Now apply the pt transformations
for(int i = 0; i < pMesh->numVertTransforms; i++) {
- pMesh->vertexes[(int)pMesh->vertTransforms[i].w] += pMesh->vertTransforms[i].ToVec3();
+ int idx = (int)pMesh->vertTransforms[i].w;
+ if(idx < 0 || idx >= pMesh->numVertexes)
+ {
+ // this happens with d3xp/models/david/hell_h7.ma in the d3xp hell level
+ // TODO: if it happens for other models, too, maybe it's intended and the .ma parsing is broken
+ common->Warning( "Model %s tried to set an out-of-bounds vertex transform (%d, but max vert. index is %d)!",
+ parser.GetFileName(), idx, pMesh->numVertexes-1 );
+ continue;
+ }
+ pMesh->vertexes[idx] += pMesh->vertTransforms[i].ToVec3();
}
MA_VERBOSE((va("MESH %s - parent %s\n", header.name, header.parent)));