Re: [CrystalSpace] #982: terrain2 collider tries to call GetHeight() when height data not loaded
"CrystalSpace" <[email protected]> Tue, 02 Jul 2013 05:38:07 -0000
| Newsgroups | gmane.comp.graphics.crystalspace.tracker |
|---|---|
| Message-ID | <[email protected]> |
#982: terrain2 collider tries to call GetHeight() when height data not loaded
---------------------------+------------------------------------------------
Reporter: ralphcampbell | Owner: kickvb
Type: defect | Status: accepted
Priority: major | Milestone:
Component: libs | Version: V2.1
Keywords: |
---------------------------+------------------------------------------------
Description changed by sunshine:
Old description:
> I am converting PlaneShift to use the CS threaded loader and hit what
> looks like a bug in terrain2.
>
> {{{
> Program received signal SIGTRAP, Trace/breakpoint trap.
> 0x000000359260eedb in raise (sig=5)
> at ../nptl/sysdeps/unix/sysv/linux/pt-raise.c:41
> 41 sig);
> (gdb) bt
> #0 0x000000359260eedb in raise (sig=5)
> at ../nptl/sysdeps/unix/sysv/linux/pt-raise.c:41
> #1 0x00007ffff771ed7c in CS::Debug::DebugBreak () at
> ./include/cssysdef.h:971
> #2 0x00007ffff771efec in CS::Debug::AssertMessage (expr=
> 0x7fff20c19201 "n < count", filename=
> 0x7fff20c191e8 "./include/csutil/array.h", line=702, msg=0x0)
> at /home/ralphc/src/CS_LATEST/libs/csutil/csassert.cpp:82
> #3 0x00007fff20bf3ee0 in csArray<float, csArrayElementHandler<float>,
> CS::Memory::AllocatorMalloc, csArrayCapacityFixedGrow<16> >::Get
> (this=0x7fff2e3bfc38,
> n=19531) at ./include/csutil/array.h:702
> #4 0x00007fff20bf3831 in csArray<float, csArrayElementHandler<float>,
> CS::Memory::AllocatorMalloc, csArrayCapacityFixedGrow<16> >::operator[]
> (this=
> 0x7fff2e3bfc38, n=19531) at ./include/csutil/array.h:739
> #5 0x00007fff20bf219f in CS::Plugin::Terrain2::csTerrainCell::GetHeight
> (this=
> 0x7fff2e3bfb20, x=256, y=75)
> at
> /home/ralphc/src/CS_LATEST/plugins/mesh/terrain/terrain2/cell.cpp:613
> #6 0x00007fff20bf221b in CS::Plugin::Terrain2::csTerrainCell::GetHeight
> (this=
> 0x7fff2e3bfb20, pos=...)
> at
> /home/ralphc/src/CS_LATEST/plugins/mesh/terrain/terrain2/cell.cpp:623
> #7 0x00007fffea12bc7c in
> CS::Plugin::csOpcode::csTerrainSegmentCellCollider::csTerrainSegmentCellCollider
> (this=0x7fffffffc140, cell=0x7fff2e3bfb38, start=
> ..., end=...)
> at /home/ralphc/src/CS_LATEST/plugins/collide/opcode/segmentcell.h:94
> ---Type <return> to continue, or q <return> to quit---q
> Quit
> (gdb) f 3
> #3 0x00007fff20bf3ee0 in csArray<float, csArrayElementHandler<float>,
> CS::Memory::AllocatorMalloc, csArrayCapacityFixedGrow<16> >::Get
> (this=0x7fff2e3bfc38,
> n=19531) at ./include/csutil/array.h:702
> 702 CS_ASSERT (n < count);
> (gdb) p n
> $1 = 19531
> (gdb) p count
> $2 = 0
> (gdb) f 5
> #5 0x00007fff20bf219f in CS::Plugin::Terrain2::csTerrainCell::GetHeight
> (this=
> 0x7fff2e3bfb20, x=256, y=75)
> at
> /home/ralphc/src/CS_LATEST/plugins/mesh/terrain/terrain2/cell.cpp:613
> 613 return heightmap[y * gridWidth + x];
> (gdb) p gridWidth
> $3 = 257
> (gdb) p loadState
> $4 = iTerrainCell::NotLoaded
> }}}
>
> I added a check to load the data which seems to fix this problem.
>
> {{{
> Index: plugins/mesh/terrain/terrain2/cell.cpp
> ===================================================================
> --- plugins/mesh/terrain/terrain2/cell.cpp (revision 39432)
> +++ plugins/mesh/terrain/terrain2/cell.cpp (working copy)
> @@ -554,6 +554,7 @@
> if (!collider || !collisionProperties->GetCollidable ())
> return false;
>
> + SetLoadState (Loaded);
> return collider->CollideSegment (this, start, end, hitPoint);
> }
> }}}
New description:
I am converting PlaneShift to use the CS threaded loader and hit what
looks like a bug in terrain2.
{{{
Program received signal SIGTRAP, Trace/breakpoint trap.
0x000000359260eedb in raise (sig=5)
at ../nptl/sysdeps/unix/sysv/linux/pt-raise.c:41
41 sig);
(gdb) bt
#0 0x000000359260eedb in raise (sig=5)
at ../nptl/sysdeps/unix/sysv/linux/pt-raise.c:41
#1 0x00007ffff771ed7c in CS::Debug::DebugBreak () at
./include/cssysdef.h:971
#2 0x00007ffff771efec in CS::Debug::AssertMessage (expr=
0x7fff20c19201 "n < count", filename=
0x7fff20c191e8 "./include/csutil/array.h", line=702, msg=0x0)
at /home/ralphc/src/CS_LATEST/libs/csutil/csassert.cpp:82
#3 0x00007fff20bf3ee0 in csArray<float, csArrayElementHandler<float>,
CS::Memory::AllocatorMalloc, csArrayCapacityFixedGrow<16> >::Get
(this=0x7fff2e3bfc38,
n=19531) at ./include/csutil/array.h:702
#4 0x00007fff20bf3831 in csArray<float, csArrayElementHandler<float>,
CS::Memory::AllocatorMalloc, csArrayCapacityFixedGrow<16> >::operator[]
(this=
0x7fff2e3bfc38, n=19531) at ./include/csutil/array.h:739
#5 0x00007fff20bf219f in CS::Plugin::Terrain2::csTerrainCell::GetHeight
(this=
0x7fff2e3bfb20, x=256, y=75)
at
/home/ralphc/src/CS_LATEST/plugins/mesh/terrain/terrain2/cell.cpp:613
#6 0x00007fff20bf221b in CS::Plugin::Terrain2::csTerrainCell::GetHeight
(this=
0x7fff2e3bfb20, pos=...)
at
/home/ralphc/src/CS_LATEST/plugins/mesh/terrain/terrain2/cell.cpp:623
#7 0x00007fffea12bc7c in
CS::Plugin::csOpcode::csTerrainSegmentCellCollider::csTerrainSegmentCellCollider
(this=0x7fffffffc140, cell=0x7fff2e3bfb38, start=
..., end=...)
at /home/ralphc/src/CS_LATEST/plugins/collide/opcode/segmentcell.h:94
---Type <return> to continue, or q <return> to quit---q
Quit
(gdb) f 3
#3 0x00007fff20bf3ee0 in csArray<float, csArrayElementHandler<float>,
CS::Memory::AllocatorMalloc, csArrayCapacityFixedGrow<16> >::Get
(this=0x7fff2e3bfc38,
n=19531) at ./include/csutil/array.h:702
702 CS_ASSERT (n < count);
(gdb) p n
$1 = 19531
(gdb) p count
$2 = 0
(gdb) f 5
#5 0x00007fff20bf219f in CS::Plugin::Terrain2::csTerrainCell::GetHeight
(this=
0x7fff2e3bfb20, x=256, y=75)
at
/home/ralphc/src/CS_LATEST/plugins/mesh/terrain/terrain2/cell.cpp:613
613 return heightmap[y * gridWidth + x];
(gdb) p gridWidth
$3 = 257
(gdb) p loadState
$4 = iTerrainCell::NotLoaded
}}}
I added a check to load the data which seems to fix this problem.
{{{
#!diff
Index: plugins/mesh/terrain/terrain2/cell.cpp
===================================================================
--- plugins/mesh/terrain/terrain2/cell.cpp (revision 39432)
+++ plugins/mesh/terrain/terrain2/cell.cpp (working copy)
@@ -554,6 +554,7 @@
if (!collider || !collisionProperties->GetCollidable ())
return false;
+ SetLoadState (Loaded);
return collider->CollideSegment (this, start, end, hitPoint);
}
}}}
--
--
Ticket URL: <http://www.crystalspace3d.org/trac/CS/ticket/982#comment:4>
CrystalSpace <http://www.crystalspace3d.org/>
Free open-source 3D SDK.
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:
Build for Windows Store.
http://p.sf.net/sfu/windows-dev2dev