Doctests for the opt_collisiongeometry spell
============================================

General check
-------------

>>> from pyffi.formats.nif import NifFormat
>>> import pyffi.spells.nif.optimize
>>> from pyffi.spells import Toaster
>>> data = NifFormat.Data()
>>> stream = open("tests/nif/test_opt_collision_complex_mopp.nif", "rb")
>>> data.read(stream)
>>> # check initial data
>>> data.roots[0].collision_object.body.shape.shape.sub_shapes[0].num_vertices
53
>>> data.roots[0].collision_object.body.shape.shape.data.num_vertices
53
>>> data.roots[0].collision_object.body.shape.shape.data.num_triangles
102
>>> print(str(data.roots[0].collision_object.body.shape.shape.data.triangles[-1])) # doctest: +ELLIPSIS +REPORT_NDIFF
<class 'pyffi.formats.nif.hkTriangle'> instance at ...
* triangle :
    <class 'pyffi.formats.nif.Triangle'> instance at ...
    * v_1 : 13
    * v_2 : 17
    * v_3 : 5
* welding_info : 18924
* normal : [ -0.904  0.197 -0.380 ]
<BLANKLINE>
>>> # run the spell that fixes this
>>> spell = pyffi.spells.nif.optimize.SpellOptimizeCollisionGeometry(data=data)
>>> spell.recurse() # doctest: +REPORT_NDIFF
pyffi.toaster:INFO:--- opt_collisiongeometry ---
pyffi.toaster:INFO:  ~~~ NiNode [Scene Root] ~~~
pyffi.toaster:INFO:    ~~~ bhkCollisionObject [] ~~~
pyffi.toaster:INFO:      ~~~ bhkRigidBody [] ~~~
pyffi.toaster:INFO:        ~~~ bhkMoppBvTreeShape [] ~~~
pyffi.toaster:INFO:          optimizing mopp
pyffi.toaster:INFO:          removing duplicate vertices
pyffi.toaster:INFO:          (processing subshape 0)
pyffi.toaster:INFO:          (num vertices in collision shape was 53 and is now 51)
pyffi.toaster:INFO:          removing duplicate triangles
pyffi.toaster:INFO:          (num triangles in collision shape was 102 and is now 98)
Mopper. Copyright (c) 2008, NIF File Format Library and Tools.
All rights reserved.
<BLANKLINE>
Options:
  --help      for usage help
  --license   for licensing details
<BLANKLINE>
Mopper uses havok. Copyright 1999-2008 Havok.com Inc. (and its Licensors).
All Rights Reserved. See www.havok.com for details.
<BLANKLINE>
<BLANKLINE>
pyffi.toaster:INFO:    ~~~ NiTriShape [] ~~~
>>> # check optimized data
>>> data.roots[0].collision_object.body.shape.shape.sub_shapes[0].num_vertices
51
>>> data.roots[0].collision_object.body.shape.shape.data.num_vertices
51
>>> data.roots[0].collision_object.body.shape.shape.data.num_triangles
98
>>> print(str(data.roots[0].collision_object.body.shape.shape.data.triangles[-1])) # doctest: +ELLIPSIS
<class 'pyffi.formats.nif.hkTriangle'> instance at ...
* triangle :
    <class 'pyffi.formats.nif.Triangle'> instance at ...
    * v_1 : 12
    * v_2 : 16
    * v_3 : 4
* welding_info : 18924
* normal : [ -0.904  0.197 -0.380 ]
<BLANKLINE>

Unpacked collision check
------------------------

>>> from pyffi.formats.nif import NifFormat
>>> import pyffi.spells.nif.optimize
>>> from pyffi.spells import Toaster
>>> data = NifFormat.Data()
>>> stream = open("tests/nif/test_opt_collision_unpacked.nif", "rb")
>>> data.read(stream)
>>> # check initial data
>>> data.roots[0].collision_object.body.shape.strips_data[0].num_vertices
24
>>> data.roots[0].collision_object.body.shape.strips_data[0].num_triangles
32
>>> # run the spell
>>> spell = pyffi.spells.nif.optimize.SpellOptimizeCollisionGeometry(data=data)
>>> spell.recurse() # doctest: +REPORT_NDIFF
pyffi.toaster:INFO:--- opt_collisiongeometry ---
pyffi.toaster:INFO:  ~~~ NiNode [TestBhkNiTriStripsShape] ~~~
pyffi.toaster:INFO:    ~~~ bhkCollisionObject [] ~~~
pyffi.toaster:INFO:      ~~~ bhkRigidBodyT [] ~~~
pyffi.toaster:INFO:        packing collision
pyffi.toaster:INFO:        adding mopp
Mopper. Copyright (c) 2008, NIF File Format Library and Tools.
All rights reserved.
<BLANKLINE>
Options:
  --help      for usage help
  --license   for licensing details
<BLANKLINE>
Mopper uses havok. Copyright 1999-2008 Havok.com Inc. (and its Licensors).
All Rights Reserved. See www.havok.com for details.
<BLANKLINE>
<BLANKLINE>
pyffi.toaster:INFO:        optimizing mopp
pyffi.toaster:INFO:        removing duplicate vertices
pyffi.toaster:INFO:        (processing subshape 0)
pyffi.toaster:INFO:        (num vertices in collision shape was 24 and is now 8)
pyffi.toaster:INFO:        removing duplicate triangles
pyffi.toaster:INFO:        (num triangles in collision shape was 12 and is now 12)
Mopper. Copyright (c) 2008, NIF File Format Library and Tools.
All rights reserved.
<BLANKLINE>
Options:
  --help      for usage help
  --license   for licensing details
