This example imports a partial scene containing definitions for the camera, a light, and some geometry (a ground plane and a yellow cube). It then creates a fibers object using the API that is shaded with a multicolor hair material.
#include "example_shared.h"
#include "example_render_target_simple.h"
#include <iostream>
#include <map>
#include <vector>
unsigned int lcg_a = 134775815;
unsigned int lcg_c = 123456;
unsigned int lcg_m = 1 << 31;
unsigned int lcg_prev = 33478921;
unsigned int get_random_uint()
{
mi::Uint64 val = (lcg_a * lcg_prev + lcg_c) % lcg_m;
lcg_prev = static_cast<unsigned int>(val);
return lcg_prev;
}
float get_random_float(const float& min, const float& max)
{
return ((float(get_random_uint()) * (max - min)) / float(lcg_m)) + min;
}
{
const unsigned int num_fibers = 1000;
const unsigned int num_vertices_per_fiber = 9;
std::vector<mi::Float32_4> control_points;
control_points.reserve(num_vertices_per_fiber);
for (unsigned int n=0; n<num_fibers; ++n) {
const float rx = get_random_float(-1.0f, 1.0f);
const float ry = get_random_float(-1.0f, 1.0f);
const float rz = get_random_float(-1.0f, 1.0f);
dir.normalize();
const mi::Float32_3 first_pos = sphere_center + sphere_radius * dir;
const mi::Float32 fiber_length = get_random_float(min_length, max_length);
const mi::Float32 segment_step = fiber_length / float(num_vertices_per_fiber - 1);
const mi::Float32 radius_step = (tip_radius - base_radius) /
float(num_vertices_per_fiber - 1);
control_points.clear();
for (unsigned int k = 0; k < num_vertices_per_fiber; ++k) {
if (k > 0) {
const float du = get_random_float(-randomness*0.5f, randomness*0.5f);
const float dv = get_random_float(-randomness*0.5f, randomness*0.5f);
v += (du * tu + dv * tv);
}
const mi::Float32 radius = base_radius + float(k) * radius_step;
}
mi::Float32_4 ghost_point = (2.0 * control_points[0]) - control_points[1];
fibers->
set_fiber_data(fh, 1, control_points.data(), control_points.size());
}
return fibers;
}
{
transaction->
store( fibers_object.get(),
"fibers_obj");
instance->attach( "fibers_obj");
matrix.translate( 0.0, -0.4, 0.0);
instance->set_matrix( matrix );
instance->create_attribute<
mi::IBoolean>(
"visible",
"Boolean"));
visible->set_value( true);
material->set_reference( "unicorn_hair");
transaction->
store( instance.get(),
"instance_fibers");
group->attach( "instance_fibers");
}
{
check_success( rc->add_mdl_path( mdl_path) == 0);
check_success( rc->add_mdl_path( ".") == 0);
}
{
check_success( database.is_valid_interface());
database->get_global_scope());
scope->create_transaction());
check_success( transaction.is_valid_interface());
check_success( import_api.is_valid_interface());
import_api->import_elements( transaction.get(), "file:main.mi"));
check_success( import_result->get_error_number() == 0);
setup_scene( transaction.get(), import_result->get_rootgroup());
scene->set_rootgroup( import_result->get_rootgroup());
scene->set_options( import_result->get_options());
scene->set_camera_instance( import_result->get_camera_inst());
transaction->
store( scene.get(),
"the_scene");
scene->create_render_context( transaction.get(), "iray"));
check_success( render_context.is_valid_interface());
scheduler_mode->set_c_str( "batch");
render_context->set_option( "scheduler_mode", scheduler_mode.get());
scene = 0;
new Render_target( image_api.get(), "Color", 512, 384));
check_success( render_context->render( transaction.get(), render_target.get(), 0) >= 0);
check_success( export_api.is_valid_interface());
export_api->export_canvas( "file:example_fibers.png", canvas.get());
}
int main( int argc, char* argv[])
{
if( argc != 2) {
std::cerr << "Usage: example_fibers <mdl_path>" << std::endl;
keep_console_open();
return EXIT_FAILURE;
}
const char* mdl_path = argv[1];
check_success( neuray.is_valid_interface());
configuration( neuray.get(), mdl_path);
check_start_success( result);
rendering( neuray.get());
check_success( neuray->
shutdown() == 0);
neuray = 0;
check_success( unload());
keep_console_open();
return EXIT_SUCCESS;
}
This interface represents bool.
Definition: inumber.h:122
A reference is an object that acts as a pointer to other database elements.
Definition: iref.h:25
A simple string class.
Definition: istring.h:22
Handle class template for interfaces, automatizing the lifetime control via reference counting.
Definition: handle.h:113
NxM-dimensional matrix class template of fixed dimensions.
Definition: matrix.h:367
Fixed-size math vector class template with generic operations.
Definition: vector.h:286
This interface is used to interact with the distributed database.
Definition: idatabase.h:293
This interface is used to export files.
Definition: iexport_api.h:38
Interface representing a collection of fibers.
Definition: ifibers.h:80
virtual Fiber_handle_struct add_fiber(Size vertices)=0
Adds a fiber with the given number of vertices.
virtual Sint32 set_type(Fiber_type fiber_type)=0
Sets the fiber type.
virtual Sint32 set_radius(Fiber_handle_struct s, Float32 radius)=0
Sets the radius of all vertices of a fiber.
virtual Sint32 set_fiber_data(Fiber_handle_struct s, Size index, const Float32_4_struct *data, Size n)=0
Sets an array of control points and radii per fiber.
virtual Sint32 set_control_point(Fiber_handle_struct s, Size index, Float32_3_struct p)=0
Sets a control point.
A group is a container for other scene elements.
Definition: igroup.h:39
This interface provides various utilities related to canvases and buffers.
Definition: iimage_api.h:49
This interface is used to import files.
Definition: iimport_api.h:100
An instance is a scene element that adds a transformation and attributes to another scene element.
Definition: iinstance.h:117
This is an object representing the Iray library.
Definition: ineuray.h:44
virtual Sint32 shutdown(bool blocking=true)=0
Shuts down the library.
virtual base::IInterface * get_api_component(const base::Uuid &uuid) const =0
Returns an API component from the Iray SDK API.
virtual Sint32 start(bool blocking=true)=0
Starts the operation of the Iray library.
This interface is used to load plugins and to query information about loaded plugins.
Definition: iplugin_configuration.h:24
This interface is used to query and change the rendering configuration.
Definition: irendering_configuration.h:109
The scene is the top-level element describing a subset of DB elements to be rendered.
Definition: iscene.h:44
A transaction provides a consistent view on the database.
Definition: itransaction.h:81
virtual base::IInterface * create(const char *type_name, Uint32 argc=0, const base::IInterface *argv[]=0)=0
Creates an object of the type type_name.
virtual base::IInterface * edit(const char *name)=0
Retrieves an element from the database and returns it ready for editing.
virtual Sint32 commit()=0
Commits the transaction.
virtual Sint32 store(base::IInterface *db_element, const char *name, Uint8 privacy=LOCAL_SCOPE)=0
Stores the element db_element in the database under the name name and with the privacy level privacy.
#define MI_BASE_DLL_FILE_EXT
The operating system specific default filename extension for shared libraries (DLLs)
Definition: config.h:340
unsigned long long Uint64
64-bit unsigned integer.
Definition: types.h:62
float Float32
32-bit float.
Definition: types.h:51
signed int Sint32
32-bit signed integer.
Definition: types.h:46
T cross(const Vector_struct<T, 2> &lhs, const Vector_struct<T, 2> &rhs)
Returns the two-times-two determinant result for the two vectors lhs and rhs.
Definition: vector.h:1705
bool normalize()
Normalizes this vector to unit length.
Definition: vector.h:646
math::Vector<Float32, 3> Float32_3
Vector of three Float32.
Definition: vector_typedefs.h:90
@ FIBER_TYPE_BSPLINE
Uses cubic uniform B-Splines.
Definition: ifibers.h:27
Handle class for type-safety.
Definition: identifier.h:56