Jump to content

Josh

Staff
  • Posts

    23,120
  • Joined

  • Last visited

Posts posted by Josh

    • Fixed vertex and face tools, which could get weird results that did not align to the current mouse position.
    • Vertex and mouse tools now display the up/down mouse cursor when Alt key is pressed.

    For now, I will keep the trenchbroom-style controls for these two tools.

  1. Some code I used to resize a cubemap. I think the mipmaps might not be correct, but that's okay: Pasting here in case I need it again

        auto plug = LoadPlugin("Plugins/ISPCTexComp.dll");
    
        auto tex = LoadTexture(GetPath(PATH_DESKTOP) + "/diffuse.dds", LOAD_MIPCHAIN);
        auto mipchain = tex->mipchain;
        std::vector<shared_ptr<Pixmap> > chain2;
        for (auto p : mipchain)
        {
            
            {
                p = p->Convert(TEXTURE_RGBA16);
                p = p->Resize(256, 256);
                p = p->Convert(TEXTURE_BC6H);
                chain2.push_back(p);
            }
        }
        SaveTexture(GetPath(PATH_DESKTOP) + "/thumbnail_diffuse.dds", TEXTURE_CUBE, chain2, 6);
        return 0;

     

  2. Here is some code that uses it, but I just can't seem to get it to work right. I don't think there is an error in my code.

    I had to fix this file for C++17. Maybe that is causing it? I do not understand these functions:
    misc.h

    	int VertMap(const std::vector<int>& collapse_map, int a, int mx) {
    		if (mx <= 0) return 0;
    		while (a >= mx)
    		{
    			a = collapse_map[a];
    		}
    		return a;
    	}
    					std::vector<linalg::aliases::float3> vert;
    					std::vector<tridata> tri;
    					std::vector<int> collapse_map;
    					std::vector<int> permutation;
    					tridata t;
    
    					for (const auto& v : mesh->vertices)
    					{
    						vert.push_back(linalg::aliases::float3(v.position.x, v.position.y, v.position.z));
    					}
    
    					for (int n = 0; n < mesh->CountPrimitives(); ++n)
    					{
    						t.v[0] = mesh->GetPrimitiveVertex(n, 0);
    						t.v[1] = mesh->GetPrimitiveVertex(n, 1);
    						t.v[2] = mesh->GetPrimitiveVertex(n, 2);
    						tri.push_back(t);
    					}
    
    					//-----------------------------
    					// Reduce the mesh
    					//-----------------------------
    
    					ProgressiveMesh(vert, tri, collapse_map, permutation);
    
    					//-----------------------------
    					// PermuteVertices
    					//-----------------------------
    
    					// rearrange the vertex Array 
    					std::vector<float3> temp_Array;
    					unsigned int i;
    					assert(permutation.size() == vert.size());
    					for (i = 0; i < vert.size(); i++) {
    						temp_Array.push_back(vert[i]);
    					}
    					for (i = 0; i < vert.size(); i++) {
    						vert[permutation[i]] = temp_Array[i];
    					}
    					// update the changes in the entries in the triangle Array
    					for (i = 0; i < tri.size(); i++) {
    						for (int j = 0; j < 3; j++) {
    							tri[i].v[j] = permutation[tri[i].v[j]];
    						}
    					}
    
    					//-----------------------------
    					// Build new mesh
    					//-----------------------------
    
    					model->Clear();
    					mesh->extra = nullptr;
    					mesh = model->AddMesh();
    
    					std::vector<int> newvertex(vert.size());
    					std::fill(newvertex.begin(), newvertex.end(), -1);
    
    					//Add triangles
    					int a, b, c, p0, p1, p2;
    					int render_num = vert.size() * 0.5;
    					for (unsigned int i = 0; i < tri.size(); i++)
    					{
    						p0 = VertMap(collapse_map, tri[i].v[0], render_num);
    						p1 = VertMap(collapse_map, tri[i].v[1], render_num);
    						p2 = VertMap(collapse_map, tri[i].v[2], render_num);
    						if (p0 == p1 or p1 == p2 or p2 == p0) continue;
    						a = newvertex[p0];
    						if (a == -1)
    						{
    							a = mesh->AddVertex(vert[p0].x, vert[p0].y, vert[p0].z);
    							newvertex[p0] = a;
    						}
    						b = newvertex[p1];
    						if (b == -1)
    						{
    							b = mesh->AddVertex(vert[p1].x, vert[p1].y, vert[p1].z);
    							newvertex[p1] = b;
    						}
    						c = newvertex[p2];
    						if (c == -1)
    						{
    							c = mesh->AddVertex(vert[p2].x, vert[p2].y, vert[p2].z);
    							newvertex[p2] = c;
    						}
    						//int a = mesh->AddVertex(vert[p0].x, vert[p0].y, vert[p0].z);
    						//int b = mesh->AddVertex(vert[p1].x, vert[p1].y, vert[p1].z);
    						//int c = mesh->AddVertex(vert[p2].x, vert[p2].y, vert[p2].z);
    						mesh->AddPrimitive(a, b, c);
    					}
    
    					mesh->UpdateBounds();
    					model->UpdateBounds();

     

  3. 0.9.6

    • In this build the terrain creation works more like Leadwerks, where it is created by first selecting the terrain tool. You don't have to worry about selecting the terrain to edit it, it just works. Try it and let me know what you think. The way it is stored in the map file has not changed.
    • LOD for orthographic cameras is fixed.

    Untitled.png.466b3da1eb85c42c6b5ce3aa2463b83b.png

  4. Doing that would require two things.

    With really big worlds, you need a terrain system that recursively subdivides, because normal terrain LOD isn't big enough. With a normal terrain LOD system where the terrain is divided into patches, eventually you can zoom out so far that each patch is just one pixel big. So you need a different way of handling that.

    You also need a way to warp the terrain to a sphere, and have it affect physics, raycasting, culling, as well as the rendering.

    I plan on doing stuff like this in the future, but not with our standard terrain system.

×
×
  • Create New...