-
Notifications
You must be signed in to change notification settings - Fork 185
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #960 from m-agour/adding-arrow-actor
NF: shaders and materials modifiable & added smooth/flat shading
- Loading branch information
Showing
7 changed files
with
768 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
from pygfx.renderers.wgpu.shaders.meshshader import MeshShader | ||
|
||
from fury.io import load_wgsl | ||
|
||
|
||
class MeshBasicShader(MeshShader): | ||
"""Base class for mesh shaders.""" | ||
|
||
def __init__(self, wobject): | ||
super().__init__(wobject) | ||
|
||
def get_code(self): | ||
return load_wgsl("mesh.wgsl") | ||
|
||
|
||
class MeshPhongShader(MeshBasicShader): | ||
"""Phong shader for meshes.""" | ||
|
||
def __init__(self, wobject): | ||
super().__init__(wobject) | ||
|
||
self["lighting"] = "phong" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,35 +1,78 @@ | ||
from fury import material | ||
import numpy as np | ||
|
||
from fury import material, window | ||
from fury.geometry import buffer_to_geometry, create_mesh | ||
from fury.material import _create_mesh_material | ||
from fury.primitive import prim_sphere | ||
|
||
|
||
def test_create_mesh_material(): | ||
color = (1, 0, 0) | ||
mat = material._create_mesh_material( | ||
material="phong", color=color, opacity=0.5, mode="auto" | ||
) | ||
assert type(mat) == material.gfx.MeshPhongMaterial | ||
assert isinstance(mat, material.MeshPhongMaterial) | ||
assert mat.color == color + (0.5,) | ||
assert mat.color_mode == "auto" | ||
|
||
color = (1, 0, 0, 0.5) | ||
mat = material._create_mesh_material( | ||
material="phong", color=color, opacity=0.5, mode="auto" | ||
material="phong", color=color, opacity=0.5, mode="auto", flat_shading=False | ||
) | ||
assert type(mat) == material.gfx.MeshPhongMaterial | ||
assert isinstance(mat, material.MeshPhongMaterial) | ||
assert mat.color == (1, 0, 0, 0.25) | ||
assert mat.color_mode == "auto" | ||
assert mat.flat_shading is False | ||
|
||
color = (1, 0, 0) | ||
mat = material._create_mesh_material( | ||
material="phong", color=color, opacity=0.5, mode="vertex" | ||
) | ||
assert type(mat) == material.gfx.MeshPhongMaterial | ||
assert isinstance(mat, material.MeshPhongMaterial) | ||
assert mat.color == (1, 1, 1) | ||
assert mat.color_mode == "vertex" | ||
|
||
color = (1, 0, 0) | ||
mat = material._create_mesh_material( | ||
material="basic", color=color, mode="vertex", enable_picking=False | ||
material="basic", | ||
color=color, | ||
mode="vertex", | ||
enable_picking=False, | ||
flat_shading=True, | ||
) | ||
assert type(mat) == material.gfx.MeshBasicMaterial | ||
assert isinstance(mat, material.MeshBasicMaterial) | ||
assert mat.color == (1, 1, 1) | ||
assert mat.color_mode == "vertex" | ||
assert mat.flat_shading is True | ||
|
||
verts, faces = prim_sphere() | ||
|
||
geo = buffer_to_geometry( | ||
indices=faces.astype("int32"), | ||
positions=verts.astype("float32"), | ||
texcoords=verts.astype("float32"), | ||
colors=np.ones_like(verts).astype("float32"), | ||
) | ||
|
||
mat = _create_mesh_material( | ||
material="phong", enable_picking=False, flat_shading=False | ||
) | ||
|
||
obj = create_mesh(geometry=geo, material=mat) | ||
|
||
scene = window.Scene() | ||
|
||
scene.add(obj) | ||
|
||
# window.snapshot(scene=scene, fname="mat_test_1.png") | ||
# | ||
# img = Image.open("mat_test_1.png") | ||
# img_array = np.array(img) | ||
# | ||
# mean_r, mean_g, mean_b, _ = np.mean( | ||
# img_array.reshape(-1, img_array.shape[2]), axis=0 | ||
# ) | ||
# | ||
# assert 0 <= mean_r <= 255 and 0 <= mean_g <= 255 and 0 <= mean_b <= 255 | ||
# | ||
# assert sum([mean_r, mean_g, mean_b]) > 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
import numpy as np | ||
from pygfx import Mesh | ||
from pygfx.renderers.wgpu import register_wgpu_render_function | ||
|
||
from fury.actor import sphere | ||
from fury.io import load_wgsl | ||
from fury.material import MeshBasicMaterial | ||
from fury.shader import MeshBasicShader, MeshPhongShader | ||
|
||
|
||
def test_shader(): | ||
class CustomBasicMaterial(MeshBasicMaterial): | ||
def __init__(self, **kwargs): | ||
super().__init__(**kwargs) | ||
|
||
class CustomPhongMaterial(MeshBasicMaterial): | ||
def __init__(self, **kwargs): | ||
super().__init__(**kwargs) | ||
|
||
register_wgpu_render_function(Mesh, CustomBasicMaterial)(MeshBasicShader) | ||
register_wgpu_render_function(Mesh, CustomPhongMaterial)(MeshPhongShader) | ||
|
||
try: | ||
register_wgpu_render_function(Mesh, CustomBasicMaterial)(MeshBasicShader) | ||
register_wgpu_render_function(Mesh, CustomPhongMaterial)(MeshPhongShader) | ||
except ValueError: | ||
... | ||
else: | ||
raise AssertionError("Shouldn't be able to register the same material twice.") | ||
|
||
|
||
def test_wgsl(): | ||
shader_code = load_wgsl("mesh.wgsl") | ||
|
||
assert isinstance(shader_code, str) | ||
assert "fn vs_main" in shader_code | ||
assert "fn fs_main" in shader_code | ||
|
||
actor = sphere(centers=np.array([[0, 0, 0]]), colors=np.array([[1, 0, 0]])) | ||
kwargs = { | ||
"blending_code": "placeholder", | ||
"write_pick": True, | ||
"indexer": None, | ||
"used_uv": {"uv": None}, | ||
} | ||
|
||
cs = MeshBasicShader(actor) | ||
|
||
assert isinstance(cs.get_code(), str) | ||
|
||
gen_sh_code = cs.generate_wgsl(**kwargs) | ||
assert isinstance(gen_sh_code, str) | ||
|
||
assert "placeholder" in gen_sh_code |
Oops, something went wrong.