Skip to content
This repository has been archived by the owner on Apr 9, 2024. It is now read-only.

numpy 1.23 breaks scenepick #34

Closed
TadasBaltrusaitis opened this issue Jun 24, 2022 · 9 comments
Closed

numpy 1.23 breaks scenepick #34

TadasBaltrusaitis opened this issue Jun 24, 2022 · 9 comments

Comments

@TadasBaltrusaitis
Copy link

Update to numpy==1.23.0 breaks scenepic 1.0.8 (on Windows and Ubuntu).

Reproduced by using a reduced jelly example:

import scenepic as sp
import numpy as np

scene = sp.Scene()
canvas = scene.create_canvas_3d(width=700, height=700)

jelly_mesh = sp.load_obj(r"C:\Users\tabaltru\Downloads\jelly.obj")
texture = scene.create_image("texture")
texture.load(r"C:\Users\tabaltru\Downloads\jelly.png")

base_mesh = scene.create_mesh("jelly_base")
base_mesh.texture_id = texture.image_id
base_mesh.use_texture_alpha = True
base_mesh.add_mesh(jelly_mesh)

positions = jelly_mesh.positions.copy()
mesh_update = scene.update_mesh_without_normals("jelly_base", positions)

Leads to the following error:

Exception has occurred: TypeError
update_mesh_without_normals(): incompatible function arguments. The following argument types are supported:
    1. (self: scenepic._scenepic.Scene, base_mesh_id: str, positions: numpy.ndarray[numpy.float32[m, 3], flags.c_contiguous], mesh_id: str = '') -> scenepic._scenepic.MeshUpdate

Invoked with: <scenepic._scenepic.Scene object at 0x000001FB7FD8ECB0>, 'jelly_base', array([], shape=(0, 3), dtype=float32)
  File "C:\code\mrai.moai\moai\sampling\scenepic_test.py", line 17, in <module>
    mesh_update = scene.update_mesh_without_normals("jelly_base", positions)

Tried in a clean conda environment both with numpy==1.22.0 and numpy==1.23.0 with only the latter breaking.

@tjcashman
Copy link
Member

I tried to reproduce, but couldn't do so with numpy 1.23.0 and scenepic 1.0.8 on Python 3.9.6 in a virtualenv. The following seems to complete without error (where test.py is the example above):

> virtualenv testnpsp
created virtual environment CPython3.9.6.final.0-64 in 8103ms
  creator CPython3Windows(dest=D:\Repos\scenepic\testnpsp, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=~\AppData\Local\pypa\virtualenv)
    added seed packages: pip==22.1.2, setuptools==62.6.0, wheel==0.37.1
  activators BashActivator,BatchActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

> cd testnpsp

testnpsp> Scripts\activate

(testnpsp) testnpsp> pip install numpy==1.23.0 scenepic==1.0.8
Collecting numpy==1.23.0
  Using cached numpy-1.23.0-cp39-cp39-win_amd64.whl (14.7 MB)
Collecting scenepic==1.0.8
  Using cached scenepic-1.0.8-cp39-cp39-win_amd64.whl (557 kB)
Collecting pillow>=5.2.0
  Using cached Pillow-9.1.1-cp39-cp39-win_amd64.whl (3.3 MB)
Collecting scipy>=1.4.1
  Using cached scipy-1.8.1-cp39-cp39-win_amd64.whl (36.9 MB)
Installing collected packages: pillow, numpy, scipy, scenepic
Successfully installed numpy-1.23.0 pillow-9.1.1 scenepic-1.0.8 scipy-1.8.1

(testnpsp) testnpsp> python test.py
scenepic[info]> Disabling VideoWriter due to ImportError

Maybe we need a bit more info on the configuration where the error occurs?

@TadasBaltrusaitis
Copy link
Author

Interesting, here's my pip freeze on a Windows machine with Python 3.8.13 environment managed through Miniconda3:

numpy==1.23.0
Pillow==9.1.1
scenepic==1.0.8
scipy==1.8.1
wincertstore==0.2

