1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
for (unsigned int i = 0; i < m_instances.size(); i++) {
std::vector<float> transformMatrices;
for (unsigned int j = 0; j < m_instances[i]->getTransforms().size(); j++) {
float* tmatrix = m_instances[i]->getTransforms()[j].get().getGlMatrix();
for (unsigned int n = 0; n < 16; n++) {
transformMatrices.push_back(tmatrix[n]);
}
}
cl_int err;
ctransfMatrixBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, transformMatrices.size(), &transformMatrices, &err);
checkErr(err, "Buffer::Buffer()");
math::Matrix4f texM = (m_instances[i]->getMaterial().getTexture() != nullptr) ?
m_instances[i]->getMaterial().getTexture()->getTextureMatrix() :
math::Matrix4f();
std::vector<float> vPosX = m_instances[i]->getVertexArray().m_vPosX;
std::vector<float> vPosY = m_instances[i]->getVertexArray().m_vPosY;
std::vector<float> vPosZ = m_instances[i]->getVertexArray().m_vPosZ;
std::vector<float> vPosW = m_instances[i]->getVertexArray().m_vPosW;
std::vector<unsigned char> vcRed = m_instances[i]->getVertexArray().m_vcRed;
std::vector<unsigned char> vcBlue = m_instances[i]->getVertexArray().m_vcBlue;
std::vector<unsigned char> vcGreen = m_instances[i]->getVertexArray().m_vcGreen;
std::vector<unsigned char> vcAlpha = m_instances[i]->getVertexArray().m_vcAlpha;
std::vector<unsigned int> ctx = m_instances[i]->getVertexArray().m_ctX;
std::vector<unsigned int> cty = m_instances[i]->getVertexArray().m_ctY;
std::vector<unsigned int> indexes = m_instances[i]->getVertexArray().m_indexes;
std::vector<unsigned int> numIndexes = m_instances[i]->getVertexArray().m_numIndexes;
std::vector<unsigned int> baseIndexes = m_instances[i]->getVertexArray().m_baseIndexes;
std::vector<unsigned int> baseVertices = m_instances[i]->getVertexArray().m_baseVertices;
unsigned int nbVerticesPerFaces = m_instances[i]->getVertexArray().nbVerticesPerFace;
cvposXBuffer = cl::Buffer(clcontext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, vPosX.size(), &vPosX, &err);
checkErr(err, "Buffer::Buffer()");
cvposYBuffer = cl::Buffer(clcontext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, vPosX.size(), &vPosY, &err);
checkErr(err, "Buffer::Buffer()");
cvposZBuffer = cl::Buffer(clcontext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, vPosX.size(), &vPosZ, &err);
checkErr(err, "Buffer::Buffer()");
cvposWBuffer = cl::Buffer(clcontext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, vPosX.size(), &vPosW, &err);
checkErr(err, "Buffer::Buffer()");
cvcolredBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, vcRed.size(), &vcRed, &err);
checkErr(err, "Buffer::Buffer()");
cvcolgreenBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, vcBlue.size(), &vcBlue, &err);
checkErr(err, "Buffer::Buffer()");
cvcolblueBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, vcGreen.size(), &vcGreen, &err);
checkErr(err, "Buffer::Buffer()");
cvcolalphaBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, vcAlpha.size(), &vcAlpha, &err);
checkErr(err, "Buffer::Buffer()");
cvtexcoorduBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, ctx.size(), &ctx, &err);
checkErr(err, "Buffer::Buffer()");
cvtexcoordvBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, cty.size(), &cty, &err);
checkErr(err, "Buffer::Buffer()");
cvindexesBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, indexes.size(), &indexes, &err);
checkErr(err, "Buffer::Buffer()");
cnumIndexesBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, numIndexes.size(), &numIndexes, &err);
checkErr(err, "Buffer::Buffer()");
cbaseIndexesBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, baseIndexes.size(), &baseIndexes, &err);
checkErr(err, "Buffer::Buffer()");
cbaseVerticesBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, baseVertices.size(), &baseVertices, &err);
checkErr(err, "Buffer::Buffer()");
cNbVerticesPerFaces = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, 1, nbVerticesPerFaces, &err);
checkErr(err, "Buffer::Buffer()");
View& view = window.getView();
ViewportMatrix vpm;
vpm.setViewport(math::Vec3f(view.getViewport().getPosition().x, view.getViewport().getPosition().y, 0),
math::Vec3f(view.getViewport().getWidth(), view.getViewport().getHeight(), 1));
float* projMatrix = view.getProjMatrix().getMatrix().toGlMatrix();
float* viewMatrix = view.getViewMatrix().getMatrix().toGlMatrix();
float* viewportMatrix = vpm.getMatrix().toGlMatrix();
cprojMatrixBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, 16, *projMatrix, &err);
checkErr(err, "Buffer::Buffer()");
cviewMatrixBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, 16, *viewMatrix, &err);
checkErr(err, "Buffer::Buffer()");
cvpMatrixBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, 16, *viewportMatrix, &err);
std::vector<float> transfMatrices;
checkErr(err, "Buffer::Buffer()");
checkErr(err, "Buffer::Buffer()");
err = clkvertexShader.setArg(0, cvposXBuffer);
checkErr(err, "Kernel::setArg()");
err = clkvertexShader.setArg(1, cvposYBuffer);
checkErr(err, "Kernel::setArg()");
err = clkvertexShader.setArg(2, cvposZBuffer);
checkErr(err, "Kernel::setArg()");
err = clkvertexShader.setArg(3, cvposWBuffer);
checkErr(err, "Kernel::setArg()");
err = clkvertexShader.setArg(4, cvcolredBuffer);
checkErr(err, "Kernel::setArg()");
err = clkvertexShader.setArg(5, cvcolblueBuffer);
checkErr(err, "Kernel::setArg()");
err = clkvertexShader.setArg(6, cvcolgreenBuffer);
checkErr(err, "Kernel::setArg()");
err = clkvertexShader.setArg(7, cvcolalphaBuffer);
checkErr(err, "Kernel::setArg()");
err = clkvertexShader.setArg(8, cvtexcoorduBuffer);
checkErr(err, "Kernel::setArg()");
err = clkvertexShader.setArg(9, cvtexcoordvBuffer);
checkErr(err, "Kernel::setArg()");
err = clkvertexShader.setArg(10, cvindexesBuffer);
checkErr(err, "Kernel::setArg()");
err = clkvertexShader.setArg(11, cnumIndexesBuffer);
checkErr(err, "Kernel::setArg()");
err = clkvertexShader.setArg(12, cbaseIndexesBuffer);
checkErr(err, "Kernel::setArg()");
err = clkvertexShader.setArg(13, cbaseVerticesBuffer);
checkErr(err, "Kernel::setArg()");
err = clkvertexShader.setArg(14, cNbVerticesPerFaces);
checkErr(err, "Kernel::setArg()");
cl::CommandQueue clqueue (clcontext, devices[0], 0, &err);
checkErr(err, "CommandQueue::CommandQueue()");
cl::Event event;
err = clqueue.enqueueNDRangeKernel(clkvertexShader,
cl::NullRange, cl::NDRange(baseVertices.size() * nbVerticesPerFaces),
cl::NDRange(1, 1), NULL, &event); |