/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

  1. #include "ri_geometry.h"
  2. #include "ri_classifier.h"
  3. #include <assert.h>
  4. namespace kaze{
  5. namespace ri{
  6. static
  7. int SumArray(const RtInt ar[], int n)
  8. {
  9. int nRet = 0;
  10. for(int i = 0;i<n;i++){nRet += ar[i];}
  11. return nRet;
  12. }
  13. static
  14. int GetSize(int nClass, RtInt vertex = 1, RtInt varying = 1, RtInt uniform = 1, RtInt facevarying = 1)
  15. {
  16. switch(nClass)
  17. {
  18. case ri_classifier::VERTEX: return vertex;
  19. case ri_classifier::UNIFORM:
  20. case ri_classifier::CONSTANT: return uniform;
  21. case ri_classifier::VARYING: return varying;//const
  22. case ri_classifier::FACEVARYING: return facevarying;
  23. }
  24. return 1;
  25. }
  26. static
  27. void AddParams(
  28. ri_parameters* p_params,
  29. ri_classifier* p_cls,
  30. RtToken token, RtPointer param,
  31. RtInt vertex = 1, RtInt varying = 1, RtInt uniform = 1, RtInt facevarying = 1
  32. ){
  33. typedef const char* PCTR;
  34. int nID = p_cls->def(token);
  35. if(nID<0)return;
  36. const ri_classifier::param_data & data = (*p_cls)[nID];
  37. int nSz = GetSize(data.get_class(), vertex, varying, uniform, facevarying);
  38. switch (data.get_type()) {
  39. case ri_classifier::INTEGER:
  40. p_params->set(data.get_name(), (const RtInt*)param, data.get_size()*nSz);
  41. break;
  42. case ri_classifier::STRING:
  43. p_params->set(data.get_name(), (const PCTR *)param, data.get_size()*nSz);
  44. break;
  45. case ri_classifier::FLOAT:
  46. case ri_classifier::COLOR:
  47. case ri_classifier::POINT:
  48. case ri_classifier::VECTOR:
  49. case ri_classifier::NORMAL:
  50. case ri_classifier::HPOINT:
  51. case ri_classifier::MATRIX:
  52. p_params->set(data.get_name(), (const RtFloat *)param, data.get_size()*nSz);
  53. break;
  54. default:
  55. break;
  56. }
  57. }
  58. static
  59. void AddParams(
  60. ri_parameters* p_params,
  61. ri_classifier* p_cls,
  62. RtInt count, RtToken tokens[], RtPointer params[],
  63. RtInt vertex = 1, RtInt varying = 1, RtInt uniform = 1, RtInt facevarying = 1
  64. ){
  65. if(count){
  66. for(int i = 0;i<count;i++){
  67. AddParams(p_params, p_cls, tokens[i], params[i], vertex, varying, uniform, facevarying);
  68. }
  69. }
  70. }
  71. //------------------------------------------------------
  72. const float* ri_base_polygons::get_P()const{
  73. const ri_parameters::value_type* pv = params_.get("P");
  74. if(pv){
  75. return &(pv->float_values[0]);
  76. }
  77. return NULL;
  78. }
  79. const float* ri_base_polygons::get_N()const{
  80. const ri_parameters::value_type* pv = params_.get("N");
  81. if(pv){
  82. return &(pv->float_values[0]);
  83. }
  84. return NULL;
  85. }
  86. const float* ri_base_polygons::get_Np()const{
  87. const ri_parameters::value_type* pv = params_.get("Np");
  88. if(pv){
  89. return &(pv->float_values[0]);
  90. }
  91. return NULL;
  92. }
  93. const float* ri_base_polygons::get_Cs()const{
  94. const ri_parameters::value_type* pv = params_.get("Cs");
  95. if(pv){
  96. return &(pv->float_values[0]);
  97. }
  98. return NULL;
  99. }
  100. const float* ri_base_polygons::get_Os()const{
  101. const ri_parameters::value_type* pv = params_.get("Os");
  102. if(pv){
  103. return &(pv->float_values[0]);
  104. }
  105. return NULL;
  106. }
  107. //------------------------------------------------------
  108. //RiPolygon
  109. ri_polygon::ri_polygon(const ri_classifier* p_cls, RtInt nverts, RtInt n, RtToken tokens[], RtPointer params[])
  110. {
  111. params_.set("nverts",nverts);
  112. if(n){
  113. ri_saving_classifier cls(p_cls, &(this->clsf_));
  114. AddParams(&params_, &cls, n, tokens, params, nverts, nverts, 1, 1);
  115. }
  116. }
  117. const float* ri_polygon::get_P()const{
  118. const ri_parameters::value_type* pv = params_.get("P");
  119. if(pv){
  120. return &(pv->float_values[0]);
  121. }
  122. return NULL;
  123. }
  124. const float* ri_polygon::get_Cs()const{
  125. const ri_parameters::value_type* pv = params_.get("Cs");
  126. if(pv){
  127. return &(pv->float_values[0]);
  128. }
  129. return NULL;
  130. }
  131. const float* ri_polygon::get_Os()const{
  132. const ri_parameters::value_type* pv = params_.get("Os");
  133. if(pv){
  134. return &(pv->float_values[0]);
  135. }
  136. return NULL;
  137. }
  138. int ri_polygon::get_nverts()const{
  139. return (params_.get("nverts"))->integer_values[0];
  140. }
  141. //------------------------------------------------------
  142. //RiGeneralPolygon
  143. ri_general_polygon::ri_general_polygon(const ri_classifier* p_cls, RtInt nloops, RtInt nverts[], RtInt n, RtToken tokens[], RtPointer params[])
  144. {
  145. int nPts = SumArray(nverts, nloops);
  146. params_.set("nloops",nloops);
  147. params_.set("nverts",nverts, nloops);
  148. if(n){
  149. ri_saving_classifier cls(p_cls, &(this->clsf_));
  150. AddParams(&params_, &cls, n, tokens, params, nPts, nPts, 1, 1);
  151. }
  152. }
  153. const float* ri_general_polygon::get_P()const{
  154. const ri_parameters::value_type* pv = params_.get("P");
  155. if(pv){
  156. return &(pv->float_values[0]);
  157. }
  158. return NULL;
  159. }
  160. const float* ri_general_polygon::get_Cs()const{
  161. const ri_parameters::value_type* pv = params_.get("Cs");
  162. if(pv){
  163. return &(pv->float_values[0]);
  164. }
  165. return NULL;
  166. }
  167. const float* ri_general_polygon::get_Os()const{
  168. const ri_parameters::value_type* pv = params_.get("Os");
  169. if(pv){
  170. return &(pv->float_values[0]);
  171. }
  172. return NULL;
  173. }
  174. const int* ri_general_polygon::get_nverts()const{
  175. return &((params_.get("nverts"))->integer_values[0]);
  176. }
  177. int ri_general_polygon::get_nloops()const{
  178. return (params_.get("nloops"))->integer_values[0];
  179. }
  180. //------------------------------------------------------
  181. //RiPointsPolygons
  182. ri_points_polygons::ri_points_polygons(const ri_classifier* p_cls, RtInt npolys, RtInt nverts[], RtInt verts[], RtInt n, RtToken tokens[], RtPointer params[])
  183. {
  184. int nPts = SumArray(nverts, npolys);
  185. int psz = 0;
  186. for (int i = 0; i < nPts; i++ )
  187. {
  188. if ( psz < verts[ i ] ){
  189. psz = verts[ i ];
  190. }
  191. }
  192. params_.set("npolys",npolys);
  193. params_.set("nverts",nverts, npolys);
  194. params_.set("verts",verts, nPts);
  195. if(n){
  196. ri_saving_classifier cls(p_cls, &(this->clsf_));
  197. AddParams(&params_, &cls, n, tokens, params, psz + 1, psz + 1, npolys, nPts);
  198. }
  199. }
  200. ri_points_polygons::ri_points_polygons(const ri_classifier* p_cls, RtInt nverts, RtInt n, RtToken tokens[], RtPointer params[])
  201. {
  202. int npolys = 1;
  203. RtInt nverts_[] = {nverts};
  204. std::vector<RtInt> verts_(nverts);
  205. for(int i=0;i<nverts;i++)verts_[i]=i;
  206. int nPts = nverts;
  207. int psz = 0;
  208. for (int i = 0; i < nPts; i++ )
  209. {
  210. if ( psz < verts_[ i ] ){
  211. psz = verts_[ i ];
  212. }
  213. }
  214. params_.set("npolys",npolys);
  215. params_.set("nverts",nverts_, npolys);
  216. params_.set("verts",&verts_[0], nverts);
  217. if(n){
  218. ri_saving_classifier cls(p_cls, &(this->clsf_));
  219. AddParams(&params_, &cls, n, tokens, params, psz + 1, psz + 1, npolys, nPts);
  220. }
  221. }
  222. const float* ri_points_polygons::get_P()const{
  223. const ri_parameters::value_type* pv = params_.get("P");
  224. if(pv){
  225. return &(pv->float_values[0]);
  226. }
  227. return NULL;
  228. }
  229. const float* ri_points_polygons::get_Cs()const{
  230. const ri_parameters::value_type* pv = params_.get("Cs");
  231. if(pv){
  232. return &(pv->float_values[0]);
  233. }
  234. return NULL;
  235. }
  236. const float* ri_points_polygons::get_Os()const{
  237. const ri_parameters::value_type* pv = params_.get("Os");
  238. if(pv){
  239. return &(pv->float_values[0]);
  240. }
  241. return NULL;
  242. }
  243. int ri_points_polygons::get_npolys()const{
  244. return (params_.get("npolys"))->integer_values[0];
  245. }
  246. const int* ri_points_polygons::get_nverts()const{
  247. return &((params_.get("nverts"))->integer_values[0]);
  248. }
  249. const int* ri_points_polygons::get_verts()const{
  250. return &((params_.get("verts"))->integer_values[0]);
  251. }
  252. void ri_points_polygons::add_polygon(RtInt nverts, RtInt n, RtToken tokens[], RtPointer params[])
  253. {
  254. RtInt nverts_[] = {nverts};
  255. std::vector<RtInt> verts_(nverts);
  256. for(int i=0;i<nverts;i++)verts_[i]=i;
  257. /*
  258. std::vector<int>& nverts = (params_.get("nverts"))->integer_values;
  259. for()
  260. npolys += get_npolys();
  261. params_.set("npolys",npolys);
  262. params_.set("nverts",nverts, npolys);
  263. params_.set("verts",verts, nPts);
  264. if(n){
  265. ri_saving_classifier cls(p_cls, &(this->clsf_));
  266. AddParams(&params_, &cls, n, tokens, params, psz + 1, psz + 1, npolys, nPts);
  267. }
  268. */
  269. }
  270. //------------------------------------------------------
  271. //RiPointsGeneralPolygons
  272. 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[])
  273. {
  274. int nVts = SumArray(nloops, npolys);
  275. int nv = SumArray(nverts, nVts);
  276. int psz = 0;
  277. for (int i = 0; i < nv; i++ )
  278. {
  279. if ( psz < verts[ i ] ){
  280. psz = verts[ i ];
  281. }
  282. }
  283. params_.set("npolys",npolys);
  284. params_.set("nloops",nloops, npolys);
  285. params_.set("nverts",nverts, nVts);
  286. params_.set("verts",verts, nv);
  287. if(n){
  288. ri_saving_classifier cls(p_cls, &(this->clsf_));
  289. AddParams(&params_, &cls, n, tokens, params, psz + 1, psz + 1, npolys, nv);
  290. }
  291. }
  292. const float* ri_points_general_polygons::get_P()const{
  293. const ri_parameters::value_type* pv = params_.get("P");
  294. if(pv){
  295. return &(pv->float_values[0]);
  296. }
  297. return NULL;
  298. }
  299. const float* ri_points_general_polygons::get_Cs()const{
  300. const ri_parameters::value_type* pv = params_.get("Cs");
  301. if(pv){
  302. return &(pv->float_values[0]);
  303. }
  304. return NULL;
  305. }
  306. const float* ri_points_general_polygons::get_Os()const{
  307. const ri_parameters::value_type* pv = params_.get("Os");
  308. if(pv){
  309. return &(pv->float_values[0]);
  310. }
  311. return NULL;
  312. }
  313. int ri_points_general_polygons::get_npolys()const{
  314. return (params_.get("npolys"))->integer_values[0];
  315. }
  316. const int* ri_points_general_polygons::get_nloops()const{
  317. return &((params_.get("nloops"))->integer_values[0]);
  318. }
  319. const int* ri_points_general_polygons::get_nverts()const{
  320. return &((params_.get("nverts"))->integer_values[0]);
  321. }
  322. const int* ri_points_general_polygons::get_verts()const{
  323. return &((params_.get("verts"))->integer_values[0]);
  324. }
  325. //------------------------------------------------------
  326. struct T2I {
  327. const char* name;
  328. int num;
  329. };
  330. static T2I ORDERS[] =
  331. {
  332. {RI_BILINEAR, 2},
  333. {RI_BIQUADRATIC, 3},
  334. {RI_BICUBIC, 4},
  335. {RI_LINEAR, 2},
  336. {RI_QUADRATIC, 3},
  337. {RI_CUBIC, 4},
  338. {NULL,0}
  339. };
  340. static
  341. int GetOrder(RtToken type)
  342. {
  343. int i = 0;
  344. while (ORDERS[i].name) {
  345. if(strcmp(ORDERS[i].name, type)==0)return ORDERS[i].num;
  346. i++;
  347. }
  348. return 0;
  349. }
  350. //------------------------------------------------------
  351. //RiPatch
  352. ri_patch::ri_patch(const ri_classifier* p_cls, RtToken type, RtInt n, RtToken tokens[], RtPointer params[])
  353. {
  354. int nv = GetOrder(type);
  355. if(nv){
  356. params_.set("type", type);
  357. if(n){
  358. ri_saving_classifier cls(p_cls, &(this->clsf_));
  359. AddParams(&params_, &cls, n, tokens, params, nv * nv, 4);
  360. }
  361. }
  362. }
  363. const char* ri_patch::get_type()const{
  364. return (params_.get("type"))->string_values[0].c_str();
  365. }
  366. const float* ri_patch::get_P()const{
  367. const ri_parameters::value_type* pv = params_.get("P");
  368. if(pv){
  369. return &(pv->float_values[0]);
  370. }
  371. return NULL;
  372. }
  373. const float* ri_patch::get_Cs()const{
  374. const ri_parameters::value_type* pv = params_.get("Cs");
  375. if(pv){
  376. return &(pv->float_values[0]);
  377. }
  378. return NULL;
  379. }
  380. const float* ri_patch::get_Os()const{
  381. const ri_parameters::value_type* pv = params_.get("Os");
  382. if(pv){
  383. return &(pv->float_values[0]);
  384. }
  385. return NULL;
  386. }
  387. std::string ri_patch::get_ubasis()const{
  388. std::string str;
  389. attr_.get("Basis", "ubasis", str);
  390. return str;
  391. }
  392. std::string ri_patch::get_vbasis()const{
  393. std::string str;
  394. attr_.get("Basis", "vbasis", str);
  395. return str;
  396. }
  397. int ri_patch::get_ustep ()const{
  398. int nStep=0;
  399. attr_.get("Basis", "ustep", nStep);
  400. return nStep;
  401. }
  402. int ri_patch::get_vstep ()const{
  403. int nStep=0;
  404. attr_.get("Basis", "vstep", nStep);
  405. return nStep;
  406. }
  407. //------------------------------------------------------
  408. //RiPatchMesh
  409. 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[])
  410. {
  411. int nOrder = GetOrder(type);
  412. int nupatch = 1;
  413. int nvpatch = 1;
  414. int ii = 0;
  415. if(nOrder == 2){//linear
  416. if(strcmp(uwrap,RI_PERIODIC)==0){//loop
  417. nupatch = nu;
  418. }else if(strcmp(uwrap,RI_NONPERIODIC)==0){//open
  419. nupatch = nu - 1;
  420. ii += 1;
  421. }else{
  422. nOrder = 0;//error
  423. }
  424. if(strcmp(vwrap,RI_PERIODIC)==0){//loop
  425. nvpatch = nv;
  426. }else if(strcmp(vwrap,RI_NONPERIODIC)==0){//open
  427. nvpatch = nv - 1;
  428. ii += 1;
  429. }else{
  430. nOrder = 0;//error
  431. }
  432. ii += nupatch + nvpatch;
  433. //ii = nu+nv
  434. }else if(nOrder == 4){//cubic
  435. RtInt nustep = ustep;
  436. RtInt nvstep = vstep;
  437. if (strcmp(uwrap,RI_PERIODIC)==0){
  438. nupatch = nu / nustep;
  439. }else if (strcmp(uwrap,RI_NONPERIODIC)==0){
  440. nupatch = ( nu - 4 ) / nustep + 1;
  441. ii += 1;
  442. }else{
  443. nOrder = 0;//error
  444. }
  445. if (strcmp(vwrap,RI_PERIODIC)==0){
  446. nvpatch = nv / nvstep;
  447. }else if (strcmp(vwrap,RI_NONPERIODIC)==0){
  448. nvpatch = ( nv - 4 ) / nvstep + 1;
  449. ii += 1;
  450. }else{
  451. nOrder = 0;//error
  452. }
  453. }else{
  454. nOrder = 0;
  455. }
  456. params_.set("type",type);
  457. params_.set("nu",nu);
  458. params_.set("nv",nv);
  459. params_.set("uwrap",uwrap);
  460. params_.set("vwrap",vwrap);
  461. if(n){
  462. ri_saving_classifier cls(p_cls, &(this->clsf_));
  463. AddParams(&params_, &cls, n, tokens, params, nu * nv, ii, nupatch * nvpatch);
  464. }
  465. }
  466. const char* ri_patch_mesh::get_type()const{
  467. return (params_.get("type"))->string_values[0].c_str();
  468. }
  469. int ri_patch_mesh::get_nu()const{
  470. return (params_.get("nu"))->integer_values[0];
  471. }
  472. int ri_patch_mesh::get_nv()const{
  473. return (params_.get("nv"))->integer_values[0];
  474. }
  475. const char* ri_patch_mesh::get_uwrap()const{
  476. return (params_.get("uwrap"))->string_values[0].c_str();
  477. }
  478. const char* ri_patch_mesh::get_vwrap()const{
  479. return (params_.get("vwrap"))->string_values[0].c_str();
  480. }
  481. const float* ri_patch_mesh::get_P()const{
  482. const ri_parameters::value_type* pv = params_.get("P");
  483. if(pv){
  484. return &(pv->float_values[0]);
  485. }
  486. return NULL;
  487. }
  488. const float* ri_patch_mesh::get_Cs()const{
  489. const ri_parameters::value_type* pv = params_.get("Cs");
  490. if(pv){
  491. return &(pv->float_values[0]);
  492. }
  493. return NULL;
  494. }
  495. const float* ri_patch_mesh::get_Os()const{
  496. const ri_parameters::value_type* pv = params_.get("Os");
  497. if(pv){
  498. return &(pv->float_values[0]);
  499. }
  500. return NULL;
  501. }
  502. std::string ri_patch_mesh::get_ubasis()const{
  503. std::string str;
  504. attr_.get("Basis", "ubasis", str);
  505. return str;
  506. }
  507. std::string ri_patch_mesh::get_vbasis()const{
  508. std::string str;
  509. attr_.get("Basis", "vbasis", str);
  510. return str;
  511. }
  512. int ri_patch_mesh::get_ustep ()const{
  513. int nStep=0;
  514. attr_.get("Basis", "ustep", nStep);
  515. return nStep;
  516. }
  517. int ri_patch_mesh::get_vstep ()const{
  518. int nStep=0;
  519. attr_.get("Basis", "vstep", nStep);
  520. return nStep;
  521. }
  522. //------------------------------------------------------
  523. //RiNuPatch
  524. 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[])
  525. {
  526. params_.set("nu", nu);
  527. params_.set("uorder", uorder);
  528. params_.set("uknot", uknot, nu+uorder);
  529. params_.set("umin", umin);
  530. params_.set("umax", umax);
  531. params_.set("nv", nv);
  532. params_.set("vorder", vorder);
  533. params_.set("vknot", vknot, nv+vorder);
  534. params_.set("vmin", vmin);
  535. params_.set("vmax", vmax);
  536. if(n){
  537. ri_saving_classifier cls(p_cls, &(this->clsf_));
  538. AddParams(&params_, &cls, n, tokens, params, nu * nv, ( 2 + nu - uorder ) * ( 2 + nv - vorder ), ( 1 + nu - uorder ) * ( 1 + nv - vorder ));
  539. }
  540. }
  541. int ri_nu_patch::get_nu()const{
  542. return (params_.get("nu"))->integer_values[0];
  543. }
  544. int ri_nu_patch::get_nv()const{
  545. return (params_.get("nv"))->integer_values[0];
  546. }
  547. int ri_nu_patch::get_uorder()const{
  548. return (params_.get("uorder"))->integer_values[0];
  549. }
  550. int ri_nu_patch::get_vorder()const{
  551. return (params_.get("vorder"))->integer_values[0];
  552. }
  553. const std::vector<float>& ri_nu_patch::get_uknot()const{
  554. return (params_.get("uknot"))->float_values;
  555. }
  556. const std::vector<float>& ri_nu_patch::get_vknot()const{
  557. return (params_.get("vknot"))->float_values;
  558. }
  559. float ri_nu_patch::get_umin()const{
  560. return (params_.get("umin"))->float_values[0];
  561. }
  562. float ri_nu_patch::get_umax()const{
  563. return (params_.get("umax"))->float_values[0];
  564. }
  565. float ri_nu_patch::get_vmin()const{
  566. return (params_.get("vmin"))->float_values[0];
  567. }
  568. float ri_nu_patch::get_vmax()const{
  569. return (params_.get("vmax"))->float_values[0];
  570. }
  571. const float* ri_nu_patch::get_Pw()const{
  572. const ri_parameters::value_type* pv = params_.get("Pw");
  573. if(pv){
  574. return &(pv->float_values[0]);
  575. }
  576. return NULL;
  577. }
  578. const float* ri_nu_patch::get_Cs()const{
  579. const ri_parameters::value_type* pv = params_.get("Cs");
  580. if(pv){
  581. return &(pv->float_values[0]);
  582. }
  583. return NULL;
  584. }
  585. const float* ri_nu_patch::get_Os()const{
  586. const ri_parameters::value_type* pv = params_.get("Os");
  587. if(pv){
  588. return &(pv->float_values[0]);
  589. }
  590. return NULL;
  591. }
  592. //------------------------------------------------------
  593. //RiTrimCurve
  594. 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[])
  595. {
  596. int ttlc = SumArray(ncurves, nloops);
  597. int nbcoords = 0;
  598. int knotsize = 0;
  599. for (int i = 0; i < ttlc; i++ )
  600. {
  601. nbcoords += n[ i ];
  602. knotsize += order[ i ] + n[ i ];
  603. }
  604. params_.set("nloops", nloops);
  605. params_.set("ncurves", ncurves, nloops);
  606. params_.set("order", order, ttlc);
  607. params_.set("knot", knot, knotsize);
  608. params_.set("min", min, ttlc);
  609. params_.set("max", max, ttlc);
  610. params_.set("n", n, ttlc);
  611. params_.set("u", u, nbcoords);
  612. params_.set("v", v, nbcoords);
  613. params_.set("w", w, nbcoords);
  614. }
  615. //------------------------------------------------------
  616. //RiSphere
  617. ri_sphere::ri_sphere(const ri_classifier* p_cls, RtFloat radius, RtFloat zmin, RtFloat zmax, RtFloat tmax, RtInt n, RtToken tokens[], RtPointer params[])
  618. {
  619. params_.set("radius",radius);
  620. params_.set("zmin",zmin);
  621. params_.set("zmax",zmax);
  622. params_.set("tmax",tmax);
  623. if(n){
  624. ri_saving_classifier cls(p_cls, &(this->clsf_));
  625. AddParams(&params_, &cls, n, tokens, params, 4, 4);
  626. }
  627. }
  628. float ri_sphere::get_radius()const{
  629. return (params_.get("radius"))->float_values[0];
  630. }
  631. float ri_sphere::get_zmin()const{
  632. return (params_.get("zmin"))->float_values[0];
  633. }
  634. float ri_sphere::get_zmax()const{
  635. return (params_.get("zmax"))->float_values[0];
  636. }
  637. float ri_sphere::get_tmax()const{
  638. return (params_.get("tmax"))->float_values[0];
  639. }
  640. //------------------------------------------------------
  641. //RiCone
  642. ri_cone::ri_cone(const ri_classifier* p_cls, RtFloat height, RtFloat radius, RtFloat tmax, RtInt n, RtToken tokens[], RtPointer params[])
  643. {
  644. params_.set("height",height);
  645. params_.set("radius",radius);
  646. params_.set("tmax",tmax);
  647. if(n){
  648. ri_saving_classifier cls(p_cls, &(this->clsf_));
  649. AddParams(&params_, &cls, n, tokens, params, 4, 4);
  650. }
  651. }
  652. float ri_cone::get_height()const{
  653. return (params_.get("height"))->float_values[0];
  654. }
  655. float ri_cone::get_radius()const{
  656. return (params_.get("radius"))->float_values[0];
  657. }
  658. float ri_cone::get_tmax()const{
  659. return (params_.get("tmax"))->float_values[0];
  660. }
  661. //------------------------------------------------------
  662. //RiCylinder
  663. ri_cylinder::ri_cylinder(const ri_classifier* p_cls, RtFloat radius, RtFloat zmin, RtFloat zmax, RtFloat tmax, RtInt n, RtToken tokens[], RtPointer params[])
  664. {
  665. params_.set("radius",radius);
  666. params_.set("zmin",zmin);
  667. params_.set("zmax",zmax);
  668. params_.set("tmax",tmax);
  669. if(n){
  670. ri_saving_classifier cls(p_cls, &(this->clsf_));
  671. AddParams(&params_, &cls, n, tokens, params, 4, 4);
  672. }
  673. }
  674. float ri_cylinder::get_radius()const{
  675. return (params_.get("radius"))->float_values[0];
  676. }
  677. float ri_cylinder::get_zmin()const{
  678. return (params_.get("zmin"))->float_values[0];
  679. }
  680. float ri_cylinder::get_zmax()const{
  681. return (params_.get("zmax"))->float_values[0];
  682. }
  683. float ri_cylinder::get_tmax()const{
  684. return (params_.get("tmax"))->float_values[0];
  685. }
  686. //------------------------------------------------------
  687. //RiHyperboloid
  688. ri_hyperboloid::ri_hyperboloid(const ri_classifier* p_cls, RtPoint point1, RtPoint point2, RtFloat tmax, RtInt n, RtToken tokens[], RtPointer params[])
  689. {
  690. params_.set("point1",point1, 3);
  691. params_.set("point2",point2, 3);
  692. params_.set("tmax",tmax);
  693. if(n){
  694. ri_saving_classifier cls(p_cls, &(this->clsf_));
  695. AddParams(&params_, &cls, n, tokens, params, 4, 4);
  696. }
  697. }
  698. const float* ri_hyperboloid::get_point1()const{
  699. return &((params_.get("point1"))->float_values[0]);
  700. }
  701. const float* ri_hyperboloid::get_point2()const{
  702. return &((params_.get("point2"))->float_values[0]);
  703. }
  704. float ri_hyperboloid::get_tmax()const{
  705. return (params_.get("tmax"))->float_values[0];
  706. }
  707. //------------------------------------------------------
  708. //RiParaboloid
  709. ri_paraboloid::ri_paraboloid(const ri_classifier* p_cls, RtFloat rmax, RtFloat zmin, RtFloat zmax, RtFloat tmax, RtInt n, RtToken tokens[], RtPointer params[])
  710. {
  711. params_.set("rmax",rmax);
  712. params_.set("zmin",zmin);
  713. params_.set("zmax",zmax);
  714. params_.set("tmax",tmax);
  715. if(n){
  716. ri_saving_classifier cls(p_cls, &(this->clsf_));
  717. AddParams(&params_, &cls, n, tokens, params, 4, 4);
  718. }
  719. }
  720. float ri_paraboloid::get_rmax()const{
  721. return (params_.get("rmax"))->float_values[0];
  722. }
  723. float ri_paraboloid::get_zmin()const{
  724. return (params_.get("zmin"))->float_values[0];
  725. }
  726. float ri_paraboloid::get_zmax()const{
  727. return (params_.get("zmax"))->float_values[0];
  728. }
  729. float ri_paraboloid::get_tmax()const{
  730. return (params_.get("tmax"))->float_values[0];
  731. }
  732. //------------------------------------------------------
  733. //RiDisk
  734. ri_disk::ri_disk(const ri_classifier* p_cls, RtFloat height, RtFloat radius, RtFloat tmax, RtInt n, RtToken tokens[], RtPointer params[])
  735. {
  736. params_.set("height",height);
  737. params_.set("radius",radius);
  738. params_.set("tmax",tmax);
  739. if(n){
  740. ri_saving_classifier cls(p_cls, &(this->clsf_));
  741. AddParams(&params_, &cls, n, tokens, params, 4, 4);
  742. }
  743. }
  744. float ri_disk::get_height()const{
  745. return (params_.get("height"))->float_values[0];
  746. }
  747. float ri_disk::get_radius()const{
  748. return (params_.get("radius"))->float_values[0];
  749. }
  750. float ri_disk::get_tmax()const{
  751. return (params_.get("tmax"))->float_values[0];
  752. }
  753. //------------------------------------------------------
  754. //RiTorus
  755. 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[])
  756. {
  757. params_.set("majrad",majrad);
  758. params_.set("minrad",minrad);
  759. params_.set("phimin",phimin);
  760. params_.set("phimax",phimax);
  761. params_.set("tmax",tmax);
  762. if(n){
  763. ri_saving_classifier cls(p_cls, &(this->clsf_));
  764. AddParams(&params_, &cls, n, tokens, params, 4, 4);
  765. }
  766. }
  767. float ri_torus::get_majrad()const{
  768. return (params_.get("majrad"))->float_values[0];
  769. }
  770. float ri_torus::get_minrad()const{
  771. return (params_.get("minrad"))->float_values[0];
  772. }
  773. float ri_torus::get_phimin()const{
  774. return (params_.get("phimin"))->float_values[0];
  775. }
  776. float ri_torus::get_phimax()const{
  777. return (params_.get("phimax"))->float_values[0];
  778. }
  779. float ri_torus::get_tmax()const{
  780. return (params_.get("tmax"))->float_values[0];
  781. }
  782. //------------------------------------------------------
  783. //RiBlobby
  784. 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[])
  785. {
  786. params_.set("nleaf",nleaf);
  787. params_.set("ncode",ncode);
  788. params_.set("code",code, ncode);
  789. params_.set("nflt",nflt);
  790. params_.set("flt",flt, nflt);
  791. params_.set("nstr",nstr);
  792. params_.set("str",str,nstr);
  793. if(n){
  794. ri_saving_classifier cls(p_cls, &(this->clsf_));
  795. AddParams(&params_, &cls, n, tokens, params, nleaf, nleaf);
  796. }
  797. }
  798. //------------------------------------------------------
  799. //RiCurves
  800. ri_curves::ri_curves(const ri_classifier* p_cls, RtToken type, RtInt ncurves, RtInt nvertices[], RtToken wrap, RtInt n, RtToken tokens[], RtPointer params[])
  801. {
  802. int vn = SumArray(nvertices, ncurves);
  803. params_.set("type",type);
  804. params_.set("ncurves", ncurves);
  805. params_.set("nvertices", nvertices, ncurves);
  806. params_.set("wrap",wrap);
  807. if(n){
  808. ri_saving_classifier cls(p_cls, &(this->clsf_));
  809. AddParams(&params_, &cls, n, tokens, params, vn, ncurves*2, ncurves);//TODO
  810. }
  811. }
  812. int ri_curves::get_ncurves()const
  813. {
  814. return (params_.get("ncurves"))->integer_values[0];
  815. }
  816. const int* ri_curves::get_nvertices()const
  817. {
  818. return &((params_.get("nvertices"))->integer_values[0]);
  819. }
  820. const char* ri_curves::get_type()const
  821. {
  822. return (params_.get("type"))->string_values[0].c_str();
  823. }
  824. const char* ri_curves::get_wrap()const
  825. {
  826. return (params_.get("wrap"))->string_values[0].c_str();
  827. }
  828. const float* ri_curves::get_P()const{
  829. const ri_parameters::value_type* pv = params_.get("P");
  830. if(pv){
  831. return &(pv->float_values[0]);
  832. }
  833. return NULL;
  834. }
  835. const float* ri_curves::get_width()const
  836. {
  837. const ri_parameters::value_type* pv = params_.get("width");
  838. if(pv){
  839. return &(pv->float_values[0]);
  840. }
  841. return NULL;
  842. }
  843. const float* ri_curves::get_Cs()const{
  844. const ri_parameters::value_type* pv = params_.get("Cs");
  845. if(pv){
  846. return &(pv->float_values[0]);
  847. }
  848. return NULL;
  849. }
  850. const float* ri_curves::get_Os()const{
  851. const ri_parameters::value_type* pv = params_.get("Os");
  852. if(pv){
  853. return &(pv->float_values[0]);
  854. }
  855. return NULL;
  856. }
  857. float ri_curves::get_constantwidth()const{
  858. const ri_parameters::value_type* pv = params_.get("constantwidth");
  859. if(pv){
  860. return pv->float_values[0];
  861. }
  862. return 1.0f;
  863. }
  864. //------------------------------------------------------
  865. //RiPoints
  866. ri_points::ri_points(const ri_classifier* p_cls, RtInt nverts, RtInt n, RtToken tokens[], RtPointer params[])
  867. {
  868. params_.set("nverts",nverts);
  869. if(n){
  870. ri_saving_classifier cls(p_cls, &(this->clsf_));
  871. AddParams(&params_, &cls, n, tokens, params, nverts, nverts);//vertex, varying
  872. }
  873. }
  874. const float* ri_points::get_P()const{
  875. const ri_parameters::value_type* pv = params_.get("P");
  876. if(pv){
  877. return &(pv->float_values[0]);
  878. }
  879. return NULL;
  880. }
  881. const float* ri_points::get_width()const
  882. {
  883. const ri_parameters::value_type* pv = params_.get("width");
  884. if(pv){
  885. return &(pv->float_values[0]);
  886. }
  887. return NULL;
  888. }
  889. const float* ri_points::get_Cs()const{
  890. const ri_parameters::value_type* pv = params_.get("Cs");
  891. if(pv){
  892. return &(pv->float_values[0]);
  893. }
  894. return NULL;
  895. }
  896. const float* ri_points::get_Os()const{
  897. const ri_parameters::value_type* pv = params_.get("Os");
  898. if(pv){
  899. return &(pv->float_values[0]);
  900. }
  901. return NULL;
  902. }
  903. float ri_points::get_constantwidth()const{
  904. const ri_parameters::value_type* pv = params_.get("constantwidth");
  905. if(pv){
  906. return pv->float_values[0];
  907. }
  908. return 1.0f;
  909. }
  910. int ri_points::get_nverts()const{
  911. return (params_.get("nverts"))->integer_values[0];
  912. }
  913. //------------------------------------------------------
  914. //RiSubdivisionMesh
  915. 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[])
  916. {
  917. int nv = SumArray(nverts,nf);
  918. RtInt isz = 0;
  919. RtInt fsz = 0;
  920. for (int i = 0; i < ntags*2; i++ )
  921. {
  922. if ( i % 2 == 0 )
  923. isz += nargs[ i ];
  924. else
  925. fsz += nargs[ i ];
  926. }
  927. RtInt psz = 0;
  928. for (int i = 0; i < nv; i++ )
  929. {
  930. if ( psz < verts[ i ] )
  931. psz = verts[ i ];
  932. }
  933. params_.set("mask",mask);
  934. params_.set("nf",nf);
  935. params_.set("nverts",nverts, nf);
  936. params_.set("verts",verts, nv);
  937. params_.set("tags",tags, ntags);
  938. params_.set("nargs",nargs, ntags * 2);
  939. params_.set("intargs",intargs, isz);
  940. params_.set("floatargs",floatargs, isz);
  941. if(n){
  942. ri_saving_classifier cls(p_cls, &(this->clsf_));
  943. AddParams(&params_, &cls, n, tokens, params, psz + 1, psz + 1, nf, nv);
  944. }
  945. }
  946. //------------------------------------------------------
  947. //RiProcedual
  948. ri_DelayedReadArchive::ri_DelayedReadArchive(const ri_classifier* p_cls, RtToken data[], RtBound bound)
  949. {
  950. RtToken filename = data[0];
  951. params_.set("filename",filename);
  952. params_.set("bound",bound, 6);
  953. }
  954. ri_RunProgram::ri_RunProgram(const ri_classifier* p_cls, RtToken data[], RtBound bound)
  955. {
  956. RtToken programname = data[0];
  957. RtToken argument = data[1];
  958. params_.set("programname",programname);
  959. params_.set("argument",argument);
  960. params_.set("bound",bound, 6);
  961. }
  962. ri_DynamicLoad::ri_DynamicLoad(const ri_classifier* p_cls, RtToken data[], RtBound bound)
  963. {
  964. params_.set("bound",bound, 6);
  965. }
  966. //------------------------------------------------------
  967. //RiGeometry name is "teapot"
  968. ri_teapot::ri_teapot(){
  969. //assert(0);
  970. }
  971. //------------------------------------------------------
  972. //RiGeometry name is "bunny"
  973. ri_bunny::ri_bunny(){
  974. //assert(0);
  975. }
  976. //------------------------------------------------------
  977. //Internal
  978. static
  979. void CreateIndicesPolygon(
  980. std::vector<int>& indices,
  981. std::vector<int>& tri2poly,
  982. std::vector<int>& fvindices, //for face varying
  983. int nverts)
  984. {
  985. int i=1;
  986. for(int k=0;k<nverts-2;k++)
  987. {
  988. indices.push_back(0);
  989. indices.push_back(i);
  990. indices.push_back(i+1);
  991. tri2poly.push_back(0);//
  992. i++;
  993. }
  994. fvindices = indices;
  995. }
  996. static
  997. void CreateIndicesGeneralPolygon(
  998. std::vector<int>& indices,
  999. std::vector<int>& tri2poly,
  1000. std::vector<int>& fvindices, //for face varying
  1001. int nloops, const int nverts[])
  1002. {
  1003. int k = 0;
  1004. {
  1005. int nV = nverts[0];
  1006. {
  1007. for(int j=0;j<nV-2;j++)
  1008. {
  1009. int s = k+j;
  1010. indices.push_back(k);
  1011. indices.push_back(s+1);
  1012. indices.push_back(s+2);
  1013. tri2poly.push_back(0);//
  1014. }
  1015. }
  1016. k+=nV;
  1017. }
  1018. fvindices = indices;
  1019. #if 0
  1020. for(int i=1;j<nloops;i++){
  1021. int nV = nverts[i];
  1022. {
  1023. for(int j=0;j<nV-2;j++)
  1024. {
  1025. int s = k+j;
  1026. indices.push_back(k);
  1027. indices.push_back(s+1);
  1028. indices.push_back(s+2);
  1029. tri2poly.push_back(0);//
  1030. }
  1031. }
  1032. k+=nV;
  1033. }
  1034. #endif
  1035. }
  1036. static
  1037. void CreateIndicesPointsPolygons(
  1038. std::vector<int>& indices,
  1039. std::vector<int>& tri2poly,
  1040. std::vector<int>& fvindices, //for face varying
  1041. int npolys, const int nverts[], const int verts[])
  1042. {
  1043. int k = 0;
  1044. indices.reserve(npolys*3*2);
  1045. for(int i=0;i<npolys;i++){
  1046. int nV = nverts[i];
  1047. {
  1048. for(int j=0;j<nV-2;j++)
  1049. {
  1050. int s = k+j;
  1051. indices.push_back(verts[k]);
  1052. indices.push_back(verts[s+1]);
  1053. indices.push_back(verts[s+2]);
  1054. fvindices.push_back(k);
  1055. fvindices.push_back(s+1);
  1056. fvindices.push_back(s+2);
  1057. tri2poly.push_back(i);
  1058. }
  1059. }
  1060. k+=nV;
  1061. }
  1062. }
  1063. static
  1064. void CreateIndicesPointsGeneralPolygons(
  1065. std::vector<int>& indices,
  1066. std::vector<int>& tri2poly,
  1067. std::vector<int>& fvindices, //for face varying
  1068. int npolys, const int nloops[], const int nverts[], const int verts[])
  1069. {
  1070. int k = 0;
  1071. int v = 0;
  1072. for(int i=0;i<npolys;i++){
  1073. int nloop = nloops[i];
  1074. {
  1075. int nV = nverts[v];
  1076. {
  1077. for(int j=0;j<nV-2;j++)
  1078. {
  1079. int s = k+j;
  1080. indices.push_back(verts[k]);
  1081. indices.push_back(verts[s+1]);
  1082. indices.push_back(verts[s+2]);
  1083. fvindices.push_back(k);
  1084. fvindices.push_back(s+1);
  1085. fvindices.push_back(s+2);
  1086. tri2poly.push_back(i);
  1087. }
  1088. }
  1089. k+=nV;
  1090. }
  1091. for(int j=1;j<nloop;j++)
  1092. {
  1093. int nV = nverts[v];
  1094. {
  1095. ;
  1096. }
  1097. k+=nV;
  1098. }
  1099. v += nloop;
  1100. }
  1101. }
  1102. static
  1103. bool IsFaceUniform(int nClass)
  1104. {
  1105. if(nClass == ri_classifier::UNIFORM || nClass == ri_classifier::CONSTANT)
  1106. {
  1107. return true;
  1108. }
  1109. return false;
  1110. }
  1111. static
  1112. bool IsFaceVarying(int nClass)
  1113. {
  1114. if(nClass == ri_classifier::FACEVARYING){
  1115. return true;
  1116. }
  1117. return false;
  1118. }
  1119. static
  1120. void ExpandUniformData
  1121. (
  1122. ri_parameters* out,
  1123. const std::vector<int>& tri2poly,
  1124. const ri_classifier* p_cls,
  1125. const ri_parameters* in
  1126. )
  1127. {
  1128. size_t fsz = tri2poly.size();
  1129. size_t sz = p_cls->size();
  1130. for(size_t i=0;i<sz;i++)
  1131. {
  1132. const ri_classifier::param_data& data = (*p_cls)[i];
  1133. if(IsFaceUniform( data.get_class() ))
  1134. {
  1135. switch (data.get_type()) {
  1136. case ri_classifier::INTEGER:
  1137. {
  1138. int dsz = data.get_size();
  1139. std::vector<int> tmp(fsz*dsz);
  1140. const int* p = &(in->get(data.get_name())->integer_values[0]);
  1141. for(int j=0;j<fsz;j++){
  1142. int idx = tri2poly[j];
  1143. for(int k=0;k<dsz;k++){
  1144. tmp[j*dsz + k] = p[idx*dsz + k];
  1145. }
  1146. }
  1147. out->set(data.get_name(), (const int *)&tmp[0], (int)tmp.size());
  1148. }
  1149. break;
  1150. case ri_classifier::STRING:
  1151. {
  1152. int dsz = data.get_size();
  1153. std::vector<std::string> tmp(fsz*dsz);
  1154. const std::string* p = &(in->get(data.get_name())->string_values[0]);
  1155. for(int j=0;j<fsz;j++){
  1156. int idx = tri2poly[j];
  1157. for(int k=0;k<dsz;k++){
  1158. tmp[j*dsz + k] = p[idx*dsz + k];
  1159. }
  1160. }
  1161. out->set(data.get_name(), (const std::string *)&tmp[0], (int)tmp.size());
  1162. }
  1163. break;
  1164. case ri_classifier::FLOAT:
  1165. case ri_classifier::COLOR:
  1166. case ri_classifier::POINT:
  1167. case ri_classifier::VECTOR:
  1168. case ri_classifier::NORMAL:
  1169. case ri_classifier::HPOINT:
  1170. case ri_classifier::MATRIX:
  1171. {
  1172. int dsz = data.get_size();
  1173. std::vector<float> tmp(fsz*dsz);
  1174. const float* p = &(in->get(data.get_name())->float_values[0]);
  1175. for(int j=0;j<fsz;j++){
  1176. int idx = tri2poly[j];
  1177. for(int k=0;k<dsz;k++){
  1178. tmp[j*dsz + k] = p[idx*dsz + k];
  1179. }
  1180. }
  1181. out->set(data.get_name(), (const float *)&tmp[0], (int)tmp.size());
  1182. }
  1183. break;
  1184. default:
  1185. break;
  1186. }
  1187. }
  1188. }
  1189. }
  1190. static
  1191. void ExpandFaceVaryingData
  1192. (
  1193. ri_parameters* out,
  1194. const std::vector<int>& fvindices, //for face varying
  1195. const ri_classifier* p_cls,
  1196. const ri_parameters* in
  1197. )
  1198. {
  1199. size_t isz = fvindices.size();
  1200. size_t sz = p_cls->size();
  1201. for(size_t i=0;i<sz;i++)
  1202. {
  1203. const ri_classifier::param_data& data = (*p_cls)[i];
  1204. if(IsFaceVarying( data.get_class() ))
  1205. {
  1206. switch (data.get_type()) {
  1207. case ri_classifier::INTEGER:
  1208. {
  1209. int dsz = data.get_size();
  1210. std::vector<int> tmp(isz*dsz);
  1211. const int* p = &(in->get(data.get_name())->integer_values[0]);
  1212. for(int j=0;j<isz;j++){
  1213. int idx = fvindices[j];//
  1214. for(int k=0;k<dsz;k++){
  1215. tmp[j*dsz + k] = p[idx*dsz + k];
  1216. }
  1217. }
  1218. out->set(data.get_name(), (const int *)&tmp[0], (int)tmp.size());
  1219. }
  1220. break;
  1221. case ri_classifier::STRING:
  1222. {
  1223. int dsz = data.get_size();
  1224. std::vector<std::string> tmp(isz*dsz);
  1225. const std::string* p = &(in->get(data.get_name())->string_values[0]);
  1226. for(int j=0;j<isz;j++){
  1227. int idx = fvindices[j];
  1228. for(int k=0;k<dsz;k++){
  1229. tmp[j*dsz + k] = p[idx*dsz + k];
  1230. }
  1231. }
  1232. out->set(data.get_name(), (const std::string *)&tmp[0], (int)tmp.size());
  1233. }
  1234. break;
  1235. case ri_classifier::FLOAT:
  1236. case ri_classifier::COLOR:
  1237. case ri_classifier::POINT:
  1238. case ri_classifier::VECTOR:
  1239. case ri_classifier::NORMAL:
  1240. case ri_classifier::HPOINT:
  1241. case ri_classifier::MATRIX:
  1242. {
  1243. int dsz = data.get_size();
  1244. std::vector<float> tmp(isz*dsz);
  1245. const float* p = &(in->get(data.get_name())->float_values[0]);
  1246. for(int j=0;j<isz;j++){
  1247. int idx = fvindices[j];
  1248. for(int k=0;k<dsz;k++){
  1249. tmp[j*dsz + k] = p[idx*dsz + k];
  1250. }
  1251. }
  1252. out->set(data.get_name(), (const float *)&tmp[0], (int)tmp.size());
  1253. }
  1254. break;
  1255. default:
  1256. break;
  1257. }
  1258. }
  1259. }
  1260. }
  1261. ri_points_triangle_polygons::ri_points_triangle_polygons(const ri_polygon* pGeo)
  1262. :pGeo_(pGeo)
  1263. {
  1264. std::vector<int> tri2poly;
  1265. std::vector<int> fvindices;
  1266. CreateIndicesPolygon(indeices_, tri2poly, fvindices, pGeo->get_nverts());
  1267. ExpandUniformData(&params_, tri2poly, &pGeo->get_classifier(), &(pGeo->get_parameters()));
  1268. ExpandFaceVaryingData(&params_, fvindices, &pGeo->get_classifier(), &(pGeo->get_parameters()));
  1269. }
  1270. ri_points_triangle_polygons::ri_points_triangle_polygons(const ri_general_polygon* pGeo)
  1271. :pGeo_(pGeo)
  1272. {
  1273. std::vector<int> tri2poly;
  1274. std::vector<int> fvindices;
  1275. CreateIndicesGeneralPolygon(indeices_, tri2poly, fvindices, pGeo->get_nloops(), pGeo->get_nverts());
  1276. ExpandUniformData(&params_, tri2poly, &pGeo->get_classifier(), &(pGeo->get_parameters()));
  1277. ExpandFaceVaryingData(&params_, fvindices, &pGeo->get_classifier(), &(pGeo->get_parameters()));
  1278. }
  1279. ri_points_triangle_polygons::ri_points_triangle_polygons(const ri_points_polygons* pGeo)
  1280. :pGeo_(pGeo)
  1281. {
  1282. std::vector<int> tri2poly;
  1283. std::vector<int> fvindices;
  1284. CreateIndicesPointsPolygons(indeices_, tri2poly, fvindices, pGeo->get_npolys(), pGeo->get_nverts(), pGeo->get_verts());
  1285. ExpandUniformData(&params_, tri2poly, &pGeo->get_classifier(), &(pGeo->get_parameters()));
  1286. ExpandFaceVaryingData(&params_, fvindices, &pGeo->get_classifier(), &(pGeo->get_parameters()));
  1287. }
  1288. ri_points_triangle_polygons::ri_points_triangle_polygons(const ri_points_general_polygons* pGeo)
  1289. :pGeo_(pGeo)
  1290. {
  1291. std::vector<int> tri2poly;
  1292. std::vector<int> fvindices;
  1293. CreateIndicesPointsGeneralPolygons(indeices_, tri2poly, fvindices, pGeo->get_npolys(), pGeo->get_nloops(), pGeo->get_nverts(), pGeo->get_verts());
  1294. ExpandUniformData(&params_, tri2poly, &pGeo->get_classifier(), &(pGeo->get_parameters()));
  1295. ExpandFaceVaryingData(&params_, fvindices, &pGeo->get_classifier(), &(pGeo->get_parameters()));
  1296. }
  1297. const ri_parameters::value_type* ri_points_triangle_polygons::get_parameter(const char* key)const
  1298. {
  1299. const ri_parameters::value_type* pv = params_.get(key);
  1300. if(pv)return pv;
  1301. return pGeo_->get_parameter(key);
  1302. }
  1303. int ri_points_triangle_polygons::get_nfaces()const
  1304. {
  1305. return (int)indeices_.size()/3;
  1306. }
  1307. int ri_points_triangle_polygons::get_nverts()const
  1308. {
  1309. return (int)indeices_.size();
  1310. }
  1311. const float* ri_points_triangle_polygons::get_P()const
  1312. {
  1313. return pGeo_->get_P();
  1314. }
  1315. const float* ri_points_triangle_polygons::get_N()const
  1316. {
  1317. if(is_facevarying("N"))return NULL;
  1318. const ri_parameters::value_type* pv = this->get_parameter("N");
  1319. if(pv)
  1320. {
  1321. return &(pv->float_values[0]);
  1322. }
  1323. return NULL;
  1324. }
  1325. const float* ri_points_triangle_polygons::get_Np()const
  1326. {
  1327. const ri_parameters::value_type* pv = this->get_parameter("Np");
  1328. if(pv)
  1329. {
  1330. return &(pv->float_values[0]);
  1331. }
  1332. return NULL;
  1333. }
  1334. const float* ri_points_triangle_polygons::get_Nf()const
  1335. {
  1336. if(is_facevarying("N")){
  1337. const ri_parameters::value_type* pv = this->get_parameter("N");
  1338. if(pv)
  1339. {
  1340. return &(pv->float_values[0]);
  1341. }
  1342. }
  1343. return NULL;
  1344. }
  1345. bool ri_points_triangle_polygons::is_facevarying(const char* key)const
  1346. {
  1347. int id = pGeo_->get_classifier().find(key);
  1348. if(id>=0){
  1349. const ri_classifier::param_data& data = pGeo_->get_classifier()[id];
  1350. if(IsFaceVarying( data.get_class() ))return true;
  1351. }
  1352. return false;
  1353. }
  1354. const float* ri_points_triangle_polygons::get_Cs()const
  1355. {
  1356. return pGeo_->get_Cs();
  1357. }
  1358. const float* ri_points_triangle_polygons::get_Os()const
  1359. {
  1360. return pGeo_->get_Os();
  1361. }
  1362. const int* ri_points_triangle_polygons::get_verts()const
  1363. {
  1364. return &indeices_[0];
  1365. }
  1366. //------------------------------------------------------
  1367. }
  1368. }