@TadasBaltrusaitis
Copy link
Author

TadasBaltrusaitis commented Jun 27, 2022

Just tried with Python 3.9.12 on my machine and it still fails. Complete repro steps with miniconda:

conda create -n scenepic python=3.9
conda activate scenepic
pip install numpy==1.23
pip install scenepic

Still results in above error, if I do:

pip uninstall numpy
pip install numpy==1.22

The above error is fixed

Pip freeze after installing numpy==1.22, seems like all the other modules are the same, the only difference in numpy

numpy==1.22.0
Pillow==9.1.1
scenepic==1.0.8
scipy==1.8.1
wincertstore==0.2

@friggog
Copy link

friggog commented Jun 30, 2022

unable to replicate with python 3.9 or 3.10 😒

@friggog
Copy link

friggog commented Jun 30, 2022

Here is a minimal example that replicates the issue we are seeing - I think Tadas' above was not correct:

import scenepic as sp
import numpy as np

scene = sp.Scene()
mesh = scene.create_mesh("a_mesh", shared_color=sp.Colors.Blue)
mesh.add_mesh_without_normals(np.zeros((5, 3), dtype=float), np.zeros((5, 3), dtype=int))

For me this works with numpy==1.22 and fails with numpy==1.23:

Traceback (most recent call last):
  File "c:\Users\chewitt\Dev\tmp\scenepic_test.py", line 8, in <module>
    mesh.add_mesh_without_normals(np.zeros((5, 3), dtype=np.float32), np.zeros((5, 3), dtype=np.uint8))
TypeError: add_mesh_without_normals(): incompatible function arguments. The following argument types are supported:
    1. (self: scenepic._scenepic.Mesh, vertices: numpy.ndarray[numpy.float32[m, 3], flags.c_contiguous], triangles: numpy.ndarray[numpy.uint32[m, 3], flags.c_contiguous], colors: numpy.ndarray[numpy.float32[m, 3], flags.c_contiguous] = array([], shape=(0, 3), dtype=float32), uvs: numpy.ndarray[numpy.float32[m, 2], flags.c_contiguous] = array([], shape=(0, 2), dtype=float32), transform: numpy.ndarray[numpy.float32[4, 4]] = array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]], dtype=float32), reverse_triangle_order: bool = False, fill_triangles: bool = True, add_wireframe: bool = False) -> None

Invoked with: {
        "CameraSpace": false,
        "CommandType": "DefineMesh",
        "Definition":
        {
                "Color": "eAEBDADz/4eGhj6GhQU/AACAPx33A+ADAAAAAQ==",
                "IndexBufferType": "UInt16",
                "LineBuffer": "eAEDAAAAAAEAAAAAAg==",
                "PrimitiveType": "SingleColorMesh",
                "TriangleBuffer": "eAEDAAAAAAEAAAAAAw==",
                "VertexBuffer": "eAEDAAAAAAEAAAAABg=="
        },
        "DoubleSided": false,
        "IsBillboard": false,
        "IsLabel": false,
        "LayerId": null,
        "MeshId": "jelly_base"
}
, array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]], dtype=float32), array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]], dtype=uint8)

@matajoh - any ideas on this, currently breaking a lot of our CI :(

@tjcashman
Copy link
Member

tjcashman commented Jun 30, 2022

I think this is the root issue: pybind/pybind11#4038 (and hence will be fixed by the next pybind11 release, or by pulling pybind11 from source at commit 479e9a5 or later).

I verified that Charlie's repro leads to an array with zero-size dimensions in pybind11, which leads to EigenConformable::stride_compatible returning false for earlier versions of pybind11.

@tjcashman
Copy link
Member

I tried making the update to pybind11 in #35 , which is waiting on a review.

@friggog
Copy link

friggog commented Jul 1, 2022

Local test confirmed that @tjcashman's fix works so this issue can be closed 😄

@matajoh
Copy link
Member

matajoh commented Jul 6, 2022

Closing this issue as resolved, thanks for the help everyone!

@matajoh matajoh closed this as completed Jul 6, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants