@@ -1338,123 +1338,6 @@ SimpleRaytracer::prepare_render()
13381338 }
13391339 }
13401340
1341- bool have_displacement = false ;
1342- for (const Material& m : shaders ()) {
1343- if (m.disp ) {
1344- have_displacement = true ;
1345- break ;
1346- }
1347- }
1348- if (have_displacement) {
1349- errhandler ().infofmt (" Evaluating displacement shaders" );
1350- // Loop through all triangles and run displacement shader if there is one
1351- // or copy the input point if there is none
1352- std::vector<Vec3> disp_verts (scene.verts .size (), Vec3 (0 , 0 , 0 ));
1353- std::vector<int > valance (scene.verts .size (), 0 );
1354- // ^ number of times each vertex has been displaced
1355-
1356- OSL::PerThreadInfo* thread_info = shadingsys->create_thread_info ();
1357- ShadingContext* ctx = shadingsys->get_context (thread_info);
1358-
1359- bool has_smooth_normals = false ;
1360- for (int primID = 0 , nprims = scene.triangles .size (); primID < nprims;
1361- primID++) {
1362- Vec3 p[3 ], n[3 ];
1363- Vec2 uv[3 ];
1364-
1365- p[0 ] = scene.verts [scene.triangles [primID].a ];
1366- p[1 ] = scene.verts [scene.triangles [primID].b ];
1367- p[2 ] = scene.verts [scene.triangles [primID].c ];
1368-
1369- valance[scene.triangles [primID].a ]++;
1370- valance[scene.triangles [primID].b ]++;
1371- valance[scene.triangles [primID].c ]++;
1372-
1373- int shaderID = scene.shaderid (primID);
1374- if (shaderID < 0 || !m_shaders[shaderID].disp ) {
1375- disp_verts[scene.triangles [primID].a ] += p[0 ];
1376- disp_verts[scene.triangles [primID].b ] += p[1 ];
1377- disp_verts[scene.triangles [primID].c ] += p[2 ];
1378- continue ;
1379- }
1380-
1381-
1382- Vec3 Ng = (p[0 ] - p[1 ]).cross (p[0 ] - p[2 ]);
1383- float area = 0 .5f * Ng.length ();
1384- Ng = Ng.normalize ();
1385- if (scene.n_triangles [primID].a >= 0 ) {
1386- n[0 ] = scene.normals [scene.n_triangles [primID].a ];
1387- n[1 ] = scene.normals [scene.n_triangles [primID].b ];
1388- n[2 ] = scene.normals [scene.n_triangles [primID].c ];
1389- has_smooth_normals = true ;
1390- } else {
1391- n[0 ] = n[1 ] = n[2 ] = Ng;
1392- }
1393-
1394- if (scene.uv_triangles [primID].a >= 0 ) {
1395- uv[0 ] = scene.uvs [scene.uv_triangles [primID].a ];
1396- uv[1 ] = scene.uvs [scene.uv_triangles [primID].b ];
1397- uv[2 ] = scene.uvs [scene.uv_triangles [primID].c ];
1398- } else {
1399- uv[0 ] = uv[1 ] = uv[2 ] = Vec2 (0 , 0 );
1400- }
1401-
1402- // displace each vertex
1403- for (int i = 0 ; i < 3 ; i++) {
1404- ShaderGlobals sg;
1405- sg.P = p[i];
1406- sg.Ng = Ng;
1407- sg.N = n[i];
1408- sg.u = uv[i].x ;
1409- sg.v = uv[i].y ;
1410- sg.I = (p[i] - camera.eye ).normalize ();
1411- sg.surfacearea = area;
1412- sg.renderstate = &sg;
1413- shadingsys->execute (*ctx, *m_shaders[shaderID].disp , sg);
1414- p[i] = sg.P ;
1415- }
1416- disp_verts[scene.triangles [primID].a ] += p[0 ];
1417- disp_verts[scene.triangles [primID].b ] += p[1 ];
1418- disp_verts[scene.triangles [primID].c ] += p[2 ];
1419- }
1420-
1421- // release context
1422- shadingsys->release_context (ctx);
1423- shadingsys->destroy_thread_info (thread_info);
1424-
1425- // average each vertex by the number of times it was displaced
1426- for (int i = 0 , n = scene.verts .size (); i < n; i++) {
1427- if (valance[i] > 0 )
1428- disp_verts[i] /= float (valance[i]);
1429- else
1430- disp_verts[i] = scene.verts [i];
1431- }
1432- // replace old data with the new
1433- scene.verts = std::move (disp_verts);
1434-
1435- if (has_smooth_normals) {
1436- // Recompute the vertex normals (if we had some)
1437- std::vector<Vec3> disp_normals (scene.normals .size (), Vec3 (0 , 0 , 0 ));
1438- for (int primID = 0 , nprims = scene.triangles .size ();
1439- primID < nprims; primID++) {
1440- if (scene.n_triangles [primID].a >= 0 ) {
1441- Vec3 p[3 ];
1442- p[0 ] = scene.verts [scene.triangles [primID].a ];
1443- p[1 ] = scene.verts [scene.triangles [primID].b ];
1444- p[2 ] = scene.verts [scene.triangles [primID].c ];
1445- // don't normalize to weight by area
1446- Vec3 Ng = (p[0 ] - p[1 ]).cross (p[0 ] - p[2 ]);
1447- disp_normals[scene.n_triangles [primID].a ] += Ng;
1448- disp_normals[scene.n_triangles [primID].b ] += Ng;
1449- disp_normals[scene.n_triangles [primID].c ] += Ng;
1450- }
1451- }
1452- for (Vec3& n : disp_normals)
1453- n = n.normalize ();
1454- scene.normals = std::move (disp_normals);
1455- }
1456- }
1457-
14581341 // build bvh and prepare triangles
14591342 scene.prepare (errhandler ());
14601343 prepare_lights ();
0 commit comments