Introduction
Introduction Statistics Contact Development Disclaimer Help
tadded optional lower cutoff for particles rendered with a colorbar - sphere - …
git clone git://src.adamsgaard.dk/sphere
Log
Files
Refs
LICENSE
---
commit fa965228a4037d63d6dba70c89b922a1d6b054d1
parent 45188dc7dbc00a30c9eeab280bbd087f055c5360
Author: Anders Damsgaard <[email protected]>
Date: Fri, 4 Jan 2013 13:14:46 +0100
added optional lower cutoff for particles rendered with a colorbar
Diffstat:
M src/main.cpp | 19 +++++++++++++++----
M src/raytracer.cuh | 65 ++++++++++++++++++++++++-----…
M src/sphere.h | 5 +++--
3 files changed, 69 insertions(+), 20 deletions(-)
---
diff --git a/src/main.cpp b/src/main.cpp
t@@ -33,7 +33,8 @@ int main(const int argc, const char *argv[])
int render = 0; // whether to render an image
int method = 0; // visualization method
int nfiles = 0; // number of input files
- float max_val = 0.0f;
+ float max_val = 0.0f; // max value of colorbar
+ float lower_cutoff = 0.0f; // lower cutoff, particles below will not be r…
// Process input parameters
int i;
t@@ -52,9 +53,12 @@ int main(const int argc, const char *argv[])
<< "-r, --render\t\trender input files instead of simulating t…
<< "-dc, --dont-check\tdon't check values before running\n"
<< "\nRaytracer (-r) specific options:\n"
- << "-m <method> <maxval>, --method <method> <maxval>\n\tcolor …
+ << "-m <method> <maxval> [-l <lower cutoff val>], or\n"
+ << "--method <method> <maxval> [-l <lower cutoff val>]\n"
+ << "\tcolor visualization method, possible values:\n"
<< "\tnormal, pres, vel, angvel, xdisp, angpos\n"
<< "\t'normal' is the default mode\n"
+ << "\tif -l is appended, don't render particles with value bel…
<< std::endl;
return 0; // Exit with success
}
t@@ -114,7 +118,14 @@ int main(const int argc, const char *argv[])
// Read max. value of colorbar as next argument
if (method != 0) {
max_val = atof(argv[i+2]);
- i += 2; // skip ahead
+
+ // Check if a lower cutoff value was specified
+ if (std::string(argv[i+3]) == "-l") {
+ lower_cutoff = atof(argv[i+4]);
+ i += 4; // skip ahead
+ } else {
+ i += 2; // skip ahead
+ }
} else {
i += 1;
}
t@@ -133,7 +144,7 @@ int main(const int argc, const char *argv[])
// Render image if requested
if (render == 1)
- dem.render(method, max_val);
+ dem.render(method, max_val, lower_cutoff);
// Otherwise, start iterating through time
else
diff --git a/src/raytracer.cuh b/src/raytracer.cuh
t@@ -143,6 +143,7 @@ __global__ void rayIntersectSpheresColormap(float4* dev_ra…
Float4* dev_vel,
Float* dev_linarr,
float max_val,
+ float lower_cutoff,
unsigned char* dev_img)
{
// Compute pixel position from threadIdx/blockIdx
t@@ -168,6 +169,8 @@ __global__ void rayIntersectSpheresColormap(float4* dev_ra…
// Iterate through all particles
for (unsigned int i=0; i<devC_np; ++i) {
+ __syncthreads();
+
// Read sphere coordinate and radius
Float4 x = dev_x[i];
float3 c = make_float3(x.x, x.y, x.z);
t@@ -178,32 +181,65 @@ __global__ void rayIntersectSpheresColormap(float4* dev_…
- 4.0f*dot(d,d) // -4*A
* (dot((e-c),(e-c)) - R*R); // C
+
+
// If the determinant is positive, there are two solutions
// One where the line enters the sphere, and one where it exits
- if (Delta > 0.0f) {
+ if (lower_cutoff > 0.0) {
- // Calculate roots, Shirley 2009 p. 77
- float t_minus = ((dot(-d,(e-c)) - sqrt( dot(d,(e-c))*dot(d,(e-c)) …
- * (dot((e-c),(e-c)) - R*R) ) ) / dot(d,d));
+ // value on colorbar
+ float val = dev_linarr[i];
- // Check wether intersection is closer than previous values
- if (fabs(t_minus) < tdist) {
- p = e + t_minus*d;
- tdist = fabs(t_minus);
- n = normalize(2.0f * (p - c)); // Surface normal
- hitidx = i;
- }
+ // particle is fixed if value > 0
+ float fixvel = dev_vel[i].w;
- } // End of solution branch
+ // only render particles which are above the lower cutoff
+ // and which are not fixed at a velocity
+ if (Delta > 0.0f && val > lower_cutoff && fixvel == 0.f) {
+
+ // Calculate roots, Shirley 2009 p. 77
+ float t_minus = ((dot(-d,(e-c)) - sqrt( dot(d,(e-c))*dot(d,(e-…
+ * (dot((e-c),(e-c)) - R*R) ) ) / dot(d,d));
+
+ // Check wether intersection is closer than previous values
+ if (fabs(t_minus) < tdist) {
+ p = e + t_minus*d;
+ tdist = fabs(t_minus);
+ n = normalize(2.0f * (p - c)); // Surface normal
+ hitidx = i;
+ }
+
+ } // End of solution branch
+
+ } else {
+
+ // render particle if it intersects with the ray
+ if (Delta > 0.0f) {
+
+ // Calculate roots, Shirley 2009 p. 77
+ float t_minus = ((dot(-d,(e-c)) - sqrt( dot(d,(e-c))*dot(d,(e-…
+ * (dot((e-c),(e-c)) - R*R) ) ) / dot(d,d));
+
+ // Check wether intersection is closer than previous values
+ if (fabs(t_minus) < tdist) {
+ p = e + t_minus*d;
+ tdist = fabs(t_minus);
+ n = normalize(2.0f * (p - c)); // Surface normal
+ hitidx = i;
+ }
+
+ } // End of solution branch
+ }
} // End of particle loop
// Write pixel color
if (tdist < 1e10) {
+ __syncthreads();
// Fetch particle data used for color
- float ratio = dev_linarr[hitidx] / max_val;
float fixvel = dev_vel[hitidx].w;
+ float ratio = dev_linarr[hitidx] / max_val;
// Make sure the ratio doesn't exceed the 0.0-1.0 interval
if (ratio < 0.01f)
t@@ -362,6 +398,7 @@ __host__ float3 DEM::maxPos()
__host__ void DEM::render(
const int method,
const float maxval,
+ const float lower_cutoff,
const float focalLength,
const unsigned int img_width,
const unsigned int img_height)
t@@ -504,7 +541,7 @@ __host__ void DEM::render(
rayIntersectSpheresColormap<<< blocksPerGrid, threadsPerBlock >>>(
dev_ray_origo, dev_ray_direction,
dev_x, dev_vel,
- dev_linarr, maxval,
+ dev_linarr, maxval, lower_cutoff,
dev_img);
}
diff --git a/src/sphere.h b/src/sphere.h
t@@ -165,8 +165,9 @@ class DEM {
// Render particles using raytracing
void render(
const int method = 1,
- const float maxval = 1.0e3,
- const float focalLength = 1.0,
+ const float maxval = 1.0e3f,
+ const float lower_cutoff = 0.0f,
+ const float focalLength = 1.0f,
const unsigned int img_width = 800,
const unsigned int img_height = 800);
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.