void SphereGraphicsObject::initVertices(int iterations) { //The number of facets will be (4^iterations) * 8 int nFaces=(int)pow(4.0f,iterations)*8; Face3 *faces=new Face3[nFaces]; if(NULL==faces) systemError("could not alloc sphere"); CreateNSphere(faces,iterations); printf("sphere: %d iterations, %d faces created\n",iterations,nFaces); verts=new Vec3[nFaces*3]; normals=new Vec3[nFaces*3]; nVerts=nFaces*3; for(int f=0;f<nFaces;f++) { verts[f*3+0]=faces[f].p1; verts[f*3+1]=faces[f].p2; verts[f*3+2]=faces[f].p3; //face normals /*Vec3 axis1=faces[f].p2-faces[f].p1; Vec3 axis2=faces[f].p3-faces[f].p1; Vec3 normal; normal.crossProduct(&axis1,&axis2); normal.normalize(); */ //point normals normals[f*3+0]=faces[f].p1; normals[f*3+1]=faces[f].p2; normals[f*3+2]=faces[f].p3; //just in case normals[f*3+0].normalize(); normals[f*3+1].normalize(); normals[f*3+2].normalize(); } delete faces; }
void Setup(CPlatform * const pPlatform) { unsigned int got = 0; const char *pVertStr[3] = {0,0,0}, *pFragStr = 0; unsigned int nSphereFloats; float *pSphereVertices = 0; unsigned int iterations = 7; int nFacets = 0; glswInit(); glswSetPath("../resources/", ".glsl"); WRender::SetClearColour(0,0,0,0); WRender::EnableCulling(true); got = glswGetShadersAlt("shaders.Version+shaders.Shared+shaders.FlatShading.Vertex", pVertStr, 3); pFragStr = glswGetShaders("shaders.Version+shaders.FlatShading.Fragment"); CShader vertexShader(CShader::VERT, pVertStr, got); CShader fragmentShader(CShader::FRAG, &pFragStr, 1); pVertStr[0] = glswGetShaders("shaders.Version+shaders.Gamma.Vertex"); pFragStr = glswGetShaders("shaders.Version+shaders.Gamma.Fragment"); CShader vertexShaderStage2(CShader::VERT, &pVertStr[0], 1); CShader fragmentShaderStage2(CShader::FRAG, &pFragStr, 1); // - - - - - - - - - - //setup the shaders program[0].Initialise(); program[0].AddShader(&vertexShader); program[0].AddShader(&fragmentShader); program[0].Link(); program[1].Initialise(); program[1].AddShader(&vertexShaderStage2); program[1].AddShader(&fragmentShaderStage2); program[1].Link(); program[1].Start(); program[1].SetTextureUnit("src_image",0); program[1].Stop(); // - - - - - - - - - - //setup the textures WRender::Texture::SDescriptor desc = {WRender::Texture::TEX_2D, WRender::Texture::RGB8, WIDTH_HEIGHT, WIDTH_HEIGHT, 0, 0, WRender::Texture::DONT_GEN_MIPMAP}; WRender::Texture::SParam param[] ={ { WRender::Texture::MIN_FILTER, WRender::Texture::LINEAR}, { WRender::Texture::MAG_FILTER, WRender::Texture::LINEAR}, { WRender::Texture::WRAP_S, WRender::Texture::REPEAT}, { WRender::Texture::WRAP_T, WRender::Texture::REPEAT}, }; WRender::CreateBaseTexture(texR, desc); WRender::SetTextureParams(texR,param,4); //setup Frame Buffer WRender::CreateFrameBuffer(fbo); WRender::AddTextureRenderBuffer(fbo, texR, WRender::ATT_CLR0, 0); WRender::CheckFrameBuffer(fbo); // - - - - - - - - - - //set up shapes //SPHERE nSphereVertices = unsigned int(powl(4.0,long double(iterations)))*8*3; nSphereFloats = nSphereVertices*3; pSphereVertices = new float[nSphereFloats]; nFacets = CreateNSphere(pSphereVertices, iterations); vaoSphere = WRender::CreateVertexArrayObject(); abSphere = WRender::CreateBuffer(WRender::ARRAY, WRender::STATIC, sizeof(float)*nSphereFloats, pSphereVertices); WRender::BindVertexArrayObject(vaoSphere); WRender::VertexAttribute vaSphere[1] = { {abSphere, 0, 3, WRender::FLOAT, 0, sizeof(float)*3, 0, 0} }; WRender::SetAttributeFormat( vaSphere, 1, 0); delete[] pSphereVertices; //square sqVao = WRender::CreateVertexArrayObject(); sqEab = WRender::CreateBuffer(WRender::ELEMENTS, WRender::STATIC, sizeof(sqIndices), sqIndices); sqAb = WRender::CreateBuffer(WRender::ARRAY, WRender::STATIC, sizeof(sqVertices), sqVertices); WRender::BindVertexArrayObject(sqVao); WRender::BindBuffer(WRender::ELEMENTS, sqEab); WRender::VertexAttribute sqVa[2] = { {sqAb, 0, 3, WRender::FLOAT, 0, sizeof(float)*5, 0, 0}, //vertices {sqAb, 1, 2, WRender::FLOAT, 0, sizeof(float)*5, sizeof(float)*3, 0}, //texture coordinates }; WRender::SetAttributeFormat( sqVa, 2, 0); WRender::UnbindVertexArrayObject(); //ubo for cameras etc ubo = WRender::CreateBuffer(WRender::UNIFORM, WRender::DYNAMIC, sizeof(Transforms), &transform); WRender::BindBufferToIndex(WRender::UNIFORM, ubo, 1); Transform::CreateProjectionMatrix(transforms.proj, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 50.0f); }