<BLANKLINE>
Mopper uses havok. Copyright 1999-2008 Havok.com Inc. (and its Licensors).
All Rights Reserved. See www.havok.com for details.
<BLANKLINE>
<BLANKLINE>
pyffi.toaster:INFO:    ~~~ NiTriShape [Stuff] ~~~
>>> # check optimized data
>>> data.roots[0].collision_object.body.shape.shape.sub_shapes[0].num_vertices
8
>>> data.roots[0].collision_object.body.shape.shape.data.num_vertices
8
>>> data.roots[0].collision_object.body.shape.shape.data.num_triangles
12

Packed collision check
----------------------

>>> from pyffi.formats.nif import NifFormat
>>> import pyffi.spells.nif.optimize
>>> from pyffi.spells import Toaster
>>> data = NifFormat.Data()
>>> stream = open("tests/nif/test_opt_collision_packed.nif", "rb")
>>> data.read(stream)
>>> # check initial data
>>> data.roots[0].collision_object.body.shape.sub_shapes[0].num_vertices
24
>>> data.roots[0].collision_object.body.shape.data.num_vertices
24
>>> data.roots[0].collision_object.body.shape.data.num_triangles
12
>>> # run the spell
>>> spell = pyffi.spells.nif.optimize.SpellOptimizeCollisionGeometry(data=data)
>>> spell.recurse() # doctest: +REPORT_NDIFF
pyffi.toaster:INFO:--- opt_collisiongeometry ---
pyffi.toaster:INFO:  ~~~ NiNode [TestBhkPackedNiTriStripsShape] ~~~
pyffi.toaster:INFO:    ~~~ bhkCollisionObject [] ~~~
pyffi.toaster:INFO:      ~~~ bhkRigidBodyT [] ~~~
pyffi.toaster:INFO:        adding mopp
Mopper. Copyright (c) 2008, NIF File Format Library and Tools.
All rights reserved.
<BLANKLINE>
Options:
  --help      for usage help
  --license   for licensing details
<BLANKLINE>
Mopper uses havok. Copyright 1999-2008 Havok.com Inc. (and its Licensors).
All Rights Reserved. See www.havok.com for details.
<BLANKLINE>
<BLANKLINE>
pyffi.toaster:INFO:        optimizing mopp
pyffi.toaster:INFO:        removing duplicate vertices
pyffi.toaster:INFO:        (processing subshape 0)
pyffi.toaster:INFO:        (num vertices in collision shape was 24 and is now 8)
pyffi.toaster:INFO:        removing duplicate triangles
pyffi.toaster:INFO:        (num triangles in collision shape was 12 and is now 12)
Mopper. Copyright (c) 2008, NIF File Format Library and Tools.
All rights reserved.
<BLANKLINE>
Options:
  --help      for usage help
  --license   for licensing details
<BLANKLINE>
Mopper uses havok. Copyright 1999-2008 Havok.com Inc. (and its Licensors).
All Rights Reserved. See www.havok.com for details.
<BLANKLINE>
<BLANKLINE>
pyffi.toaster:INFO:    ~~~ NiTriShape [Stuff] ~~~
>>> # check optimized data
>>> data.roots[0].collision_object.body.shape.shape.sub_shapes[0].num_vertices
8
>>> data.roots[0].collision_object.body.shape.shape.data.num_vertices
8
>>> data.roots[0].collision_object.body.shape.shape.data.num_triangles
12

Mopp collision check
--------------------

>>> from pyffi.formats.nif import NifFormat
>>> import pyffi.spells.nif.optimize
>>> from pyffi.spells import Toaster
>>> data = NifFormat.Data()
>>> stream = open("tests/nif/test_opt_collision_mopp.nif", "rb")
>>> data.read(stream)
>>> # check initial data
>>> data.roots[0].collision_object.body.shape.shape.sub_shapes[0].num_vertices
24
>>> data.roots[0].collision_object.body.shape.shape.data.num_vertices
24
>>> data.roots[0].collision_object.body.shape.shape.data.num_triangles
12
>>> # run the spell
>>> spell = pyffi.spells.nif.optimize.SpellOptimizeCollisionGeometry(data=data)
>>> spell.recurse() # doctest: +REPORT_NDIFF
pyffi.toaster:INFO:--- opt_collisiongeometry ---
pyffi.toaster:INFO:  ~~~ NiNode [TestBhkMoppBvTreeShape] ~~~
pyffi.toaster:INFO:    ~~~ bhkCollisionObject [] ~~~
pyffi.toaster:INFO:      ~~~ bhkRigidBodyT [] ~~~
pyffi.toaster:INFO:        ~~~ bhkMoppBvTreeShape [] ~~~
pyffi.toaster:INFO:          optimizing mopp
pyffi.toaster:INFO:          removing duplicate vertices
pyffi.toaster:INFO:          (processing subshape 0)
pyffi.toaster:INFO:          (num vertices in collision shape was 24 and is now 8)
pyffi.toaster:INFO:          removing duplicate triangles
pyffi.toaster:INFO:          (num triangles in collision shape was 12 and is now 12)
Mopper. Copyright (c) 2008, NIF File Format Library and Tools.
All rights reserved.
<BLANKLINE>
Options:
  --help      for usage help
  --license   for licensing details
<BLANKLINE>
Mopper uses havok. Copyright 1999-2008 Havok.com Inc. (and its Licensors).
All Rights Reserved. See www.havok.com for details.
<BLANKLINE>
<BLANKLINE>
pyffi.toaster:INFO:    ~~~ NiTriShape [Stuff] ~~~
>>> # check optimized data
>>> data.roots[0].collision_object.body.shape.shape.sub_shapes[0].num_vertices
8
>>> data.roots[0].collision_object.body.shape.shape.data.num_vertices
8
>>> data.roots[0].collision_object.body.shape.shape.data.num_triangles
12
