Fix #30966: cycles nan mesh vertices got set to (0, 0, 0), now remove them instead.
This commit is contained in:
@@ -724,7 +724,7 @@ static void xml_read_patch(const XMLReadState& state, pugi::xml_node node)
|
|||||||
LinearQuadPatch *bpatch = new LinearQuadPatch();
|
LinearQuadPatch *bpatch = new LinearQuadPatch();
|
||||||
|
|
||||||
for(int i = 0; i < 4; i++)
|
for(int i = 0; i < 4; i++)
|
||||||
P[i] = transform(&state.tfm, P[i]);
|
P[i] = transform_point(&state.tfm, P[i]);
|
||||||
memcpy(bpatch->hull, &P[0], sizeof(bpatch->hull));
|
memcpy(bpatch->hull, &P[0], sizeof(bpatch->hull));
|
||||||
|
|
||||||
patch = bpatch;
|
patch = bpatch;
|
||||||
@@ -738,7 +738,7 @@ static void xml_read_patch(const XMLReadState& state, pugi::xml_node node)
|
|||||||
BicubicPatch *bpatch = new BicubicPatch();
|
BicubicPatch *bpatch = new BicubicPatch();
|
||||||
|
|
||||||
for(int i = 0; i < 16; i++)
|
for(int i = 0; i < 16; i++)
|
||||||
P[i] = transform(&state.tfm, P[i]);
|
P[i] = transform_point(&state.tfm, P[i]);
|
||||||
memcpy(bpatch->hull, &P[0], sizeof(bpatch->hull));
|
memcpy(bpatch->hull, &P[0], sizeof(bpatch->hull));
|
||||||
|
|
||||||
patch = bpatch;
|
patch = bpatch;
|
||||||
@@ -777,7 +777,7 @@ static void xml_read_light(const XMLReadState& state, pugi::xml_node node)
|
|||||||
Light *light = new Light();
|
Light *light = new Light();
|
||||||
light->shader = state.shader;
|
light->shader = state.shader;
|
||||||
xml_read_float3(&light->co, node, "P");
|
xml_read_float3(&light->co, node, "P");
|
||||||
light->co = transform(&state.tfm, light->co);
|
light->co = transform_point(&state.tfm, light->co);
|
||||||
|
|
||||||
state.scene->lights.push_back(light);
|
state.scene->lights.push_back(light);
|
||||||
}
|
}
|
||||||
|
@@ -59,7 +59,7 @@ __device_inline void bvh_instance_push(KernelGlobals *kg, int object, const Ray
|
|||||||
{
|
{
|
||||||
Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
|
Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
|
||||||
|
|
||||||
*P = transform(&tfm, ray->P);
|
*P = transform_point(&tfm, ray->P);
|
||||||
|
|
||||||
float3 dir = transform_direction(&tfm, ray->D);
|
float3 dir = transform_direction(&tfm, ray->D);
|
||||||
|
|
||||||
@@ -351,7 +351,7 @@ __device_inline float3 bvh_triangle_refine(KernelGlobals *kg, const Intersection
|
|||||||
if(isect->object != ~0) {
|
if(isect->object != ~0) {
|
||||||
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_INVERSE_TRANSFORM);
|
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_INVERSE_TRANSFORM);
|
||||||
|
|
||||||
P = transform(&tfm, P);
|
P = transform_point(&tfm, P);
|
||||||
D = transform_direction(&tfm, D*t);
|
D = transform_direction(&tfm, D*t);
|
||||||
D = normalize_len(D, &t);
|
D = normalize_len(D, &t);
|
||||||
}
|
}
|
||||||
@@ -367,7 +367,7 @@ __device_inline float3 bvh_triangle_refine(KernelGlobals *kg, const Intersection
|
|||||||
|
|
||||||
if(isect->object != ~0) {
|
if(isect->object != ~0) {
|
||||||
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_TRANSFORM);
|
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_TRANSFORM);
|
||||||
P = transform(&tfm, P);
|
P = transform_point(&tfm, P);
|
||||||
}
|
}
|
||||||
|
|
||||||
return P;
|
return P;
|
||||||
|
@@ -39,7 +39,7 @@ __device void camera_sample_perspective(KernelGlobals *kg, float raster_x, float
|
|||||||
{
|
{
|
||||||
/* create ray form raster position */
|
/* create ray form raster position */
|
||||||
Transform rastertocamera = kernel_data.cam.rastertocamera;
|
Transform rastertocamera = kernel_data.cam.rastertocamera;
|
||||||
float3 Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
|
float3 Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
|
||||||
|
|
||||||
ray->P = make_float3(0.0f, 0.0f, 0.0f);
|
ray->P = make_float3(0.0f, 0.0f, 0.0f);
|
||||||
ray->D = Pcamera;
|
ray->D = Pcamera;
|
||||||
@@ -63,7 +63,7 @@ __device void camera_sample_perspective(KernelGlobals *kg, float raster_x, float
|
|||||||
/* transform ray from camera to world */
|
/* transform ray from camera to world */
|
||||||
Transform cameratoworld = kernel_data.cam.cameratoworld;
|
Transform cameratoworld = kernel_data.cam.cameratoworld;
|
||||||
|
|
||||||
ray->P = transform(&cameratoworld, ray->P);
|
ray->P = transform_point(&cameratoworld, ray->P);
|
||||||
ray->D = transform_direction(&cameratoworld, ray->D);
|
ray->D = transform_direction(&cameratoworld, ray->D);
|
||||||
ray->D = normalize(ray->D);
|
ray->D = normalize(ray->D);
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ __device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, floa
|
|||||||
{
|
{
|
||||||
/* create ray form raster position */
|
/* create ray form raster position */
|
||||||
Transform rastertocamera = kernel_data.cam.rastertocamera;
|
Transform rastertocamera = kernel_data.cam.rastertocamera;
|
||||||
float3 Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
|
float3 Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
|
||||||
|
|
||||||
ray->P = Pcamera;
|
ray->P = Pcamera;
|
||||||
ray->D = make_float3(0.0f, 0.0f, 1.0f);
|
ray->D = make_float3(0.0f, 0.0f, 1.0f);
|
||||||
@@ -101,7 +101,7 @@ __device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, floa
|
|||||||
/* transform ray from camera to world */
|
/* transform ray from camera to world */
|
||||||
Transform cameratoworld = kernel_data.cam.cameratoworld;
|
Transform cameratoworld = kernel_data.cam.cameratoworld;
|
||||||
|
|
||||||
ray->P = transform(&cameratoworld, ray->P);
|
ray->P = transform_point(&cameratoworld, ray->P);
|
||||||
ray->D = transform_direction(&cameratoworld, ray->D);
|
ray->D = transform_direction(&cameratoworld, ray->D);
|
||||||
ray->D = normalize(ray->D);
|
ray->D = normalize(ray->D);
|
||||||
|
|
||||||
@@ -127,7 +127,7 @@ __device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, floa
|
|||||||
__device void camera_sample_environment(KernelGlobals *kg, float raster_x, float raster_y, Ray *ray)
|
__device void camera_sample_environment(KernelGlobals *kg, float raster_x, float raster_y, Ray *ray)
|
||||||
{
|
{
|
||||||
Transform rastertocamera = kernel_data.cam.rastertocamera;
|
Transform rastertocamera = kernel_data.cam.rastertocamera;
|
||||||
float3 Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
|
float3 Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
|
||||||
|
|
||||||
/* create ray form raster position */
|
/* create ray form raster position */
|
||||||
ray->P = make_float3(0.0, 0.0f, 0.0f);
|
ray->P = make_float3(0.0, 0.0f, 0.0f);
|
||||||
@@ -136,7 +136,7 @@ __device void camera_sample_environment(KernelGlobals *kg, float raster_x, float
|
|||||||
/* transform ray from camera to world */
|
/* transform ray from camera to world */
|
||||||
Transform cameratoworld = kernel_data.cam.cameratoworld;
|
Transform cameratoworld = kernel_data.cam.cameratoworld;
|
||||||
|
|
||||||
ray->P = transform(&cameratoworld, ray->P);
|
ray->P = transform_point(&cameratoworld, ray->P);
|
||||||
ray->D = transform_direction(&cameratoworld, ray->D);
|
ray->D = transform_direction(&cameratoworld, ray->D);
|
||||||
ray->D = normalize(ray->D);
|
ray->D = normalize(ray->D);
|
||||||
|
|
||||||
@@ -145,10 +145,10 @@ __device void camera_sample_environment(KernelGlobals *kg, float raster_x, float
|
|||||||
ray->dP.dx = make_float3(0.0f, 0.0f, 0.0f);
|
ray->dP.dx = make_float3(0.0f, 0.0f, 0.0f);
|
||||||
ray->dP.dy = make_float3(0.0f, 0.0f, 0.0f);
|
ray->dP.dy = make_float3(0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
Pcamera = transform(&rastertocamera, make_float3(raster_x + 1.0f, raster_y, 0.0f));
|
Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x + 1.0f, raster_y, 0.0f));
|
||||||
ray->dD.dx = normalize(transform_direction(&cameratoworld, equirectangular_to_direction(Pcamera.x, Pcamera.y))) - ray->D;
|
ray->dD.dx = normalize(transform_direction(&cameratoworld, equirectangular_to_direction(Pcamera.x, Pcamera.y))) - ray->D;
|
||||||
|
|
||||||
Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y + 1.0f, 0.0f));
|
Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y + 1.0f, 0.0f));
|
||||||
ray->dD.dy = normalize(transform_direction(&cameratoworld, equirectangular_to_direction(Pcamera.x, Pcamera.y))) - ray->D;
|
ray->dD.dy = normalize(transform_direction(&cameratoworld, equirectangular_to_direction(Pcamera.x, Pcamera.y))) - ray->D;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -61,7 +61,7 @@ __device void mbvh_instance_push(KernelGlobals *kg, int object, MBVHRay *ray)
|
|||||||
{
|
{
|
||||||
Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
|
Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
|
||||||
|
|
||||||
ray->P = transform(&tfm, ray->origP);
|
ray->P = transform_point(&tfm, ray->origP);
|
||||||
|
|
||||||
float3 dir = ray->origD;
|
float3 dir = ray->origD;
|
||||||
|
|
||||||
|
@@ -42,7 +42,7 @@ __device_inline Transform object_fetch_transform(KernelGlobals *kg, int object,
|
|||||||
__device_inline void object_position_transform(KernelGlobals *kg, int object, float3 *P)
|
__device_inline void object_position_transform(KernelGlobals *kg, int object, float3 *P)
|
||||||
{
|
{
|
||||||
Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
|
Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
|
||||||
*P = transform(&tfm, *P);
|
*P = transform_point(&tfm, *P);
|
||||||
}
|
}
|
||||||
|
|
||||||
__device_inline void object_normal_transform(KernelGlobals *kg, int object, float3 *N)
|
__device_inline void object_normal_transform(KernelGlobals *kg, int object, float3 *N)
|
||||||
|
@@ -53,7 +53,7 @@ __device_inline void kernel_write_data_passes(KernelGlobals *kg, __global float
|
|||||||
if(sample == 0) {
|
if(sample == 0) {
|
||||||
if(flag & PASS_DEPTH) {
|
if(flag & PASS_DEPTH) {
|
||||||
Transform tfm = kernel_data.cam.worldtocamera;
|
Transform tfm = kernel_data.cam.worldtocamera;
|
||||||
float depth = len(transform(&tfm, sd->P));
|
float depth = len(transform_point(&tfm, sd->P));
|
||||||
|
|
||||||
kernel_write_pass_float(buffer + kernel_data.film.pass_depth, sample, depth);
|
kernel_write_pass_float(buffer + kernel_data.film.pass_depth, sample, depth);
|
||||||
}
|
}
|
||||||
|
@@ -50,7 +50,7 @@ __device_inline void qbvh_instance_push(KernelGlobals *kg, int object, const Ray
|
|||||||
{
|
{
|
||||||
Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
|
Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
|
||||||
|
|
||||||
*P = transform(&tfm, ray->P);
|
*P = transform_point(&tfm, ray->P);
|
||||||
|
|
||||||
float3 dir = transform_direction(&tfm, ray->D);
|
float3 dir = transform_direction(&tfm, ray->D);
|
||||||
|
|
||||||
@@ -384,7 +384,7 @@ __device_inline float3 bvh_triangle_refine(KernelGlobals *kg, const Intersection
|
|||||||
if(isect->object != ~0) {
|
if(isect->object != ~0) {
|
||||||
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_INVERSE_TRANSFORM);
|
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_INVERSE_TRANSFORM);
|
||||||
|
|
||||||
P = transform(&tfm, P);
|
P = transform_point(&tfm, P);
|
||||||
D = transform_direction(&tfm, D*t);
|
D = transform_direction(&tfm, D*t);
|
||||||
D = normalize_len(D, &t);
|
D = normalize_len(D, &t);
|
||||||
}
|
}
|
||||||
@@ -400,7 +400,7 @@ __device_inline float3 bvh_triangle_refine(KernelGlobals *kg, const Intersection
|
|||||||
|
|
||||||
if(isect->object != ~0) {
|
if(isect->object != ~0) {
|
||||||
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_TRANSFORM);
|
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_TRANSFORM);
|
||||||
P = transform(&tfm, P);
|
P = transform_point(&tfm, P);
|
||||||
}
|
}
|
||||||
|
|
||||||
return P;
|
return P;
|
||||||
|
@@ -25,7 +25,7 @@ __device void svm_node_camera(KernelGlobals *kg, ShaderData *sd, float *stack, u
|
|||||||
float3 vector;
|
float3 vector;
|
||||||
|
|
||||||
Transform tfm = kernel_data.cam.worldtocamera;
|
Transform tfm = kernel_data.cam.worldtocamera;
|
||||||
vector = transform(&tfm, sd->P);
|
vector = transform_point(&tfm, sd->P);
|
||||||
zdepth = vector.z;
|
zdepth = vector.z;
|
||||||
distance = len(vector);
|
distance = len(vector);
|
||||||
|
|
||||||
|
@@ -30,7 +30,7 @@ __device void svm_node_mapping(KernelGlobals *kg, ShaderData *sd, float *stack,
|
|||||||
tfm.z = read_node_float(kg, offset);
|
tfm.z = read_node_float(kg, offset);
|
||||||
tfm.w = read_node_float(kg, offset);
|
tfm.w = read_node_float(kg, offset);
|
||||||
|
|
||||||
float3 r = transform(&tfm, v);
|
float3 r = transform_point(&tfm, v);
|
||||||
stack_store_float3(stack, out_offset, r);
|
stack_store_float3(stack, out_offset, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -34,7 +34,7 @@ __device void svm_node_tex_coord(KernelGlobals *kg, ShaderData *sd, float *stack
|
|||||||
case NODE_TEXCO_OBJECT: {
|
case NODE_TEXCO_OBJECT: {
|
||||||
if(sd->object != ~0) {
|
if(sd->object != ~0) {
|
||||||
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
|
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
|
||||||
data = transform(&tfm, sd->P);
|
data = transform_point(&tfm, sd->P);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
data = sd->P;
|
data = sd->P;
|
||||||
@@ -44,18 +44,18 @@ __device void svm_node_tex_coord(KernelGlobals *kg, ShaderData *sd, float *stack
|
|||||||
Transform tfm = kernel_data.cam.worldtocamera;
|
Transform tfm = kernel_data.cam.worldtocamera;
|
||||||
|
|
||||||
if(sd->object != ~0)
|
if(sd->object != ~0)
|
||||||
data = transform(&tfm, sd->P);
|
data = transform_point(&tfm, sd->P);
|
||||||
else
|
else
|
||||||
data = transform(&tfm, sd->P + svm_background_offset(kg));
|
data = transform_point(&tfm, sd->P + svm_background_offset(kg));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NODE_TEXCO_WINDOW: {
|
case NODE_TEXCO_WINDOW: {
|
||||||
Transform tfm = kernel_data.cam.worldtondc;
|
Transform tfm = kernel_data.cam.worldtondc;
|
||||||
|
|
||||||
if(sd->object != ~0)
|
if(sd->object != ~0)
|
||||||
data = transform(&tfm, sd->P);
|
data = transform_perspective(&tfm, sd->P);
|
||||||
else
|
else
|
||||||
data = transform(&tfm, sd->P + svm_background_offset(kg));
|
data = transform_perspective(&tfm, sd->P + svm_background_offset(kg));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NODE_TEXCO_REFLECTION: {
|
case NODE_TEXCO_REFLECTION: {
|
||||||
@@ -79,7 +79,7 @@ __device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, floa
|
|||||||
case NODE_TEXCO_OBJECT: {
|
case NODE_TEXCO_OBJECT: {
|
||||||
if(sd->object != ~0) {
|
if(sd->object != ~0) {
|
||||||
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
|
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
|
||||||
data = transform(&tfm, sd->P + sd->dP.dx);
|
data = transform_point(&tfm, sd->P + sd->dP.dx);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
data = sd->P + sd->dP.dx;
|
data = sd->P + sd->dP.dx;
|
||||||
@@ -89,18 +89,18 @@ __device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, floa
|
|||||||
Transform tfm = kernel_data.cam.worldtocamera;
|
Transform tfm = kernel_data.cam.worldtocamera;
|
||||||
|
|
||||||
if(sd->object != ~0)
|
if(sd->object != ~0)
|
||||||
data = transform(&tfm, sd->P + sd->dP.dx);
|
data = transform_point(&tfm, sd->P + sd->dP.dx);
|
||||||
else
|
else
|
||||||
data = transform(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg));
|
data = transform_point(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NODE_TEXCO_WINDOW: {
|
case NODE_TEXCO_WINDOW: {
|
||||||
Transform tfm = kernel_data.cam.worldtondc;
|
Transform tfm = kernel_data.cam.worldtondc;
|
||||||
|
|
||||||
if(sd->object != ~0)
|
if(sd->object != ~0)
|
||||||
data = transform(&tfm, sd->P + sd->dP.dx);
|
data = transform_perspective(&tfm, sd->P + sd->dP.dx);
|
||||||
else
|
else
|
||||||
data = transform(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg));
|
data = transform_perspective(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NODE_TEXCO_REFLECTION: {
|
case NODE_TEXCO_REFLECTION: {
|
||||||
@@ -127,7 +127,7 @@ __device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, floa
|
|||||||
case NODE_TEXCO_OBJECT: {
|
case NODE_TEXCO_OBJECT: {
|
||||||
if(sd->object != ~0) {
|
if(sd->object != ~0) {
|
||||||
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
|
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
|
||||||
data = transform(&tfm, sd->P + sd->dP.dy);
|
data = transform_point(&tfm, sd->P + sd->dP.dy);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
data = sd->P + sd->dP.dy;
|
data = sd->P + sd->dP.dy;
|
||||||
@@ -137,18 +137,18 @@ __device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, floa
|
|||||||
Transform tfm = kernel_data.cam.worldtocamera;
|
Transform tfm = kernel_data.cam.worldtocamera;
|
||||||
|
|
||||||
if(sd->object != ~0)
|
if(sd->object != ~0)
|
||||||
data = transform(&tfm, sd->P + sd->dP.dy);
|
data = transform_point(&tfm, sd->P + sd->dP.dy);
|
||||||
else
|
else
|
||||||
data = transform(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg));
|
data = transform_point(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NODE_TEXCO_WINDOW: {
|
case NODE_TEXCO_WINDOW: {
|
||||||
Transform tfm = kernel_data.cam.worldtondc;
|
Transform tfm = kernel_data.cam.worldtondc;
|
||||||
|
|
||||||
if(sd->object != ~0)
|
if(sd->object != ~0)
|
||||||
data = transform(&tfm, sd->P + sd->dP.dy);
|
data = transform_perspective(&tfm, sd->P + sd->dP.dy);
|
||||||
else
|
else
|
||||||
data = transform(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg));
|
data = transform_perspective(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NODE_TEXCO_REFLECTION: {
|
case NODE_TEXCO_REFLECTION: {
|
||||||
|
@@ -107,10 +107,10 @@ void Camera::update()
|
|||||||
dy = transform_direction(&rastertocamera, make_float3(0, 1, 0));
|
dy = transform_direction(&rastertocamera, make_float3(0, 1, 0));
|
||||||
}
|
}
|
||||||
else if(type == CAMERA_PERSPECTIVE) {
|
else if(type == CAMERA_PERSPECTIVE) {
|
||||||
dx = transform(&rastertocamera, make_float3(1, 0, 0)) -
|
dx = transform_perspective(&rastertocamera, make_float3(1, 0, 0)) -
|
||||||
transform(&rastertocamera, make_float3(0, 0, 0));
|
transform_perspective(&rastertocamera, make_float3(0, 0, 0));
|
||||||
dy = transform(&rastertocamera, make_float3(0, 1, 0)) -
|
dy = transform_perspective(&rastertocamera, make_float3(0, 1, 0)) -
|
||||||
transform(&rastertocamera, make_float3(0, 0, 0));
|
transform_perspective(&rastertocamera, make_float3(0, 0, 0));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
dx = make_float3(0, 0, 0);
|
dx = make_float3(0, 0, 0);
|
||||||
|
@@ -213,9 +213,9 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen
|
|||||||
offset++;
|
offset++;
|
||||||
|
|
||||||
Mesh::Triangle t = mesh->triangles[i];
|
Mesh::Triangle t = mesh->triangles[i];
|
||||||
float3 p1 = transform(&tfm, mesh->verts[t.v[0]]);
|
float3 p1 = transform_point(&tfm, mesh->verts[t.v[0]]);
|
||||||
float3 p2 = transform(&tfm, mesh->verts[t.v[1]]);
|
float3 p2 = transform_point(&tfm, mesh->verts[t.v[1]]);
|
||||||
float3 p3 = transform(&tfm, mesh->verts[t.v[2]]);
|
float3 p3 = transform_point(&tfm, mesh->verts[t.v[2]]);
|
||||||
|
|
||||||
totarea += triangle_area(p1, p2, p3);
|
totarea += triangle_area(p1, p2, p3);
|
||||||
}
|
}
|
||||||
|
@@ -54,7 +54,7 @@ void Object::apply_transform()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
for(size_t i = 0; i < mesh->verts.size(); i++)
|
for(size_t i = 0; i < mesh->verts.size(); i++)
|
||||||
mesh->verts[i] = transform(&tfm, mesh->verts[i]);
|
mesh->verts[i] = transform_point(&tfm, mesh->verts[i]);
|
||||||
|
|
||||||
Attribute *attr_fN = mesh->attributes.find(Attribute::STD_FACE_NORMAL);
|
Attribute *attr_fN = mesh->attributes.find(Attribute::STD_FACE_NORMAL);
|
||||||
Attribute *attr_vN = mesh->attributes.find(Attribute::STD_VERTEX_NORMAL);
|
Attribute *attr_vN = mesh->attributes.find(Attribute::STD_VERTEX_NORMAL);
|
||||||
@@ -159,9 +159,9 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
foreach(Mesh::Triangle& t, mesh->triangles) {
|
foreach(Mesh::Triangle& t, mesh->triangles) {
|
||||||
float3 p1 = transform(&tfm, mesh->verts[t.v[0]]);
|
float3 p1 = transform_point(&tfm, mesh->verts[t.v[0]]);
|
||||||
float3 p2 = transform(&tfm, mesh->verts[t.v[1]]);
|
float3 p2 = transform_point(&tfm, mesh->verts[t.v[1]]);
|
||||||
float3 p3 = transform(&tfm, mesh->verts[t.v[2]]);
|
float3 p3 = transform_point(&tfm, mesh->verts[t.v[2]]);
|
||||||
|
|
||||||
surface_area += triangle_area(p1, p2, p3);
|
surface_area += triangle_area(p1, p2, p3);
|
||||||
}
|
}
|
||||||
|
@@ -141,7 +141,7 @@ float3 QuadDice::eval_projected(SubPatch& sub, float u, float v)
|
|||||||
|
|
||||||
sub.patch->eval(&P, NULL, NULL, uv.x, uv.y);
|
sub.patch->eval(&P, NULL, NULL, uv.x, uv.y);
|
||||||
if(camera)
|
if(camera)
|
||||||
P = transform(&camera->worldtoraster, P);
|
P = transform_perspective(&camera->worldtoraster, P);
|
||||||
|
|
||||||
return P;
|
return P;
|
||||||
}
|
}
|
||||||
|
@@ -57,7 +57,7 @@ float3 DiagSplit::project(Patch *patch, float2 uv)
|
|||||||
|
|
||||||
patch->eval(&P, NULL, NULL, uv.x, uv.y);
|
patch->eval(&P, NULL, NULL, uv.x, uv.y);
|
||||||
if(camera)
|
if(camera)
|
||||||
P = transform(&camera->worldtoraster, P);
|
P = transform_perspective(&camera->worldtoraster, P);
|
||||||
|
|
||||||
return P;
|
return P;
|
||||||
}
|
}
|
||||||
|
@@ -76,8 +76,8 @@ public:
|
|||||||
bool valid(void) const
|
bool valid(void) const
|
||||||
{
|
{
|
||||||
return (min.x <= max.x) && (min.y <= max.y) && (min.z <= max.z) &&
|
return (min.x <= max.x) && (min.y <= max.y) && (min.z <= max.z) &&
|
||||||
!(isnan(min.x) || isnan(min.y) || isnan(min.z)) &&
|
(isfinite(min.x) && isfinite(min.y) && isfinite(min.z)) &&
|
||||||
!(isnan(max.x) || isnan(max.y) || isnan(max.z));
|
(isfinite(max.x) && isfinite(max.y) && isfinite(max.z));
|
||||||
}
|
}
|
||||||
|
|
||||||
BoundBox transformed(const Transform *tfm)
|
BoundBox transformed(const Transform *tfm)
|
||||||
@@ -91,7 +91,7 @@ public:
|
|||||||
p.y = (i & 2)? min.y: max.y;
|
p.y = (i & 2)? min.y: max.y;
|
||||||
p.z = (i & 4)? min.z: max.z;
|
p.z = (i & 4)? min.z: max.z;
|
||||||
|
|
||||||
result.grow(transform(tfm, p));
|
result.grow(transform_point(tfm, p));
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@@ -37,7 +37,7 @@ typedef struct Transform {
|
|||||||
#endif
|
#endif
|
||||||
} Transform;
|
} Transform;
|
||||||
|
|
||||||
__device_inline float3 transform(const Transform *t, const float3 a)
|
__device_inline float3 transform_perspective(const Transform *t, const float3 a)
|
||||||
{
|
{
|
||||||
float4 b = make_float4(a.x, a.y, a.z, 1.0f);
|
float4 b = make_float4(a.x, a.y, a.z, 1.0f);
|
||||||
float3 c = make_float3(dot(t->x, b), dot(t->y, b), dot(t->z, b));
|
float3 c = make_float3(dot(t->x, b), dot(t->y, b), dot(t->z, b));
|
||||||
@@ -46,6 +46,14 @@ __device_inline float3 transform(const Transform *t, const float3 a)
|
|||||||
return (w != 0.0f)? c/w: make_float3(0.0f, 0.0f, 0.0f);
|
return (w != 0.0f)? c/w: make_float3(0.0f, 0.0f, 0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__device_inline float3 transform_point(const Transform *t, const float3 a)
|
||||||
|
{
|
||||||
|
float4 b = make_float4(a.x, a.y, a.z, 1.0f);
|
||||||
|
float3 c = make_float3(dot(t->x, b), dot(t->y, b), dot(t->z, b));
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
__device_inline float3 transform_direction(const Transform *t, const float3 a)
|
__device_inline float3 transform_direction(const Transform *t, const float3 a)
|
||||||
{
|
{
|
||||||
float4 b = make_float4(a.x, a.y, a.z, 0.0f);
|
float4 b = make_float4(a.x, a.y, a.z, 0.0f);
|
||||||
|
Reference in New Issue
Block a user