/kaze/src/ri/ri_geometry.cpp
https://code.google.com/p/kaze-renderer/ · C++ · 1468 lines · 1304 code · 93 blank · 71 comment · 131 complexity · 13b91b75c7e416bedebfd97b00a239cf MD5 · raw file
- #include "ri_geometry.h"
- #include "ri_classifier.h"
- #include <assert.h>
-
- namespace kaze{
- namespace ri{
-
- static
- int SumArray(const RtInt ar[], int n)
- {
- int nRet = 0;
- for(int i = 0;i<n;i++){nRet += ar[i];}
- return nRet;
- }
-
- static
- int GetSize(int nClass, RtInt vertex = 1, RtInt varying = 1, RtInt uniform = 1, RtInt facevarying = 1)
- {
- switch(nClass)
- {
- case ri_classifier::VERTEX: return vertex;
- case ri_classifier::UNIFORM:
- case ri_classifier::CONSTANT: return uniform;
- case ri_classifier::VARYING: return varying;//const
- case ri_classifier::FACEVARYING: return facevarying;
- }
- return 1;
- }
-
- static
- void AddParams(
- ri_parameters* p_params,
- ri_classifier* p_cls,
- RtToken token, RtPointer param,
- RtInt vertex = 1, RtInt varying = 1, RtInt uniform = 1, RtInt facevarying = 1
- ){
- typedef const char* PCTR;
-
- int nID = p_cls->def(token);
- if(nID<0)return;
- const ri_classifier::param_data & data = (*p_cls)[nID];
- int nSz = GetSize(data.get_class(), vertex, varying, uniform, facevarying);
- switch (data.get_type()) {
- case ri_classifier::INTEGER:
- p_params->set(data.get_name(), (const RtInt*)param, data.get_size()*nSz);
- break;
- case ri_classifier::STRING:
- p_params->set(data.get_name(), (const PCTR *)param, data.get_size()*nSz);
- break;
- case ri_classifier::FLOAT:
- case ri_classifier::COLOR:
- case ri_classifier::POINT:
- case ri_classifier::VECTOR:
- case ri_classifier::NORMAL:
- case ri_classifier::HPOINT:
- case ri_classifier::MATRIX:
- p_params->set(data.get_name(), (const RtFloat *)param, data.get_size()*nSz);
- break;
- default:
- break;
- }
- }
-
- static
- void AddParams(
- ri_parameters* p_params,
- ri_classifier* p_cls,
- RtInt count, RtToken tokens[], RtPointer params[],
- RtInt vertex = 1, RtInt varying = 1, RtInt uniform = 1, RtInt facevarying = 1
- ){
- if(count){
- for(int i = 0;i<count;i++){
- AddParams(p_params, p_cls, tokens[i], params[i], vertex, varying, uniform, facevarying);
- }
- }
- }
- //------------------------------------------------------
-
- const float* ri_base_polygons::get_P()const{
- const ri_parameters::value_type* pv = params_.get("P");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_base_polygons::get_N()const{
- const ri_parameters::value_type* pv = params_.get("N");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_base_polygons::get_Np()const{
- const ri_parameters::value_type* pv = params_.get("Np");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_base_polygons::get_Cs()const{
- const ri_parameters::value_type* pv = params_.get("Cs");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_base_polygons::get_Os()const{
- const ri_parameters::value_type* pv = params_.get("Os");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
-
-
- //------------------------------------------------------
- //RiPolygon
- ri_polygon::ri_polygon(const ri_classifier* p_cls, RtInt nverts, RtInt n, RtToken tokens[], RtPointer params[])
- {
- params_.set("nverts",nverts);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, nverts, nverts, 1, 1);
- }
- }
- const float* ri_polygon::get_P()const{
- const ri_parameters::value_type* pv = params_.get("P");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_polygon::get_Cs()const{
- const ri_parameters::value_type* pv = params_.get("Cs");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_polygon::get_Os()const{
- const ri_parameters::value_type* pv = params_.get("Os");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
-
- int ri_polygon::get_nverts()const{
- return (params_.get("nverts"))->integer_values[0];
- }
-
- //------------------------------------------------------
- //RiGeneralPolygon
- ri_general_polygon::ri_general_polygon(const ri_classifier* p_cls, RtInt nloops, RtInt nverts[], RtInt n, RtToken tokens[], RtPointer params[])
- {
- int nPts = SumArray(nverts, nloops);
-
- params_.set("nloops",nloops);
- params_.set("nverts",nverts, nloops);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, nPts, nPts, 1, 1);
- }
- }
- const float* ri_general_polygon::get_P()const{
- const ri_parameters::value_type* pv = params_.get("P");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_general_polygon::get_Cs()const{
- const ri_parameters::value_type* pv = params_.get("Cs");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_general_polygon::get_Os()const{
- const ri_parameters::value_type* pv = params_.get("Os");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const int* ri_general_polygon::get_nverts()const{
- return &((params_.get("nverts"))->integer_values[0]);
- }
- int ri_general_polygon::get_nloops()const{
- return (params_.get("nloops"))->integer_values[0];
- }
- //------------------------------------------------------
- //RiPointsPolygons
- ri_points_polygons::ri_points_polygons(const ri_classifier* p_cls, RtInt npolys, RtInt nverts[], RtInt verts[], RtInt n, RtToken tokens[], RtPointer params[])
- {
- int nPts = SumArray(nverts, npolys);
- int psz = 0;
- for (int i = 0; i < nPts; i++ )
- {
- if ( psz < verts[ i ] ){
- psz = verts[ i ];
- }
- }
-
- params_.set("npolys",npolys);
- params_.set("nverts",nverts, npolys);
- params_.set("verts",verts, nPts);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, psz + 1, psz + 1, npolys, nPts);
- }
- }
- ri_points_polygons::ri_points_polygons(const ri_classifier* p_cls, RtInt nverts, RtInt n, RtToken tokens[], RtPointer params[])
- {
- int npolys = 1;
- RtInt nverts_[] = {nverts};
- std::vector<RtInt> verts_(nverts);
- for(int i=0;i<nverts;i++)verts_[i]=i;
-
- int nPts = nverts;
- int psz = 0;
- for (int i = 0; i < nPts; i++ )
- {
- if ( psz < verts_[ i ] ){
- psz = verts_[ i ];
- }
- }
-
- params_.set("npolys",npolys);
- params_.set("nverts",nverts_, npolys);
- params_.set("verts",&verts_[0], nverts);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, psz + 1, psz + 1, npolys, nPts);
- }
- }
- const float* ri_points_polygons::get_P()const{
- const ri_parameters::value_type* pv = params_.get("P");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_points_polygons::get_Cs()const{
- const ri_parameters::value_type* pv = params_.get("Cs");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_points_polygons::get_Os()const{
- const ri_parameters::value_type* pv = params_.get("Os");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- int ri_points_polygons::get_npolys()const{
- return (params_.get("npolys"))->integer_values[0];
- }
- const int* ri_points_polygons::get_nverts()const{
- return &((params_.get("nverts"))->integer_values[0]);
- }
- const int* ri_points_polygons::get_verts()const{
- return &((params_.get("verts"))->integer_values[0]);
- }
-
- void ri_points_polygons::add_polygon(RtInt nverts, RtInt n, RtToken tokens[], RtPointer params[])
- {
- RtInt nverts_[] = {nverts};
- std::vector<RtInt> verts_(nverts);
- for(int i=0;i<nverts;i++)verts_[i]=i;
- /*
-
- std::vector<int>& nverts = (params_.get("nverts"))->integer_values;
- for()
-
- npolys += get_npolys();
-
-
-
-
- params_.set("npolys",npolys);
- params_.set("nverts",nverts, npolys);
- params_.set("verts",verts, nPts);
-
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, psz + 1, psz + 1, npolys, nPts);
- }
- */
- }
-
- //------------------------------------------------------
- //RiPointsGeneralPolygons
- ri_points_general_polygons::ri_points_general_polygons(const ri_classifier* p_cls, RtInt npolys, RtInt nloops[], RtInt nverts[], RtInt verts[], RtInt n, RtToken tokens[], RtPointer params[])
- {
- int nVts = SumArray(nloops, npolys);
- int nv = SumArray(nverts, nVts);
- int psz = 0;
- for (int i = 0; i < nv; i++ )
- {
- if ( psz < verts[ i ] ){
- psz = verts[ i ];
- }
- }
-
- params_.set("npolys",npolys);
- params_.set("nloops",nloops, npolys);
- params_.set("nverts",nverts, nVts);
- params_.set("verts",verts, nv);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, psz + 1, psz + 1, npolys, nv);
- }
- }
- const float* ri_points_general_polygons::get_P()const{
- const ri_parameters::value_type* pv = params_.get("P");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_points_general_polygons::get_Cs()const{
- const ri_parameters::value_type* pv = params_.get("Cs");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_points_general_polygons::get_Os()const{
- const ri_parameters::value_type* pv = params_.get("Os");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- int ri_points_general_polygons::get_npolys()const{
- return (params_.get("npolys"))->integer_values[0];
- }
- const int* ri_points_general_polygons::get_nloops()const{
- return &((params_.get("nloops"))->integer_values[0]);
- }
- const int* ri_points_general_polygons::get_nverts()const{
- return &((params_.get("nverts"))->integer_values[0]);
- }
- const int* ri_points_general_polygons::get_verts()const{
- return &((params_.get("verts"))->integer_values[0]);
- }
- //------------------------------------------------------
- struct T2I {
- const char* name;
- int num;
- };
-
- static T2I ORDERS[] =
- {
- {RI_BILINEAR, 2},
- {RI_BIQUADRATIC, 3},
- {RI_BICUBIC, 4},
- {RI_LINEAR, 2},
- {RI_QUADRATIC, 3},
- {RI_CUBIC, 4},
- {NULL,0}
- };
-
- static
- int GetOrder(RtToken type)
- {
- int i = 0;
- while (ORDERS[i].name) {
- if(strcmp(ORDERS[i].name, type)==0)return ORDERS[i].num;
- i++;
- }
- return 0;
- }
-
-
- //------------------------------------------------------
- //RiPatch
- ri_patch::ri_patch(const ri_classifier* p_cls, RtToken type, RtInt n, RtToken tokens[], RtPointer params[])
- {
- int nv = GetOrder(type);
- if(nv){
- params_.set("type", type);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, nv * nv, 4);
- }
- }
- }
- const char* ri_patch::get_type()const{
- return (params_.get("type"))->string_values[0].c_str();
- }
- const float* ri_patch::get_P()const{
- const ri_parameters::value_type* pv = params_.get("P");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_patch::get_Cs()const{
- const ri_parameters::value_type* pv = params_.get("Cs");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_patch::get_Os()const{
- const ri_parameters::value_type* pv = params_.get("Os");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- std::string ri_patch::get_ubasis()const{
- std::string str;
- attr_.get("Basis", "ubasis", str);
- return str;
- }
- std::string ri_patch::get_vbasis()const{
- std::string str;
- attr_.get("Basis", "vbasis", str);
- return str;
- }
- int ri_patch::get_ustep ()const{
- int nStep=0;
- attr_.get("Basis", "ustep", nStep);
- return nStep;
- }
- int ri_patch::get_vstep ()const{
- int nStep=0;
- attr_.get("Basis", "vstep", nStep);
- return nStep;
- }
-
- //------------------------------------------------------
- //RiPatchMesh
- ri_patch_mesh::ri_patch_mesh(const ri_classifier* p_cls, RtInt ustep, RtInt vstep, RtToken type, RtInt nu, RtToken uwrap, RtInt nv, RtToken vwrap, RtInt n, RtToken tokens[], RtPointer params[])
- {
- int nOrder = GetOrder(type);
- int nupatch = 1;
- int nvpatch = 1;
- int ii = 0;
- if(nOrder == 2){//linear
- if(strcmp(uwrap,RI_PERIODIC)==0){//loop
- nupatch = nu;
- }else if(strcmp(uwrap,RI_NONPERIODIC)==0){//open
- nupatch = nu - 1;
- ii += 1;
- }else{
- nOrder = 0;//error
- }
- if(strcmp(vwrap,RI_PERIODIC)==0){//loop
- nvpatch = nv;
- }else if(strcmp(vwrap,RI_NONPERIODIC)==0){//open
- nvpatch = nv - 1;
- ii += 1;
- }else{
- nOrder = 0;//error
- }
- ii += nupatch + nvpatch;
- //ii = nu+nv
- }else if(nOrder == 4){//cubic
- RtInt nustep = ustep;
- RtInt nvstep = vstep;
-
- if (strcmp(uwrap,RI_PERIODIC)==0){
- nupatch = nu / nustep;
- }else if (strcmp(uwrap,RI_NONPERIODIC)==0){
- nupatch = ( nu - 4 ) / nustep + 1;
- ii += 1;
- }else{
- nOrder = 0;//error
- }
-
- if (strcmp(vwrap,RI_PERIODIC)==0){
- nvpatch = nv / nvstep;
- }else if (strcmp(vwrap,RI_NONPERIODIC)==0){
- nvpatch = ( nv - 4 ) / nvstep + 1;
- ii += 1;
- }else{
- nOrder = 0;//error
- }
- }else{
- nOrder = 0;
- }
-
- params_.set("type",type);
- params_.set("nu",nu);
- params_.set("nv",nv);
- params_.set("uwrap",uwrap);
- params_.set("vwrap",vwrap);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, nu * nv, ii, nupatch * nvpatch);
- }
- }
- const char* ri_patch_mesh::get_type()const{
- return (params_.get("type"))->string_values[0].c_str();
- }
- int ri_patch_mesh::get_nu()const{
- return (params_.get("nu"))->integer_values[0];
- }
- int ri_patch_mesh::get_nv()const{
- return (params_.get("nv"))->integer_values[0];
- }
- const char* ri_patch_mesh::get_uwrap()const{
- return (params_.get("uwrap"))->string_values[0].c_str();
- }
- const char* ri_patch_mesh::get_vwrap()const{
- return (params_.get("vwrap"))->string_values[0].c_str();
- }
-
- const float* ri_patch_mesh::get_P()const{
- const ri_parameters::value_type* pv = params_.get("P");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_patch_mesh::get_Cs()const{
- const ri_parameters::value_type* pv = params_.get("Cs");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_patch_mesh::get_Os()const{
- const ri_parameters::value_type* pv = params_.get("Os");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- std::string ri_patch_mesh::get_ubasis()const{
- std::string str;
- attr_.get("Basis", "ubasis", str);
- return str;
- }
- std::string ri_patch_mesh::get_vbasis()const{
- std::string str;
- attr_.get("Basis", "vbasis", str);
- return str;
- }
- int ri_patch_mesh::get_ustep ()const{
- int nStep=0;
- attr_.get("Basis", "ustep", nStep);
- return nStep;
- }
- int ri_patch_mesh::get_vstep ()const{
- int nStep=0;
- attr_.get("Basis", "vstep", nStep);
- return nStep;
- }
- //------------------------------------------------------
- //RiNuPatch
- ri_nu_patch::ri_nu_patch(const ri_classifier* p_cls, RtInt nu, RtInt uorder, RtFloat uknot[], RtFloat umin, RtFloat umax, RtInt nv, RtInt vorder, RtFloat vknot[], RtFloat vmin, RtFloat vmax, RtInt n, RtToken tokens[], RtPointer params[])
- {
- params_.set("nu", nu);
- params_.set("uorder", uorder);
- params_.set("uknot", uknot, nu+uorder);
- params_.set("umin", umin);
- params_.set("umax", umax);
- params_.set("nv", nv);
- params_.set("vorder", vorder);
- params_.set("vknot", vknot, nv+vorder);
- params_.set("vmin", vmin);
- params_.set("vmax", vmax);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, nu * nv, ( 2 + nu - uorder ) * ( 2 + nv - vorder ), ( 1 + nu - uorder ) * ( 1 + nv - vorder ));
- }
- }
- int ri_nu_patch::get_nu()const{
- return (params_.get("nu"))->integer_values[0];
- }
- int ri_nu_patch::get_nv()const{
- return (params_.get("nv"))->integer_values[0];
- }
- int ri_nu_patch::get_uorder()const{
- return (params_.get("uorder"))->integer_values[0];
- }
- int ri_nu_patch::get_vorder()const{
- return (params_.get("vorder"))->integer_values[0];
- }
- const std::vector<float>& ri_nu_patch::get_uknot()const{
- return (params_.get("uknot"))->float_values;
- }
- const std::vector<float>& ri_nu_patch::get_vknot()const{
- return (params_.get("vknot"))->float_values;
- }
- float ri_nu_patch::get_umin()const{
- return (params_.get("umin"))->float_values[0];
- }
- float ri_nu_patch::get_umax()const{
- return (params_.get("umax"))->float_values[0];
- }
- float ri_nu_patch::get_vmin()const{
- return (params_.get("vmin"))->float_values[0];
- }
- float ri_nu_patch::get_vmax()const{
- return (params_.get("vmax"))->float_values[0];
- }
- const float* ri_nu_patch::get_Pw()const{
- const ri_parameters::value_type* pv = params_.get("Pw");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_nu_patch::get_Cs()const{
- const ri_parameters::value_type* pv = params_.get("Cs");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_nu_patch::get_Os()const{
- const ri_parameters::value_type* pv = params_.get("Os");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- //------------------------------------------------------
- //RiTrimCurve
- ri_trim_curve::ri_trim_curve(const ri_classifier* p_cls, RtInt nloops, RtInt ncurves[], RtInt order[], RtFloat knot[], RtFloat min[], RtFloat max[], RtInt n[], RtFloat u[], RtFloat v[], RtFloat w[])
- {
- int ttlc = SumArray(ncurves, nloops);
- int nbcoords = 0;
- int knotsize = 0;
- for (int i = 0; i < ttlc; i++ )
- {
- nbcoords += n[ i ];
- knotsize += order[ i ] + n[ i ];
- }
-
- params_.set("nloops", nloops);
- params_.set("ncurves", ncurves, nloops);
- params_.set("order", order, ttlc);
- params_.set("knot", knot, knotsize);
- params_.set("min", min, ttlc);
- params_.set("max", max, ttlc);
- params_.set("n", n, ttlc);
- params_.set("u", u, nbcoords);
- params_.set("v", v, nbcoords);
- params_.set("w", w, nbcoords);
- }
-
- //------------------------------------------------------
- //RiSphere
- ri_sphere::ri_sphere(const ri_classifier* p_cls, RtFloat radius, RtFloat zmin, RtFloat zmax, RtFloat tmax, RtInt n, RtToken tokens[], RtPointer params[])
- {
- params_.set("radius",radius);
- params_.set("zmin",zmin);
- params_.set("zmax",zmax);
- params_.set("tmax",tmax);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, 4, 4);
- }
- }
- float ri_sphere::get_radius()const{
- return (params_.get("radius"))->float_values[0];
- }
- float ri_sphere::get_zmin()const{
- return (params_.get("zmin"))->float_values[0];
- }
- float ri_sphere::get_zmax()const{
- return (params_.get("zmax"))->float_values[0];
- }
- float ri_sphere::get_tmax()const{
- return (params_.get("tmax"))->float_values[0];
- }
- //------------------------------------------------------
- //RiCone
- ri_cone::ri_cone(const ri_classifier* p_cls, RtFloat height, RtFloat radius, RtFloat tmax, RtInt n, RtToken tokens[], RtPointer params[])
- {
- params_.set("height",height);
- params_.set("radius",radius);
- params_.set("tmax",tmax);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, 4, 4);
- }
- }
- float ri_cone::get_height()const{
- return (params_.get("height"))->float_values[0];
- }
- float ri_cone::get_radius()const{
- return (params_.get("radius"))->float_values[0];
- }
- float ri_cone::get_tmax()const{
- return (params_.get("tmax"))->float_values[0];
- }
- //------------------------------------------------------
- //RiCylinder
- ri_cylinder::ri_cylinder(const ri_classifier* p_cls, RtFloat radius, RtFloat zmin, RtFloat zmax, RtFloat tmax, RtInt n, RtToken tokens[], RtPointer params[])
- {
- params_.set("radius",radius);
- params_.set("zmin",zmin);
- params_.set("zmax",zmax);
- params_.set("tmax",tmax);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, 4, 4);
- }
- }
- float ri_cylinder::get_radius()const{
- return (params_.get("radius"))->float_values[0];
- }
- float ri_cylinder::get_zmin()const{
- return (params_.get("zmin"))->float_values[0];
- }
- float ri_cylinder::get_zmax()const{
- return (params_.get("zmax"))->float_values[0];
- }
- float ri_cylinder::get_tmax()const{
- return (params_.get("tmax"))->float_values[0];
- }
- //------------------------------------------------------
- //RiHyperboloid
- ri_hyperboloid::ri_hyperboloid(const ri_classifier* p_cls, RtPoint point1, RtPoint point2, RtFloat tmax, RtInt n, RtToken tokens[], RtPointer params[])
- {
- params_.set("point1",point1, 3);
- params_.set("point2",point2, 3);
- params_.set("tmax",tmax);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, 4, 4);
- }
- }
- const float* ri_hyperboloid::get_point1()const{
- return &((params_.get("point1"))->float_values[0]);
- }
- const float* ri_hyperboloid::get_point2()const{
- return &((params_.get("point2"))->float_values[0]);
- }
- float ri_hyperboloid::get_tmax()const{
- return (params_.get("tmax"))->float_values[0];
- }
- //------------------------------------------------------
- //RiParaboloid
- ri_paraboloid::ri_paraboloid(const ri_classifier* p_cls, RtFloat rmax, RtFloat zmin, RtFloat zmax, RtFloat tmax, RtInt n, RtToken tokens[], RtPointer params[])
- {
- params_.set("rmax",rmax);
- params_.set("zmin",zmin);
- params_.set("zmax",zmax);
- params_.set("tmax",tmax);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, 4, 4);
- }
- }
- float ri_paraboloid::get_rmax()const{
- return (params_.get("rmax"))->float_values[0];
- }
- float ri_paraboloid::get_zmin()const{
- return (params_.get("zmin"))->float_values[0];
- }
- float ri_paraboloid::get_zmax()const{
- return (params_.get("zmax"))->float_values[0];
- }
- float ri_paraboloid::get_tmax()const{
- return (params_.get("tmax"))->float_values[0];
- }
- //------------------------------------------------------
- //RiDisk
- ri_disk::ri_disk(const ri_classifier* p_cls, RtFloat height, RtFloat radius, RtFloat tmax, RtInt n, RtToken tokens[], RtPointer params[])
- {
- params_.set("height",height);
- params_.set("radius",radius);
- params_.set("tmax",tmax);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, 4, 4);
- }
- }
- float ri_disk::get_height()const{
- return (params_.get("height"))->float_values[0];
- }
- float ri_disk::get_radius()const{
- return (params_.get("radius"))->float_values[0];
- }
- float ri_disk::get_tmax()const{
- return (params_.get("tmax"))->float_values[0];
- }
- //------------------------------------------------------
- //RiTorus
- ri_torus::ri_torus(const ri_classifier* p_cls, RtFloat majrad, RtFloat minrad, RtFloat phimin, RtFloat phimax, RtFloat tmax, RtInt n, RtToken tokens[], RtPointer params[])
- {
- params_.set("majrad",majrad);
- params_.set("minrad",minrad);
- params_.set("phimin",phimin);
- params_.set("phimax",phimax);
- params_.set("tmax",tmax);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, 4, 4);
- }
- }
- float ri_torus::get_majrad()const{
- return (params_.get("majrad"))->float_values[0];
- }
- float ri_torus::get_minrad()const{
- return (params_.get("minrad"))->float_values[0];
- }
- float ri_torus::get_phimin()const{
- return (params_.get("phimin"))->float_values[0];
- }
- float ri_torus::get_phimax()const{
- return (params_.get("phimax"))->float_values[0];
- }
- float ri_torus::get_tmax()const{
- return (params_.get("tmax"))->float_values[0];
- }
- //------------------------------------------------------
- //RiBlobby
- ri_blobby::ri_blobby(const ri_classifier* p_cls, RtInt nleaf, RtInt ncode, RtInt code[], RtInt nflt, RtFloat flt[], RtInt nstr, RtToken str[], RtInt n , RtToken tokens[], RtPointer params[])
- {
- params_.set("nleaf",nleaf);
- params_.set("ncode",ncode);
- params_.set("code",code, ncode);
- params_.set("nflt",nflt);
- params_.set("flt",flt, nflt);
- params_.set("nstr",nstr);
- params_.set("str",str,nstr);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, nleaf, nleaf);
- }
- }
-
- //------------------------------------------------------
- //RiCurves
- ri_curves::ri_curves(const ri_classifier* p_cls, RtToken type, RtInt ncurves, RtInt nvertices[], RtToken wrap, RtInt n, RtToken tokens[], RtPointer params[])
- {
- int vn = SumArray(nvertices, ncurves);
-
- params_.set("type",type);
- params_.set("ncurves", ncurves);
- params_.set("nvertices", nvertices, ncurves);
- params_.set("wrap",wrap);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, vn, ncurves*2, ncurves);//TODO
- }
- }
-
- int ri_curves::get_ncurves()const
- {
- return (params_.get("ncurves"))->integer_values[0];
- }
-
- const int* ri_curves::get_nvertices()const
- {
- return &((params_.get("nvertices"))->integer_values[0]);
- }
-
- const char* ri_curves::get_type()const
- {
- return (params_.get("type"))->string_values[0].c_str();
- }
-
- const char* ri_curves::get_wrap()const
- {
- return (params_.get("wrap"))->string_values[0].c_str();
- }
-
- const float* ri_curves::get_P()const{
- const ri_parameters::value_type* pv = params_.get("P");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_curves::get_width()const
- {
- const ri_parameters::value_type* pv = params_.get("width");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_curves::get_Cs()const{
- const ri_parameters::value_type* pv = params_.get("Cs");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_curves::get_Os()const{
- const ri_parameters::value_type* pv = params_.get("Os");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- float ri_curves::get_constantwidth()const{
- const ri_parameters::value_type* pv = params_.get("constantwidth");
- if(pv){
- return pv->float_values[0];
- }
- return 1.0f;
- }
-
-
-
- //------------------------------------------------------
- //RiPoints
- ri_points::ri_points(const ri_classifier* p_cls, RtInt nverts, RtInt n, RtToken tokens[], RtPointer params[])
- {
- params_.set("nverts",nverts);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, nverts, nverts);//vertex, varying
- }
- }
- const float* ri_points::get_P()const{
- const ri_parameters::value_type* pv = params_.get("P");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_points::get_width()const
- {
- const ri_parameters::value_type* pv = params_.get("width");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_points::get_Cs()const{
- const ri_parameters::value_type* pv = params_.get("Cs");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_points::get_Os()const{
- const ri_parameters::value_type* pv = params_.get("Os");
- if(pv){
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- float ri_points::get_constantwidth()const{
- const ri_parameters::value_type* pv = params_.get("constantwidth");
- if(pv){
- return pv->float_values[0];
- }
- return 1.0f;
- }
- int ri_points::get_nverts()const{
- return (params_.get("nverts"))->integer_values[0];
- }
-
- //------------------------------------------------------
- //RiSubdivisionMesh
- ri_subdivision_mesh::ri_subdivision_mesh(const ri_classifier* p_cls, RtToken mask, RtInt nf, RtInt nverts[], RtInt verts[], RtInt ntags, RtToken tags[], RtInt nargs[], RtInt intargs[], RtFloat floatargs[], RtInt n, RtToken tokens[], RtPointer params[])
- {
- int nv = SumArray(nverts,nf);
-
- RtInt isz = 0;
- RtInt fsz = 0;
- for (int i = 0; i < ntags*2; i++ )
- {
- if ( i % 2 == 0 )
- isz += nargs[ i ];
- else
- fsz += nargs[ i ];
- }
-
- RtInt psz = 0;
- for (int i = 0; i < nv; i++ )
- {
- if ( psz < verts[ i ] )
- psz = verts[ i ];
- }
-
- params_.set("mask",mask);
- params_.set("nf",nf);
- params_.set("nverts",nverts, nf);
- params_.set("verts",verts, nv);
- params_.set("tags",tags, ntags);
- params_.set("nargs",nargs, ntags * 2);
- params_.set("intargs",intargs, isz);
- params_.set("floatargs",floatargs, isz);
- if(n){
- ri_saving_classifier cls(p_cls, &(this->clsf_));
- AddParams(¶ms_, &cls, n, tokens, params, psz + 1, psz + 1, nf, nv);
- }
- }
-
- //------------------------------------------------------
- //RiProcedual
- ri_DelayedReadArchive::ri_DelayedReadArchive(const ri_classifier* p_cls, RtToken data[], RtBound bound)
- {
- RtToken filename = data[0];
- params_.set("filename",filename);
- params_.set("bound",bound, 6);
- }
-
- ri_RunProgram::ri_RunProgram(const ri_classifier* p_cls, RtToken data[], RtBound bound)
- {
- RtToken programname = data[0];
- RtToken argument = data[1];
- params_.set("programname",programname);
- params_.set("argument",argument);
- params_.set("bound",bound, 6);
- }
-
- ri_DynamicLoad::ri_DynamicLoad(const ri_classifier* p_cls, RtToken data[], RtBound bound)
- {
- params_.set("bound",bound, 6);
- }
-
- //------------------------------------------------------
- //RiGeometry name is "teapot"
- ri_teapot::ri_teapot(){
- //assert(0);
- }
-
- //------------------------------------------------------
- //RiGeometry name is "bunny"
- ri_bunny::ri_bunny(){
- //assert(0);
- }
-
-
-
-
- //------------------------------------------------------
- //Internal
- static
- void CreateIndicesPolygon(
- std::vector<int>& indices,
- std::vector<int>& tri2poly,
- std::vector<int>& fvindices, //for face varying
- int nverts)
- {
- int i=1;
- for(int k=0;k<nverts-2;k++)
- {
- indices.push_back(0);
- indices.push_back(i);
- indices.push_back(i+1);
-
- tri2poly.push_back(0);//
- i++;
- }
- fvindices = indices;
- }
-
- static
- void CreateIndicesGeneralPolygon(
- std::vector<int>& indices,
- std::vector<int>& tri2poly,
- std::vector<int>& fvindices, //for face varying
- int nloops, const int nverts[])
- {
- int k = 0;
- {
- int nV = nverts[0];
- {
- for(int j=0;j<nV-2;j++)
- {
- int s = k+j;
- indices.push_back(k);
- indices.push_back(s+1);
- indices.push_back(s+2);
-
- tri2poly.push_back(0);//
- }
- }
- k+=nV;
- }
- fvindices = indices;
- #if 0
- for(int i=1;j<nloops;i++){
- int nV = nverts[i];
- {
- for(int j=0;j<nV-2;j++)
- {
- int s = k+j;
- indices.push_back(k);
- indices.push_back(s+1);
- indices.push_back(s+2);
-
- tri2poly.push_back(0);//
- }
- }
- k+=nV;
- }
- #endif
- }
-
- static
- void CreateIndicesPointsPolygons(
- std::vector<int>& indices,
- std::vector<int>& tri2poly,
- std::vector<int>& fvindices, //for face varying
- int npolys, const int nverts[], const int verts[])
- {
- int k = 0;
- indices.reserve(npolys*3*2);
- for(int i=0;i<npolys;i++){
- int nV = nverts[i];
- {
- for(int j=0;j<nV-2;j++)
- {
- int s = k+j;
- indices.push_back(verts[k]);
- indices.push_back(verts[s+1]);
- indices.push_back(verts[s+2]);
-
- fvindices.push_back(k);
- fvindices.push_back(s+1);
- fvindices.push_back(s+2);
-
- tri2poly.push_back(i);
- }
- }
- k+=nV;
- }
- }
-
- static
- void CreateIndicesPointsGeneralPolygons(
- std::vector<int>& indices,
- std::vector<int>& tri2poly,
- std::vector<int>& fvindices, //for face varying
- int npolys, const int nloops[], const int nverts[], const int verts[])
- {
- int k = 0;
- int v = 0;
- for(int i=0;i<npolys;i++){
- int nloop = nloops[i];
- {
- int nV = nverts[v];
- {
- for(int j=0;j<nV-2;j++)
- {
- int s = k+j;
- indices.push_back(verts[k]);
- indices.push_back(verts[s+1]);
- indices.push_back(verts[s+2]);
-
- fvindices.push_back(k);
- fvindices.push_back(s+1);
- fvindices.push_back(s+2);
-
- tri2poly.push_back(i);
- }
- }
- k+=nV;
- }
- for(int j=1;j<nloop;j++)
- {
- int nV = nverts[v];
- {
- ;
- }
- k+=nV;
- }
- v += nloop;
- }
- }
-
- static
- bool IsFaceUniform(int nClass)
- {
- if(nClass == ri_classifier::UNIFORM || nClass == ri_classifier::CONSTANT)
- {
- return true;
- }
- return false;
- }
-
- static
- bool IsFaceVarying(int nClass)
- {
- if(nClass == ri_classifier::FACEVARYING){
- return true;
- }
- return false;
- }
-
- static
- void ExpandUniformData
- (
- ri_parameters* out,
- const std::vector<int>& tri2poly,
- const ri_classifier* p_cls,
- const ri_parameters* in
- )
- {
- size_t fsz = tri2poly.size();
- size_t sz = p_cls->size();
- for(size_t i=0;i<sz;i++)
- {
- const ri_classifier::param_data& data = (*p_cls)[i];
- if(IsFaceUniform( data.get_class() ))
- {
- switch (data.get_type()) {
- case ri_classifier::INTEGER:
- {
- int dsz = data.get_size();
- std::vector<int> tmp(fsz*dsz);
- const int* p = &(in->get(data.get_name())->integer_values[0]);
- for(int j=0;j<fsz;j++){
- int idx = tri2poly[j];
- for(int k=0;k<dsz;k++){
- tmp[j*dsz + k] = p[idx*dsz + k];
- }
- }
- out->set(data.get_name(), (const int *)&tmp[0], (int)tmp.size());
- }
- break;
- case ri_classifier::STRING:
- {
- int dsz = data.get_size();
- std::vector<std::string> tmp(fsz*dsz);
- const std::string* p = &(in->get(data.get_name())->string_values[0]);
- for(int j=0;j<fsz;j++){
- int idx = tri2poly[j];
- for(int k=0;k<dsz;k++){
- tmp[j*dsz + k] = p[idx*dsz + k];
- }
- }
- out->set(data.get_name(), (const std::string *)&tmp[0], (int)tmp.size());
- }
- break;
- case ri_classifier::FLOAT:
- case ri_classifier::COLOR:
- case ri_classifier::POINT:
- case ri_classifier::VECTOR:
- case ri_classifier::NORMAL:
- case ri_classifier::HPOINT:
- case ri_classifier::MATRIX:
- {
- int dsz = data.get_size();
- std::vector<float> tmp(fsz*dsz);
- const float* p = &(in->get(data.get_name())->float_values[0]);
- for(int j=0;j<fsz;j++){
- int idx = tri2poly[j];
- for(int k=0;k<dsz;k++){
- tmp[j*dsz + k] = p[idx*dsz + k];
- }
- }
- out->set(data.get_name(), (const float *)&tmp[0], (int)tmp.size());
- }
- break;
- default:
- break;
- }
- }
- }
- }
-
- static
- void ExpandFaceVaryingData
- (
- ri_parameters* out,
- const std::vector<int>& fvindices, //for face varying
- const ri_classifier* p_cls,
- const ri_parameters* in
- )
- {
- size_t isz = fvindices.size();
- size_t sz = p_cls->size();
- for(size_t i=0;i<sz;i++)
- {
- const ri_classifier::param_data& data = (*p_cls)[i];
- if(IsFaceVarying( data.get_class() ))
- {
- switch (data.get_type()) {
- case ri_classifier::INTEGER:
- {
- int dsz = data.get_size();
- std::vector<int> tmp(isz*dsz);
- const int* p = &(in->get(data.get_name())->integer_values[0]);
- for(int j=0;j<isz;j++){
- int idx = fvindices[j];//
- for(int k=0;k<dsz;k++){
- tmp[j*dsz + k] = p[idx*dsz + k];
- }
- }
- out->set(data.get_name(), (const int *)&tmp[0], (int)tmp.size());
- }
- break;
- case ri_classifier::STRING:
- {
- int dsz = data.get_size();
- std::vector<std::string> tmp(isz*dsz);
- const std::string* p = &(in->get(data.get_name())->string_values[0]);
- for(int j=0;j<isz;j++){
- int idx = fvindices[j];
- for(int k=0;k<dsz;k++){
- tmp[j*dsz + k] = p[idx*dsz + k];
- }
- }
- out->set(data.get_name(), (const std::string *)&tmp[0], (int)tmp.size());
- }
- break;
- case ri_classifier::FLOAT:
- case ri_classifier::COLOR:
- case ri_classifier::POINT:
- case ri_classifier::VECTOR:
- case ri_classifier::NORMAL:
- case ri_classifier::HPOINT:
- case ri_classifier::MATRIX:
- {
- int dsz = data.get_size();
- std::vector<float> tmp(isz*dsz);
- const float* p = &(in->get(data.get_name())->float_values[0]);
- for(int j=0;j<isz;j++){
- int idx = fvindices[j];
- for(int k=0;k<dsz;k++){
- tmp[j*dsz + k] = p[idx*dsz + k];
- }
- }
- out->set(data.get_name(), (const float *)&tmp[0], (int)tmp.size());
- }
- break;
- default:
- break;
- }
- }
- }
- }
-
-
- ri_points_triangle_polygons::ri_points_triangle_polygons(const ri_polygon* pGeo)
- :pGeo_(pGeo)
- {
- std::vector<int> tri2poly;
- std::vector<int> fvindices;
- CreateIndicesPolygon(indeices_, tri2poly, fvindices, pGeo->get_nverts());
- ExpandUniformData(¶ms_, tri2poly, &pGeo->get_classifier(), &(pGeo->get_parameters()));
- ExpandFaceVaryingData(¶ms_, fvindices, &pGeo->get_classifier(), &(pGeo->get_parameters()));
- }
-
-
- ri_points_triangle_polygons::ri_points_triangle_polygons(const ri_general_polygon* pGeo)
- :pGeo_(pGeo)
- {
- std::vector<int> tri2poly;
- std::vector<int> fvindices;
- CreateIndicesGeneralPolygon(indeices_, tri2poly, fvindices, pGeo->get_nloops(), pGeo->get_nverts());
- ExpandUniformData(¶ms_, tri2poly, &pGeo->get_classifier(), &(pGeo->get_parameters()));
- ExpandFaceVaryingData(¶ms_, fvindices, &pGeo->get_classifier(), &(pGeo->get_parameters()));
- }
-
- ri_points_triangle_polygons::ri_points_triangle_polygons(const ri_points_polygons* pGeo)
- :pGeo_(pGeo)
- {
- std::vector<int> tri2poly;
- std::vector<int> fvindices;
- CreateIndicesPointsPolygons(indeices_, tri2poly, fvindices, pGeo->get_npolys(), pGeo->get_nverts(), pGeo->get_verts());
- ExpandUniformData(¶ms_, tri2poly, &pGeo->get_classifier(), &(pGeo->get_parameters()));
- ExpandFaceVaryingData(¶ms_, fvindices, &pGeo->get_classifier(), &(pGeo->get_parameters()));
- }
-
- ri_points_triangle_polygons::ri_points_triangle_polygons(const ri_points_general_polygons* pGeo)
- :pGeo_(pGeo)
- {
- std::vector<int> tri2poly;
- std::vector<int> fvindices;
- CreateIndicesPointsGeneralPolygons(indeices_, tri2poly, fvindices, pGeo->get_npolys(), pGeo->get_nloops(), pGeo->get_nverts(), pGeo->get_verts());
- ExpandUniformData(¶ms_, tri2poly, &pGeo->get_classifier(), &(pGeo->get_parameters()));
- ExpandFaceVaryingData(¶ms_, fvindices, &pGeo->get_classifier(), &(pGeo->get_parameters()));
- }
-
- const ri_parameters::value_type* ri_points_triangle_polygons::get_parameter(const char* key)const
- {
- const ri_parameters::value_type* pv = params_.get(key);
- if(pv)return pv;
- return pGeo_->get_parameter(key);
- }
-
- int ri_points_triangle_polygons::get_nfaces()const
- {
- return (int)indeices_.size()/3;
- }
- int ri_points_triangle_polygons::get_nverts()const
- {
- return (int)indeices_.size();
- }
- const float* ri_points_triangle_polygons::get_P()const
- {
- return pGeo_->get_P();
- }
- const float* ri_points_triangle_polygons::get_N()const
- {
- if(is_facevarying("N"))return NULL;
- const ri_parameters::value_type* pv = this->get_parameter("N");
- if(pv)
- {
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_points_triangle_polygons::get_Np()const
- {
- const ri_parameters::value_type* pv = this->get_parameter("Np");
- if(pv)
- {
- return &(pv->float_values[0]);
- }
- return NULL;
- }
- const float* ri_points_triangle_polygons::get_Nf()const
- {
- if(is_facevarying("N")){
- const ri_parameters::value_type* pv = this->get_parameter("N");
- if(pv)
- {
- return &(pv->float_values[0]);
- }
- }
- return NULL;
-
- }
-
- bool ri_points_triangle_polygons::is_facevarying(const char* key)const
- {
- int id = pGeo_->get_classifier().find(key);
- if(id>=0){
- const ri_classifier::param_data& data = pGeo_->get_classifier()[id];
- if(IsFaceVarying( data.get_class() ))return true;
- }
- return false;
- }
-
-
-
- const float* ri_points_triangle_polygons::get_Cs()const
- {
- return pGeo_->get_Cs();
- }
- const float* ri_points_triangle_polygons::get_Os()const
- {
- return pGeo_->get_Os();
- }
- const int* ri_points_triangle_polygons::get_verts()const
- {
- return &indeices_[0];
- }
- //------------------------------------------------------
-
-
-
-
-
-
-
-
-
-
-
-
-
- }
- }