ifcpixeltexture tests to reflect actual order of data

This commit is contained in:
Andrej730
2023-12-25 16:21:48 +05:00
parent 5cae82cded
commit 0980075c88
+59 -39
View File
@@ -258,37 +258,71 @@ class TestCreatingStyles(NewFile):
def test_create_surface_style_with_textures_from_ifc_pixel_image(self): def test_create_surface_style_with_textures_from_ifc_pixel_image(self):
# fmt: off # fmt: off
pixel_data_for_components = { # blender has reversed pixels rows order
# 2x2 image:
# R G
# B W
ifc_pixel_data = {
1: ( 1: (
0.5, 0.5, 0.5, 1.0, 0.7,
0.6, 0.6, 0.6, 1.0, 1.0,
0.7, 0.7, 0.7, 1.0, 0.5,
1.0, 1.0, 1.0, 1.0, 0.6,
), ),
2: ( 2: (
0.5, 0.5, 0.5, 0.5, 0.7, 0.5,
0.6, 0.6, 0.6, 0.5, 1.0, 0.5,
0.7, 0.7, 0.7, 0.5, 0.5, 0.5,
1.0, 1.0, 1.0, 0.5, 0.6, 0.5
), ),
3: ( 3: (
0.5, 0, 0, 1.0, 0, 0, 0.7,
0, 0.6, 0, 1.0, 1, 1, 1,
0, 0, 0.7, 1.0, 0.5, 0, 0,
1, 1, 1, 1.0, 0, 0.6, 0,
), ),
4: ( 4: (
0.5, 0, 0, 0.5,
0, 0.6, 0, 0.5,
0, 0, 0.7, 0.5, 0, 0, 0.7, 0.5,
1, 1, 1, 0.5, 1, 1, 1, 0.5,
0.5, 0, 0, 0.5,
0, 0.6, 0, 0.5,
)
}
expected_pixel_data = {
1: (
0.7, 0.7, 0.7, 1.0,
1.0, 1.0, 1.0, 1.0,
0.5, 0.5, 0.5, 1.0,
0.6, 0.6, 0.6, 1.0,
),
2: (
0.7, 0.7, 0.7, 0.5,
1.0, 1.0, 1.0, 0.5,
0.5, 0.5, 0.5, 0.5,
0.6, 0.6, 0.6, 0.5,
),
3: (
0, 0, 0.7, 1.0,
1, 1, 1, 1.0,
0.5, 0, 0, 1.0,
0, 0.6, 0, 1.0,
),
4: (
0, 0, 0.7, 0.5,
1, 1, 1, 0.5,
0.5, 0, 0, 0.5,
0, 0.6, 0, 0.5,
) )
} }
# fmt: on # fmt: on
for i in range(1, 5): for i in range(1, 5):
self.run_test_create_surface_style_with_textures_from_ifc_pixel_image(i, pixel_data_for_components[i]) self.run_test_create_surface_style_with_textures_from_ifc_pixel_image(
i, ifc_pixel_data[i], expected_pixel_data[i]
)
def run_test_create_surface_style_with_textures_from_ifc_pixel_image(self, n_components, pixel_data): def run_test_create_surface_style_with_textures_from_ifc_pixel_image(
self, n_components, ifc_pixel_data, expected_pixel_data
):
# this case occurs when we edit shader properties without saving them to IFC # this case occurs when we edit shader properties without saving them to IFC
bpy.ops.bim.create_project() bpy.ops.bim.create_project()
@@ -312,31 +346,17 @@ class TestCreatingStyles(NewFile):
attributes=rendering_attributes, attributes=rendering_attributes,
) )
def get_pixels_binary(n_components): def get_pixels_binary():
# just 4 pixels - red, green, blue, white # just 4 pixels - red, green, blue, white
# IfcPixelTexture as Blender has reversed order of pixels rows: (0,0) - bottom left of the image
# https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcPixelTexture.htm
# fmt: off # fmt: off
pixel_data = ( pixels = np.array(ifc_pixel_data) * 255
0.5, 0, 0, 0.5, pixels = pixels.reshape((4, n_components))
0, 0.6, 0, 0.5,
0, 0, 0.7, 0.5,
1, 1, 1, 0.5,
)
# fmt: on
pixels = np.array(pixel_data).reshape(-1, 4)
alpha = pixels[:, 3]
if n_components in (1, 2):
pixels = [[p[min(i, 2)]] for i, p in enumerate(pixels)]
if n_components == 2:
for i in range(4):
pixels[i].append(alpha[i])
elif n_components == 3:
pixels = pixels[:, :3]
pixels = np.array(pixels) * 255
return ["".join(["{:08b}".format(int(i)) for i in pixel]) for pixel in pixels] return ["".join(["{:08b}".format(int(i)) for i in pixel]) for pixel in pixels]
texture_data = { texture_data = {
"Pixel": get_pixels_binary(n_components), "Pixel": get_pixels_binary(),
"ColourComponents": n_components, "ColourComponents": n_components,
"Width": 2, "Width": 2,
"Height": 2, "Height": 2,
@@ -367,8 +387,8 @@ class TestCreatingStyles(NewFile):
assert image_node.inputs["Vector"].links[0].from_socket.name == "Generated" assert image_node.inputs["Vector"].links[0].from_socket.name == "Generated"
assert image_node.image.filepath == "" assert image_node.image.filepath == ""
assert np.allclose( assert np.allclose(
image_node.image.pixels[:], pixel_data, atol=0.01 image_node.image.pixels[:], expected_pixel_data, atol=0.01
), f"Failed to match pixels for {n_components}.\nBlender pixel_data: {image_node.image.pixels[:]}.\nExpected data: {pixel_data}" ), f"Failed to match pixels for {n_components}.\nBlender pixel_data: {image_node.image.pixels[:]}.\nExpected data: {expected_pixel_data}"
class TestLoadingIndexedTextureMap(NewFile): class TestLoadingIndexedTextureMap(NewFile):