Fix Entity3D.viewport returning None, closes #244
The root cause was PyViewport3DType being declared `static` in Viewport3D.h, creating per-translation-unit copies. Entity3D.cpp's copy was never passed through PyType_Ready, causing segfaults when tp_alloc was called. Changed `static` to `inline` (matching PyEntity3DType and PyModel3DType patterns), and implemented get_viewport using the standard type->tp_alloc pattern. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
b9a48a85b0
commit
2062e4e4ad
3 changed files with 193 additions and 12 deletions
44
tests/unit/test_entity3d_viewport.py
Normal file
44
tests/unit/test_entity3d_viewport.py
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
"""Test Entity3D.viewport property (issue #244)"""
|
||||
import mcrfpy
|
||||
import sys
|
||||
|
||||
errors = []
|
||||
|
||||
# Test 1: Detached entity returns None
|
||||
e = mcrfpy.Entity3D(pos=(0,0), scale=1.0)
|
||||
if e.viewport is not None:
|
||||
errors.append("Detached entity viewport should be None")
|
||||
|
||||
# Test 2: Attached entity returns Viewport3D
|
||||
vp = mcrfpy.Viewport3D(pos=(0,0), size=(100,100))
|
||||
vp.set_grid_size(16, 16)
|
||||
e2 = mcrfpy.Entity3D(pos=(5,5), scale=1.0)
|
||||
vp.entities.append(e2)
|
||||
v = e2.viewport
|
||||
if v is None:
|
||||
errors.append("Attached entity viewport should not be None")
|
||||
elif type(v).__name__ != 'Viewport3D':
|
||||
errors.append(f"Expected Viewport3D, got {type(v).__name__}")
|
||||
|
||||
# Test 3: Viewport properties are accessible
|
||||
if v is not None:
|
||||
try:
|
||||
_ = v.w
|
||||
_ = v.h
|
||||
except Exception as ex:
|
||||
errors.append(f"Viewport properties not accessible: {ex}")
|
||||
|
||||
# Test 4: Multiple entities share same viewport
|
||||
e3 = mcrfpy.Entity3D(pos=(3,3), scale=1.0)
|
||||
vp.entities.append(e3)
|
||||
v2 = e3.viewport
|
||||
if v2 is None:
|
||||
errors.append("Second entity viewport should not be None")
|
||||
|
||||
if errors:
|
||||
for err in errors:
|
||||
print(f"FAIL: {err}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
else:
|
||||
print("PASS: Entity3D.viewport (issue #244)", file=sys.stderr)
|
||||
sys.exit(0)
|
||||
Loading…
Add table
Add a link
Reference in a new issue