Jump to content

Josh

Staff
  • Posts

    24,625
  • Joined

  • Last visited

Everything posted by Josh

  1. I was able to upload an item to the Downloads area through an automated script, so it looks like all the pieces are in place to populate it with good content. This can be integrated into the editor, and will replace the current AmbientCG browser. It will include PBR materials and 3D models from other free sites, as well as tools and user-created assets made just for Ultra. If there are high-quality assets uploaded by hand by people here, I will feature those so they have more visibility and don't get drowned out. Storage is pretty cheap, but the data transfer costs could add up quickly, especially with big 4K materials. If the system is used heavily, I will need to charge heavy users something like $9.99 for 100 GB downloads per month, with a free limit of maybe 10 GB monthly. Of course most of this stuff you can manually download elsewhere, but the system I want to put in place will make it extremely easy to quickly try out a lot of assets. I think our version of the packages will also be 1/3 the size of the original zipped PNG files, due to DDS compression and channel packing. The system also supports paid files, although it is not currently enabled, so if you want to sell your content that may be an option in the future. I think DLCs will offer the best sales, but maybe sales through this system will do well if people are already accustomed to using it.
  2. 0.9.8 Shader fix for Nvidia cards.
  3. This tutorial by @Vida Marcell walks through the basics of painting meshes with Quixel Mixer. Here are the files used: model.zip
  4. The problem was that files is an object, not an array. So it is supposed to be like this: files[filename]=filecontents
  5. I thought the touchpad axis was the same thing as the analog stick on the knuckles controllers...
  6. I have never tried to do this. The system is detecting the files[0] part, and the "Hello!" contents, but the file name MyFile.txt is not being interpreted correctly. The docs say that files is supposed to be an array with objects that have a key for the filename and a value for the contents of the file. Do you see any problem? std::string options = "category=97&description=MyDescription&title=FileName&author=1&"; options += urlEncode("files[0].MyFile.txt") + "=" + urlEncode("Hello!"); auto j3 = InvisionPower::APIPost("/downloads/files/", token, options);
  7. fixed, although I plan to change the look of these.
  8. Actually, it seems to be the unlit texture family that is causing the problem, transparency or no transparency.
  9. Fixed for the next build. There is currently no HMD::GetOffset command. I am not sure how it would work because SetOffset accepts a position and a rotation. I don't understand this?
  10. texturecan.com has assets from 001 to 641 here: https://www.texturecan.com/details/641/
  11. 10 downloads

    This highly folded red and bloody texture looks like intestines, organs or flesh. Veins and reddish spots can be found on the surface. It is a remarkable material for texturing monsters and aliens. This is a seamless and tileable PBR CG texture for 3D artists. Each package usually includes a Base Color Map / Diffuse Map, Normal Map, Roughness Map, Displacement Map, Metallic Map (Metals Only) and Ambient Occlusion Map.
  12. I tried uploading an ambientcg.com material here to test with. There are two versions you can download, (although they are actually the same file with a different name). There is a lot of good CC0 content out there that does not have any type of web API to access it. It might make more sense to take all this stuff and upload it into our website's system. Of course that process would need to be automated because there would be too much content to manage otherwise. This would give us a single point of access for all this stuff. The PBR texture providers are usually not very motivated to create a web API because they make money through advertisements, but they still are releasing their stuff under CC0 license. I'm not sure why, but that license allows us to redistribute files any way we want, and it doesn't look like this is going to happen otherwise.
  13. A lot of stuff here is probably also useful https://www.sharetextures.com/textures
  14. 0.9.8 Added material painting. Meshes can now have up to four materials applied to them. Multi-materials work with all objects, but the editor only has a painting interfaces for brushes currently. Added material saturation setting, for quick adjustments. AmbientCG.com extension now has a default saturation setting in the options that is applied to new materials that are downloaded.
  15. The SurfaceImperfections folder on the ambientcg server has some good materials for detailing.
  16. There are many definitions of what a third-person game actually is. What type of features are you looking for in this?
  17. 1. Create a box. Download and apply the concrete030 material from ambientCG to it. 2. Switch to the face tool and select the top face. Subdivide it into roughly square segments. 3. Download the material Rocks002. Open it, enable tessellation, and set the displacement scale to 10 and the offset to -5. Save your changes to the material and close. 4. Switch to the new paint tool. Press the browse button, select the Rocks002 material, and start painting. (Holding the control key will erase the material.) 5. The face panel allows you to view and edit which materials are in use on each face. 6. The material editor has new settings under the Blend section that controls how sharp the material blending is, and how heavily the displacement map effects the blending.
  18. Josh

    Face Display

    Since you have fine control over each face's subdivision level, I am adding some visual cues to show the geometry better.
  19. Also this might help: https://github.com/progsource/maddy
  20. Here is some AI-generated code that might help get you started. No idea if this is right or not! <?php // Include the Parsedown library require 'vendor/autoload.php'; // Function to fetch JSON data from a URL function fetchJson($url) { $json = file_get_contents($url); return json_decode($json, true); } // Function to generate HTML from topics function generateHtml($topics) { $html = '<html><head><title>Documentation</title></head><body>'; $html .= '<h1>Documentation</h1>'; $html .= '<ul>'; foreach ($topics as $topic) { $html .= '<li>' . htmlspecialchars($topic['title']); // Check if there are subtopics if (isset($topic['topics'])) { $html .= '<ul>'; $html .= generateHtml($topic['topics']); $html .= '</ul>'; } $html .= '</li>'; } $html .= '</ul>'; $html .= '</body></html>'; return $html; } // Function to read Markdown files from GitHub and convert to HTML function readMarkdownFiles($topics) { $parsedown = new Parsedown(); $htmlContent = ''; foreach ($topics as $topic) { if (isset($topic['filename'])) { // Determine the correct URL based on the filename case $baseUrl = (ctype_lower($topic['filename'])) ? 'https://raw.githubusercontent.com/UltraEngine/Documentation/refs/heads/master/' : 'https://raw.githubusercontent.com/UltraEngine/Documentation/refs/heads/master/CPP/'; $markdownUrl = $baseUrl . $topic['filename'] . '.md'; // URL to the markdown file $markdownContent = file_get_contents($markdownUrl); if ($markdownContent !== false) { $htmlContent .= '<h2>' . htmlspecialchars($topic['title']) . '</h2>'; $htmlContent .= $parsedown->text($markdownContent); } } // Recursively read subtopics if (isset($topic['topics'])) { $htmlContent .= readMarkdownFiles($topic['topics']); } } return $htmlContent; } // Main execution $jsonUrl = 'https://raw.githubusercontent.com/UltraEngine/Documentation/refs/heads/master/toc.json'; $topics = fetchJson($jsonUrl)['topics']; $html = generateHtml($topics); $markdownContent = readMarkdownFiles($topics); // Combine the generated HTML with the Markdown content $finalHtml = str_replace('<body>', '<body>' . $markdownContent, $html); // Save the final HTML to a file file_put_contents('documentation.html', $finalHtml); echo "Documentation HTML file generated successfully!"; ?> Or a CPP version: #include <iostream> #include <fstream> #include <string> #include <curl/curl.h> #include <nlohmann/json.hpp> #include <sstream> #include <regex> using json = nlohmann::json; // Function to write data received from curl to a string size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* userp) { size_t totalSize = size * nmemb; userp->append((char*)contents, totalSize); return totalSize; } // Function to fetch JSON data from a URL std::string fetchJson(const std::string& url) { CURL* curl; CURLcode res; std::string readBuffer; curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); res = curl_easy_perform(curl); curl_easy_cleanup(curl); } return readBuffer; } // Function to generate HTML from topics std::string generateHtml(const json& topics) { std::ostringstream html; html << "<html><head><title>Documentation</title></head><body>"; html << "<h1>Documentation</h1><ul>"; for (const auto& topic : topics) { html << "<li>" << topic["title"].get<std::string>(); if (topic.contains("topics")) { html << "<ul>" << generateHtml(topic["topics"]) << "</ul>"; } html << "</li>"; } html << "</ul></body></html>"; return html.str(); } // Function to read Markdown files from GitHub and convert to HTML std::string readMarkdownFiles(const json& topics) { std::ostringstream htmlContent; CURL* curl; CURLcode res; for (const auto& topic : topics) { if (topic.contains("filename")) { std::string filename = topic["filename"].get<std::string>(); std::string baseUrl = (std::all_of(filename.begin(), filename.end(), ::islower)) ? "https://raw.githubusercontent.com/UltraEngine/Documentation/refs/heads/master/" : "https://raw.githubusercontent.com/UltraEngine/Documentation/refs/heads/master/CPP/"; std::string markdownUrl = baseUrl + filename + ".md"; std::string markdownContent = fetchJson(markdownUrl); if (!markdownContent.empty()) { htmlContent << "<h2>" << topic["title"].get<std::string>() << "</h2>"; // Convert Markdown to HTML (simple replacement for demonstration) std::regex headerRegex(R"(# (.+))"); markdownContent = std::regex_replace(markdownContent, headerRegex, "<h1>$1</h1>"); htmlContent << markdownContent; } } if (topic.contains("topics")) { htmlContent << readMarkdownFiles(topic["topics"]); } } return htmlContent.str(); } // Main execution int main() { std::string jsonUrl = "https://raw.githubusercontent.com/UltraEngine/Documentation/refs/heads/master/toc.json"; std::string jsonData = fetchJson(jsonUrl); // Parse JSON data json topics = json::parse(jsonData)["topics"]; std::string html = generateHtml(topics); std::string markdownContent = readMarkdownFiles(topics); // Combine the generated HTML with the Markdown content std::string finalHtml = std::regex_replace(html, std::regex("<body>"), "<body>" + markdownContent); // Save the final HTML to a file std::ofstream outFile("documentation.html"); outFile << finalHtml; outFile.close(); std::cout << "Documentation HTML file generated successfully!" << std::endl; return 0; }
  21. Still working out the details. Yes, the ricks are just a PBR material.
×
×
  • Create New...