@@ -498,6 +498,15 @@ core::smart_refctd_ptr<ICPUPolygonGeometry> CGeometryCreator::createSphere(float
498498		memcpy (normals + vertex_i, &quantizedBottomNormal, sizeof (quantizedBottomNormal));
499499	}
500500
501+ 	for  (auto  i = 0u ; i < vertexCount; ++i)
502+ 	{
503+ 		auto  position = positions[i];
504+ 		auto  len = glm::length (position);
505+ 
506+ 		auto  ok = len >= 1 .f  - 0 .01f ;
507+ 		assert (ok);
508+ 	}
509+ 
501510	CPolygonGeometryManipulator::recomputeContentHashes (retval.get ());
502511	return  retval;
503512}
@@ -1889,5 +1898,93 @@ core::smart_refctd_ptr<ICPUPolygonGeometry> CGeometryCreator::createIcoSphere(fl
18891898	return  retval;
18901899}
18911900
1901+ core::smart_refctd_ptr<ICPUPolygonGeometry> CGeometryCreator::createGrid (const  hlsl::uint16_t2 resolution) const 
1902+ {
1903+ 	if  (resolution.x  < 2  || resolution.y  < 2 )
1904+ 		return  nullptr ;
1905+ 
1906+ 	auto  retval = core::make_smart_refctd_ptr<ICPUPolygonGeometry>();
1907+ 	retval->setIndexing (IPolygonGeometryBase::TriangleStrip ());
1908+ 
1909+ 	// ! Create indices
1910+ 	/* 	
1911+ 		i \in [0, resolution.x - 1], j \in [0, resolution.y - 1] 
1912+ 		logical vertex id : V(i, j) 
1913+ 
1914+ 		Eg. resolution = {5u, 4u}: 
1915+ 
1916+ 		 j=3  15--16--17--18--19 
1917+ 			   | \ | \ | \ | \ | 
1918+ 		 j=2  10--11--12--13--14 
1919+ 			   | \ | \ | \ | \ | 
1920+ 		 j=1   5-- 6-- 7-- 8-- 9 
1921+ 			   | \ | \ | \ | \ | 
1922+ 		 j=0   0-- 1-- 2-- 3-- 4 
1923+ 			   i=0  1   2   3   4 
1924+ 
1925+ 		Strip order (one draw), rows linked by 2 degenerate indices: 
1926+ 		row 0 -> 1 (L->R):  0,5, 1,6, 2,7, 3,8, 4,9, 9,9 
1927+ 		row 1 -> 2 (R->L):  9,14, 8,13, 7,12, 6,11, 5,10, 5,5 
1928+ 		row 2 -> 3 (L->R):  5,10, 6,11, 7,12, 8,13, 9,14, 14,14 
1929+ 	*/  
1930+ 
1931+ 	const  size_t  indexCount = 2ull  * resolution.x  * (resolution.y  - 1 ) + 2ull  * (resolution.y  - 2 );
1932+ 	const  size_t  maxIndex = resolution.x  * resolution.y  - 1u ;
1933+ 
1934+ 	auto  createIndices = [&]<typename  IndexT>() -> void 
1935+ 	{
1936+ 		auto  indexView = createIndexView<IndexT>(indexCount, maxIndex);
1937+ 
1938+ 		auto  V = [&](IndexT i, IndexT j) { return  IndexT (j * resolution.x  + i); };
1939+ 		auto * index = static_cast <IndexT*>(indexView.src .buffer ->getPointer ());
1940+ 		#define  PUSH_INDEX (value ) *index = value; ++index;
1941+ 
1942+ 		for  (IndexT j = 0u ; j < resolution.y  - 1 ; ++j)
1943+ 		{
1944+ 			if  ((j & 1u ) == 0 )
1945+ 			{
1946+ 				for  (IndexT i = 0u ; i < resolution.x ; ++i)
1947+ 				{
1948+ 					PUSH_INDEX (V (i, j))
1949+ 					PUSH_INDEX (V (i, j + 1 ))
1950+ 				}
1951+ 
1952+ 				if  (j + 1  < resolution.y  - 1 )
1953+ 				{
1954+ 					IndexT last = V (resolution.x  - 1 , j + 1 );
1955+ 					PUSH_INDEX (last)
1956+ 					PUSH_INDEX (last)
1957+ 				}
1958+ 			}
1959+ 			else 
1960+ 			{
1961+ 				for  (int  i = int (resolution.x ) - 1 ; i >= 0 ; --i)
1962+ 				{
1963+ 					PUSH_INDEX (V (uint32_t (i), j))
1964+ 					PUSH_INDEX (V (uint32_t (i), j + 1 ))
1965+ 				}
1966+ 
1967+ 				if  (j + 1  < resolution.y  - 1 )
1968+ 				{
1969+ 					IndexT first = V (0 , j + 1 );
1970+ 					PUSH_INDEX (first)
1971+ 					PUSH_INDEX (first)
1972+ 				}
1973+ 			}
1974+ 		}
1975+ 		retval->setIndexView (std::move (indexView));
1976+ 	};
1977+ 
1978+ 	if  (maxIndex <= std::numeric_limits<uint16_t >::max ())
1979+ 		createIndices.template  operator () < uint16_t  > ();
1980+ 	else  if  (maxIndex <= std::numeric_limits<uint32_t >::max ())
1981+ 		createIndices.template  operator () < uint32_t  > ();
1982+ 	else 
1983+ 		return  nullptr ;
1984+ 
1985+ 	CPolygonGeometryManipulator::recomputeContentHashes (retval.get ());
1986+ 	return  retval;
1987+ }
1988+ 
18921989} //  end namespace nbl::asset
18931990
0 commit comments