added a cube shape, relaxed some of the requirements regarding uniform scales
parent
f22d130128
commit
6ef30de092
Binary file not shown.
After Width: | Height: | Size: 74 KiB |
Binary file not shown.
After Width: | Height: | Size: 138 KiB |
|
@ -15,6 +15,7 @@ add_shape(rectangle rectangle.cpp)
|
||||||
add_shape(disk disk.cpp)
|
add_shape(disk disk.cpp)
|
||||||
add_shape(sphere sphere.cpp)
|
add_shape(sphere sphere.cpp)
|
||||||
add_shape(cylinder cylinder.cpp)
|
add_shape(cylinder cylinder.cpp)
|
||||||
|
add_shape(cube cube.cpp)
|
||||||
add_shape(hair hair.h hair.cpp)
|
add_shape(hair hair.h hair.cpp)
|
||||||
add_shape(shapegroup shapegroup.h shapegroup.cpp)
|
add_shape(shapegroup shapegroup.h shapegroup.cpp)
|
||||||
add_shape(instance instance.h instance.cpp)
|
add_shape(instance instance.h instance.cpp)
|
||||||
|
|
|
@ -11,6 +11,7 @@ plugins += env.SharedLibrary('cylinder', ['cylinder.cpp'])
|
||||||
plugins += env.SharedLibrary('hair', ['hair.cpp'])
|
plugins += env.SharedLibrary('hair', ['hair.cpp'])
|
||||||
plugins += env.SharedLibrary('shapegroup', ['shapegroup.cpp'])
|
plugins += env.SharedLibrary('shapegroup', ['shapegroup.cpp'])
|
||||||
plugins += env.SharedLibrary('instance', ['instance.cpp'])
|
plugins += env.SharedLibrary('instance', ['instance.cpp'])
|
||||||
|
plugins += env.SharedLibrary('cube', ['cube.cpp'])
|
||||||
#plugins += env.SharedLibrary('deformable', ['deformable.cpp'])
|
#plugins += env.SharedLibrary('deformable', ['deformable.cpp'])
|
||||||
|
|
||||||
Export('plugins')
|
Export('plugins')
|
||||||
|
|
|
@ -0,0 +1,115 @@
|
||||||
|
/*
|
||||||
|
This file is part of Mitsuba, a physically based rendering system.
|
||||||
|
|
||||||
|
Copyright (c) 2007-2012 by Wenzel Jakob and others.
|
||||||
|
|
||||||
|
Mitsuba is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License Version 3
|
||||||
|
as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
Mitsuba is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <mitsuba/render/trimesh.h>
|
||||||
|
#include <mitsuba/core/properties.h>
|
||||||
|
|
||||||
|
MTS_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
static Float CubeData_vertexPositions[][3] = {{1, 0, 0}, {1, 0, 1}, {0, 0, 1}, {0, 0, 0}, {1, 1, 0}, {0, 1, 0}, {0, 1, 1}, {1, 1, 1}, {1, 0, 0}, {1, 1, 0}, {1, 1, 1}, {1, 0, 1}, {1, 0, 1}, {1, 1, 1}, {0, 1, 1}, {0, 0, 1}, {0, 0, 1}, {0, 1, 1}, {0, 1, 0}, {0, 0, 0}, {1, 1, 0}, {1, 0, 0}, {0, 0, 0}, {0, 1, 0}};
|
||||||
|
|
||||||
|
static Float CubeData_vertexNormals[][3] = {{0, -1, 0}, {0, -1, 0}, {0, -1, 0}, {0, -1, 0}, {0, 1, 0}, {0, 1, 0}, {0, 1, 0}, {0, 1, 0}, {1, 0, 0}, {1, 0, 0}, {1, 0, 0}, {1, 0, 0}, {0, 0, 1}, {0, 0, 1}, {0, 0, 1}, {0, 0, 1}, {-1, 0, 0}, {-1, 0, 0}, {-1, 0, 0}, {-1, 0, 0}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}};
|
||||||
|
|
||||||
|
static Float CubeData_texcoords[][2] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}};
|
||||||
|
|
||||||
|
static uint32_t CubeData_triangles[][3] = {{0, 1, 2}, {3, 0, 2}, {4, 5, 6}, {7, 4, 6}, {8, 9, 10}, {11, 8, 10}, {12, 13, 14}, {15, 12, 14}, {16, 17, 18}, {19, 16, 18}, {20, 21, 22}, {23, 20, 22}};
|
||||||
|
|
||||||
|
/*!\plugin{cube}{Cube intersection primitive}
|
||||||
|
* \order{0}
|
||||||
|
* \parameters{
|
||||||
|
* \parameter{toWorld}{\Transform\Or\Animation}{
|
||||||
|
* Specifies an optional linear object-to-world transformation.
|
||||||
|
* \default{none (i.e. object space $=$ world space)}
|
||||||
|
* }
|
||||||
|
* \parameter{flipNormals}{\Boolean}{
|
||||||
|
* Is the cube inverted, i.e. should the normal vectors
|
||||||
|
* be flipped? \default{\code{false}, i.e. the normals point outside}
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* \renderings{
|
||||||
|
* \rendering{Basic example, see \lstref{cube-basic}}
|
||||||
|
* {shape_cube_basic}
|
||||||
|
* \rendering{A textured and stretched cube with the default parameterization
|
||||||
|
* (Listing~\ref{lst:cube-example})}
|
||||||
|
* {shape_cube_parameterization}
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* This shape plugin describes a simple cube/cuboid intersection primitive. By
|
||||||
|
* default, it creates a cube between the world-space positions $(0, 0, 0)$ and $(1,1,1)$.
|
||||||
|
* However, an arbitrary linear transformation may be specified to translate, rotate, scale
|
||||||
|
* or skew it as desired. The parameterization of this shape maps every face onto the
|
||||||
|
* rectangle $[0,1]^2$ in $uv$ space.
|
||||||
|
* \vspace{5mm}
|
||||||
|
* \begin{xml}[caption={Example of a textured and stretched cube}, label=lst:cube-example]
|
||||||
|
* <shape type="cube">
|
||||||
|
* <transform name="toWorld">
|
||||||
|
* <scale z="2"/>
|
||||||
|
* </transform>
|
||||||
|
*
|
||||||
|
* <bsdf type="diffuse">
|
||||||
|
* <texture type="checkerboard" name="reflectance">
|
||||||
|
* <float name="uvscale" value="6"/>
|
||||||
|
* </texture>
|
||||||
|
* </bsdf>
|
||||||
|
* </shape>
|
||||||
|
* \end{xml}
|
||||||
|
*/
|
||||||
|
class Cube : public TriMesh {
|
||||||
|
public:
|
||||||
|
Cube(const Properties &props) : TriMesh(props) {
|
||||||
|
m_name = props.getID();
|
||||||
|
m_triangleCount = 12;
|
||||||
|
m_vertexCount = 24;
|
||||||
|
m_positions = new Point[m_vertexCount];
|
||||||
|
m_texcoords = new Point2[m_vertexCount];
|
||||||
|
m_normals = new Normal[m_vertexCount];
|
||||||
|
m_triangles = new Triangle[m_triangleCount];
|
||||||
|
|
||||||
|
Transform toWorld = props.getTransform("toWorld", Transform());
|
||||||
|
for (uint32_t i=0; i<m_vertexCount; ++i) {
|
||||||
|
Normal n;
|
||||||
|
Point p;
|
||||||
|
Point2 uv;
|
||||||
|
|
||||||
|
for (int j=0; j<3; ++j) {
|
||||||
|
p[j] = CubeData_vertexPositions[i][j];
|
||||||
|
n[j] = CubeData_vertexNormals[i][j];
|
||||||
|
}
|
||||||
|
for (int j=0; j<2; ++j)
|
||||||
|
uv[j] = CubeData_texcoords[i][j];
|
||||||
|
|
||||||
|
m_positions[i] = toWorld(p);
|
||||||
|
m_normals[i] = normalize(toWorld(n));
|
||||||
|
m_texcoords[i] = uv;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t i=0; i<m_triangleCount; ++i)
|
||||||
|
for (int j=0; j<3; ++j)
|
||||||
|
m_triangles[i].idx[j] = CubeData_triangles[i][j];
|
||||||
|
}
|
||||||
|
|
||||||
|
Cube(Stream *stream, InstanceManager *manager)
|
||||||
|
: TriMesh(stream, manager) { }
|
||||||
|
|
||||||
|
MTS_DECLARE_CLASS()
|
||||||
|
};
|
||||||
|
|
||||||
|
MTS_IMPLEMENT_CLASS_S(Cube, false, TriMesh)
|
||||||
|
MTS_EXPORT_PLUGIN(Cube, "Cube intersection primitive");
|
||||||
|
MTS_NAMESPACE_END
|
|
@ -57,7 +57,6 @@ MTS_NAMESPACE_BEGIN
|
||||||
* }
|
* }
|
||||||
* \parameter{toWorld}{\Transform\Or\Animation}{
|
* \parameter{toWorld}{\Transform\Or\Animation}{
|
||||||
* Specifies an optional linear object-to-world transformation.
|
* Specifies an optional linear object-to-world transformation.
|
||||||
* Note that non-uniform scales are not permitted!
|
|
||||||
* \default{none (i.e. object space $=$ world space)}
|
* \default{none (i.e. object space $=$ world space)}
|
||||||
* }
|
* }
|
||||||
* }
|
* }
|
||||||
|
|
|
@ -64,7 +64,6 @@ MTS_NAMESPACE_BEGIN
|
||||||
* }
|
* }
|
||||||
* \parameter{toWorld}{\Transform\Or\Animation}{
|
* \parameter{toWorld}{\Transform\Or\Animation}{
|
||||||
* Specifies an optional linear object-to-world transformation.
|
* Specifies an optional linear object-to-world transformation.
|
||||||
* Note that non-uniform scales are not permitted!
|
|
||||||
* \default{none (i.e. object space $=$ world space)}
|
* \default{none (i.e. object space $=$ world space)}
|
||||||
* }
|
* }
|
||||||
* \parameter{srgb}{\Boolean}{
|
* \parameter{srgb}{\Boolean}{
|
||||||
|
@ -230,7 +229,7 @@ public:
|
||||||
m_aabb.expandBy(p);
|
m_aabb.expandBy(p);
|
||||||
m_positions[m_vertexCtr] = p;
|
m_positions[m_vertexCtr] = p;
|
||||||
if (m_normals)
|
if (m_normals)
|
||||||
m_normals[m_vertexCtr] = m_objectToWorld(m_normal);
|
m_normals[m_vertexCtr] = normalize(m_objectToWorld(m_normal));
|
||||||
if (m_texcoords)
|
if (m_texcoords)
|
||||||
m_texcoords[m_vertexCtr] = m_uv;
|
m_texcoords[m_vertexCtr] = m_uv;
|
||||||
if (m_colors) {
|
if (m_colors) {
|
||||||
|
|
|
@ -57,7 +57,6 @@ MTS_NAMESPACE_BEGIN
|
||||||
* }
|
* }
|
||||||
* \parameter{toWorld}{\Transform\Or\Animation}{
|
* \parameter{toWorld}{\Transform\Or\Animation}{
|
||||||
* Specifies an optional linear object-to-world transformation.
|
* Specifies an optional linear object-to-world transformation.
|
||||||
* Note that non-uniform scales are not permitted!
|
|
||||||
* \default{none (i.e. object space $=$ world space)}
|
* \default{none (i.e. object space $=$ world space)}
|
||||||
* }
|
* }
|
||||||
* }
|
* }
|
||||||
|
@ -185,7 +184,7 @@ public:
|
||||||
}
|
}
|
||||||
if (m_normals) {
|
if (m_normals) {
|
||||||
for (size_t i=0; i<m_vertexCount; ++i)
|
for (size_t i=0; i<m_vertexCount; ++i)
|
||||||
m_normals[i] = objectToWorld(m_normals[i]);
|
m_normals[i] = normalize(objectToWorld(m_normals[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue