Re: Is Sunflow limited in Sweet Home 3D?

by enkonyito » Wed Apr 25, 2018 9:29 pm

Emmanuel, how can we retrieve the coordinates of the vertices of a plane object so that its rotations are taken into account as light?

My attempt is not very conclusive.

I transformed this plane object

Code: Select all

g Plane_1_1_1
usemtl None
v 0.0 100.0 -0.05
v 100.0 100.0 -0.05
v 100.0 250.0 -0.05
v 0.0 250.0 -0.05
vn 0.0 0.0 1.0
f 1//1 2//1 3//1
f 1//1 3//1 4//1
in light,

Code: Select all

id#1=Meshlight#Vertical
name#1=Vertical shape sh3d
category#1=Light sources 2
icon#1=/Vertical shape sh3d.png
model#1=/vertical_shape_sh3d.obj
width#1=100
depth#1=0.1
height#1=150
movable#1=true
doorOrWindow#1=false
## Mandatory for light source
lightSourceX#1=50
lightSourceY#1=0
lightSourceZ#1=75
lightSourceColor#1=#919189
## Optional for light source
##lightSourceDiameter#1=
elevation#1=100
modelSize#1=325
creator#1=Enko Nyito
which gives in the Home.xml file.

Code: Select all

<light catalogId='Meshlight#Vertical' name='Vertical shape sh3d' creator='Enko Nyito' model='1' icon='0' x='50.0' y='-0.05' elevation='100.0' width='100.0' depth='0.1' height='150.0' modelSize='325' power='0.1'>
   <lightSource x='0.5' y='0.0' z='0.5' color='00919189'/>
</light>
I notice that the position of the light source is not the same.

By implementing the TriangleMeshLight type,

Code: Select all

...
int samples = 4;
int np = 4;
int nt = 2;
power = power / 100;
this.sunflow.parameter("radiance", null,
    power * (lightColor >> 16) * (this.homeLightColor >> 16),
    power * ((lightColor >> 8) & 0xFF) * ((this.homeLightColor >> 8) & 0xFF),
    power * (lightColor & 0xFF) * (this.homeLightColor & 0xFF));
this.sunflow.parameter("samples", samples);
this.sunflow.parameter("points", "point", "vertex", parseFloatArray(np * 3, light, lightSourceLocation));
this.sunflow.parameter("triangles", parseIntArray(nt * 3));
this.sunflow.light(UUID.randomUUID().toString(), "triangle_mesh");
...

private int[] parseIntArray(int size) {
    int[] data = {0, 1, 2,
        0, 2, 3};
    return data;
}

private float[] parseFloatArray(int size, HomeLight light, Point3f lightSourceLocation) {
    float[] data = {lightSourceLocation.getX() - light.getWidthInPlan()/2, lightSourceLocation.getY() - light.getHeightInPlan()/2, lightSourceLocation.getZ() - light.getDepthInPlan()/2,
        lightSourceLocation.getX() + light.getWidthInPlan()/2, lightSourceLocation.getY() - light.getHeightInPlan()/2, lightSourceLocation.getZ() - light.getDepthInPlan()/2,
        lightSourceLocation.getX() + light.getWidthInPlan()/2, lightSourceLocation.getY() + light.getHeightInPlan()/2, lightSourceLocation.getZ() + light.getDepthInPlan()/2,
        lightSourceLocation.getX() - light.getWidthInPlan()/2, lightSourceLocation.getY() + light.getHeightInPlan()/2, lightSourceLocation.getZ() + light.getDepthInPlan()/2};
    return data;
}
I get those results.
Image
Image Image Image

The TriangleMeshLightWithNoRepresentation class

Code: Select all

public static class TriangleMeshLightWithNoRepresentation extends TriangleMeshLight {
    public Instance createInstance() {
        return null;
    }
}
does not allow to have a wire 3D shape like the SphereLight type.

For comparison, the same light panel with the type
Image Image