void operator () () const { try { V v1 (N), v2 (N), v3 (N); (*this) (v1, v2, v3); #ifdef USE_RANGE ublas::vector_range<V> vr1 (v1, ublas::range (0, N)), vr2 (v2, ublas::range (0, N)), vr3 (v3, ublas::range (0, N)); (*this) (vr1, vr2, vr3); #endif #ifdef USE_SLICE ublas::vector_slice<V> vs1 (v1, ublas::slice (0, 1, N)), vs2 (v2, ublas::slice (0, 1, N)), vs3 (v3, ublas::slice (0, 1, N)); (*this) (vs1, vs2, vs3); #endif } catch (std::exception &e) { std::cout << e.what () << std::endl; } catch (...) { std::cout << "unknown exception" << std::endl; } }
int CView::getElemPos(CViewState& vs) { int i; int pos = getAddrLen()+1; CViewState vs1(vs); if(vs.mode == 0) { for(i=0; i < vs.x; i++) { vs1.x = i; pos += getElemWidth(vs1); pos++; } return pos; } vs1.mode = 0; for(i=0; i < m.getNumElements(); i++) { vs1.x = i; pos += getElemWidth(vs1); pos++; } vs1.mode = 1; for(i=0; i < vs.x; i++) { vs1.x = i; pos += getElemWidth(vs1); } return pos; }
void operator () () const { V v1 (N), v2 (N), v3 (N); test_expression_with (v1, v2, v3); test_container_with (v1); #ifdef USE_RANGE ublas::vector_range<V> vr1 (v1, ublas::range (0, N)), vr2 (v2, ublas::range (0, N)), vr3 (v3, ublas::range (0, N)); test_expression_with (vr1, vr2, vr3); #endif #ifdef USE_SLICE ublas::vector_slice<V> vs1 (v1, ublas::slice (0, 1, N)), vs2 (v2, ublas::slice (0, 1, N)), vs3 (v3, ublas::slice (0, 1, N)); test_expression_with (vs1, vs2, vs3); #endif }
ShaderProgram::ShaderProgram(const char *vertex, const char *fragment, const ShaderFlags &flags) { File::uptr vs, fs; v = glCreateShader(GL_VERTEX_SHADER); f = glCreateShader(GL_FRAGMENT_SHADER); uint64 size; vs = File::map(vertex, File::Read, &size); std::unique_ptr<char[]> vs1(new char[size + 1]); memcpy(vs1.get(), vs.get(), size * sizeof(char)); vs1[size] = 0; fs = File::map(fragment, File::Read, &size); std::unique_ptr<char[]> fs1(new char[size + 1]); memcpy(fs1.get(), fs.get(), size * sizeof(char)); fs1[size] = 0; //TODO: Może troszkę to ulepszyć... (Chodzi o to, że header trzeba dokleić po #version) const char * vv = vs1.get(); std::string fscode = fs1.get(); size_t ver = fscode.find("#version"); ver = fscode.find("\n", ver); std::string ffs = fscode.substr(0, ver) + "\n" + flags.getHeader() + fscode.substr(ver + 1); const char * ff = ffs.c_str(); glShaderSource(v, 1, &vv, NULL); glShaderSource(f, 1, &ff, NULL); GLint status; glCompileShader(v); glGetShaderiv(v, GL_INFO_LOG_LENGTH, &status); std::unique_ptr<GLchar[]> buffer(new GLchar[status]); glGetShaderInfoLog(v, status, &status, buffer.get()); glGetShaderiv(v, GL_COMPILE_STATUS, &status); if(status != GL_TRUE) RAISE(ShaderException, "Error while compiling Vertex Shader!", buffer.get()); else LOG(errorLogger, "Vertex Shader Info Log:%s\n", buffer.get()); glCompileShader(f); glGetShaderiv(f, GL_INFO_LOG_LENGTH, &status); buffer = std::unique_ptr<GLchar[]>(new GLchar[status]); glGetShaderInfoLog(f, status, &status, buffer.get()); glGetShaderiv(f, GL_COMPILE_STATUS, &status); if(status != GL_TRUE) RAISE(ShaderException, "Error while compiling Fragment Shader!", buffer.get()); else LOG(errorLogger, "Fragment Shader Info Log:%s\n", buffer.get()); p = glCreateProgram(); glAttachShader(p, v); glAttachShader(p, f); glLinkProgram(p); glValidateProgram(p); glGetProgramiv(p, GL_INFO_LOG_LENGTH, &status); buffer = std::unique_ptr<GLchar[]>(new GLchar[status]); glGetProgramInfoLog(p, status, &status, buffer.get()); glGetProgramiv(p, GL_VALIDATE_STATUS, &status); if(status != GL_TRUE) RAISE(ShaderException, "Error while linking / validating Shader Program!", buffer.get()); else LOG(errorLogger, "Shader Program Info Log:%s\n", buffer.get()); HASSERT(p && v && f); }
int main () { printf ("Results of xmesh_saver_test:\n"); try { VertexStream vs1 (4, make_vertex_declaration<CustomVertex> ()); CustomVertex* verts1 = vs1.Data<CustomVertex> (); if (verts1) { for (uint32_t i=0; i<vs1.Size (); i++) { verts1 [i].position = vec3f ((float)i, (float)i * 2, (float)i * 3); verts1 [i].normal = vec3f ((float)(i & 1), (float)((i + 1) & 1), 0); verts1 [i].texcoord0 = vec2f (0, -(float)i, 0); verts1 [i].color = vec4ub (0, i, 0, i); verts1 [i].tangent = vec3f (1.0f, 0.0f, 0.0f); } } VertexWeightStream vws (5); VertexWeight* weights = vws.Data (); for (uint32_t i=0; i<vws.Size (); i++) { weights [i].joint_index = i; weights [i].joint_weight = float (i) / float (vws.Size ()); } typedef Vertex<VertexInfluence, Position3f> MyVertex; VertexStream vs2 (4, make_vertex_declaration<MyVertex> ()); MyVertex* verts2 = vs2.Data<MyVertex> (); if (verts2) { for (uint32_t i=0; i<vs1.Size (); i++) { verts2 [i].first_weight = i; verts2 [i].weights_count = 1; verts2 [i].position = 0.0f; } } IndexBuffer ib (5); for (uint32_t i=0; i<ib.Size (); i++) ib.Data<unsigned int> () [i] = i; Mesh mesh1; mesh1.Rename ("mesh1"); VertexBuffer vb1; vb1.Attach (vs1); mesh1.Attach (vb1); mesh1.Attach (ib); mesh1.AddPrimitive (PrimitiveType_TriangleList, 0, 0, 1, "material1"); mesh1.AddPrimitive (PrimitiveType_TriangleStrip, 0, 1, 1, "material2"); Mesh mesh2; mesh2.Rename ("mesh2"); VertexBuffer vb2; vb2.Attach (vs1); vb2.Attach (vs2); vb2.AttachWeights (vws); mesh2.Attach (vb2); mesh2.AddPrimitive (PrimitiveType_LineList, 0, 0, 1, "material1"); mesh2.AddPrimitive (PrimitiveType_LineStrip, 0, 1, 2, "material2"); MeshLibrary mesh_library; mesh_library.Rename ("my_mesh_library"); mesh_library.Attach ("mesh1", mesh1); mesh_library.Attach ("mesh2", mesh2); mesh_library.Save (DST_FILE_NAME); } catch (std::exception& exception) { printf ("exception: %s\n", exception.what ()); } return 0; }