(Full solve: (Line draw+Auto-extrude) CC0 Unity + better Blender version (+cheat sheet addon)) 3D Generator for simple unrealistic "outblock" meshes?

The same screen literally contains this earlier version which did it upside down, but without lacking stuff problem:

But you just took the part that is broken, great job!

You are the one who spent hours talking with me btw, than to do a decent free boot for everyone.
I at least had a justification with a headache today, so i could’nt work properly.

No, this one is broken too. The normals are completely scuffed and you can tell because of how the lighting is working. Again, because your skill level is so low and because you refuse to learn, you can’t even recognize what you do not actually know. You are too obsessed with shortcuts to make these things work.

And I am not going to put models on the asset store for free. The only models I make for distribution are those for my own games.

Wtf, i already accepted your point of view? What are you trying to say if i got ya already? Wtf it would even matter if i literally will use it so spam a bunch of prototype, outblock rigidbodies or whatever u call it , also Claude tries to recalculate it back properly, stop finding mistakes in old crap.

By the way u still didnt reply what is a prototype and how that guys probuilder boot called then, what do i need to read a lecture how it is properly called? The context is clear enough and i needed one word to describe it

you know you returned your karma with the boot image, but now im thinking again that you’re just trolling with negative all the people around the forum

P.S.

Here is latest version screen, it took 1h 50 minutes (some minutes are taken by talking to u lol)
Already good enough (this is previous chair)

The saved previous mesh, you can even save other selected meshes (feature by accident), at least appreciate it as a simple save meshing tool, than ProBuilder probuilderize. (specifically made this angle to make you able see those 2 edges)

Here is the left new chair and the saved one on right

The only issue to spam prototype items that it again bugs triangles if you’re doing already drawed chair and press the close shape red dot again instead of “generate mesh”

This version is scuffed too. It’s generating triangles all wrong. You’re getting lighting errors on the back of the chair because it’s generated a concave quad.

It also has lighting errors on the top of the seat because it’s not generating the mesh very well. Again, these are things you would easily avoid with generic extrusion modelling in Blender, a program you are so intent on not learning that I’m just putting you on ignore at this point.

You’re the one whiney here now, I explained my point and it was more fun to make this dumb tool, than to reimport stuff from blender and add all the components from scratch, mesh collider, rigidbody, etc.

I already told you its use purpose wtf you keep talking about bad normals?!

Anyways you’re not going to see this if im in ignore list. Also the normal problem is fixable, and i can make it grid based so it wont be a random from hand mess.

It can become a decent fast extrude tool in Unity for idiots like me, but you’re still on track to “GO TO BLENDER” when i ALREADY DAMN ACCEPTED IT NOT ONCE.

Well the same idea draw the h shape and extrude in probuilder took about 20s

that is what i’m talking about, the only potential problem if you need to make it perfect, but it already allows lines by hold shift and it for some reason already goes not pixel by pixel, you can even set your DPI to 200 and lower to fix this issue even better with such crutch.

Here’s the code that i got in total with the only contextual prompt “Only code” from Sonnet 3.5 Code Claude
(I do not plan to sell it, maybe only put in a free asset script pack, it is CC0 basically, do anything with it. Edit: Fixed back now you can press close shape without the need to click “Generate” and have a bit more space for the finishing the last chair leg case. This thing also supports only undo’s with RMB):

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class MeshExtruderWindow : EditorWindow
{
    private List<Vector2> linePoints = new List<Vector2>();
    private bool isDrawing = false;
    private float extrudeDepth = 1f;
    private Color meshColor = Color.white;
    private float snapThreshold = 20f; // Distance to snap to straight lines
    private Vector2 scrollPosition;
    private float drawAreaSize = 400f;
    private Vector2? lastPoint = null;
    private bool isSnapping = false;

    private float closeThreshold = 15f; // Distance to detect closing the shape
    private bool isNearStart = false; // For highlighting possible close point

    private bool addRigidbody = false;
    private float meshMass = 1f;
    private string meshSavePath = "Assets/GeneratedMeshes";

    [MenuItem("Tools/Simple Mesh Extruder")]
    static void Init()
    {
        var window = GetWindow<MeshExtruderWindow>("Line Mesh Extruder");
        window.Show();
    }

    void OnGUI()
    {
        EditorGUILayout.Space(10);
        EditorGUILayout.LabelField("Click to place points. Hold Shift for straight lines.");
        extrudeDepth = EditorGUILayout.FloatField("Extrude Depth", extrudeDepth);
        meshColor = EditorGUILayout.ColorField("Mesh Color", meshColor);

        EditorGUILayout.Space(5);
        using (new EditorGUILayout.HorizontalScope())
        {
            addRigidbody = EditorGUILayout.Toggle("Add Rigidbody", addRigidbody);
            if (addRigidbody)
            {
                meshMass = EditorGUILayout.FloatField("Mass", meshMass);
            }
        }

        if (GUILayout.Button("Clear Lines"))
            linePoints.Clear();

        if (GUILayout.Button("Generate Mesh") && linePoints.Count >= 3)
            GenerateMesh();

        DrawArea();

        EditorGUILayout.Space(10);
        if (GUILayout.Button("Save Mesh"))
        {
            if (Selection.activeGameObject != null &&
                Selection.activeGameObject.GetComponent<MeshFilter>() != null)
            {
                SaveMesh(Selection.activeGameObject.GetComponent<MeshFilter>().sharedMesh);
            }
            else
            {
                EditorUtility.DisplayDialog("Error", "Please select a generated mesh first!", "OK");
            }
        }

    // Add back the below instructions
    EditorGUILayout.Space(10);
    EditorGUILayout.HelpBox(
        "Instructions:\n" +
        "- Click to place points\n" +
        "- Hold Shift for straight lines\n" +
        "- Click near first point to close shape\n" +
        "- Right-click to remove last point\n" +
        "- Select mesh and click 'Save Mesh' to save asset", 
        MessageType.Info);
    }

    private void SaveMesh(Mesh mesh)
    {
        if (mesh == null) return;

        // Ensure the path is valid
        string meshSavePath = "Assets/GeneratedMeshes";

        // Create directory if it doesn't exist
        if (!AssetDatabase.IsValidFolder("Assets/GeneratedMeshes"))
        {
            AssetDatabase.CreateFolder("Assets", "GeneratedMeshes");
            AssetDatabase.Refresh();
        }

        string fileName = "ExtrudedMesh";
        string fullPath = $"{meshSavePath}/{fileName}.asset";

        // Check if file exists and handle accordingly
        int counter = 1;
        while (AssetDatabase.LoadAssetAtPath<Mesh>(fullPath) != null)
        {
            if (EditorUtility.DisplayDialog("File Exists",
                $"File {fileName}.asset already exists. Do you want to overwrite it?",
                "Overwrite", "Create New"))
            {
                break;
            }
            fileName = $"ExtrudedMesh_{counter}";
            fullPath = $"{meshSavePath}/{fileName}.asset";
            counter++;
        }

        // Save the mesh
        Mesh meshToSave = Instantiate(mesh);
        AssetDatabase.CreateAsset(meshToSave, fullPath);
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();

        EditorUtility.DisplayDialog("Success",
            $"Mesh saved to {fullPath}", "OK");

        // Ping the saved mesh in the Project window
        EditorGUIUtility.PingObject(
            AssetDatabase.LoadAssetAtPath<Mesh>(fullPath));
    }

    // Add to the help box in DrawArea
    private void ShowInstructions()
    {
        EditorGUILayout.HelpBox(
            "Instructions:\n" +
            "- Click to place points\n" +
            "- Hold Shift for straight lines\n" +
            "- Click near first point to close shape\n" +
            "- Right-click to remove last point\n" +
            "- Select mesh and click 'Save Mesh' to save asset",
            MessageType.Info);
    }

    void DrawArea()
    {
        Rect drawRect = GUILayoutUtility.GetRect(drawAreaSize, drawAreaSize);
GUI.Box(drawRect, "");

Event e = Event.current;
Vector2 mousePos = e.mousePosition;

if (drawRect.Contains(mousePos))
{
    isNearStart = linePoints.Count > 2 &&
                  Vector2.Distance(mousePos, linePoints[0]) < closeThreshold;

    if (e.type == EventType.MouseDown)
    {
        if (e.button == 0) // Left click
        {
            Vector2 newPoint = mousePos;

            if (e.shift && linePoints.Count > 0)
            {
                Vector2 diff = newPoint - linePoints[linePoints.Count - 1];
                if (Mathf.Abs(diff.x) > Mathf.Abs(diff.y))
                    newPoint.y = linePoints[linePoints.Count - 1].y;
                else
                    newPoint.x = linePoints[linePoints.Count - 1].x;
            }

            if (isNearStart)
            {
                linePoints.Add(linePoints[0]);
                GenerateMesh();
                linePoints.RemoveAt(linePoints.Count - 1); // Remove the duplicate closing point
                Repaint();
            }
            else
            {
                linePoints.Add(newPoint);
                lastPoint = newPoint;
                Repaint();
            }
        }
        else if (e.button == 1 && linePoints.Count > 0) // Right click
        {
            // Remove the last point
            linePoints.RemoveAt(linePoints.Count - 1);

            // Update lastPoint
            if (linePoints.Count > 0)
                lastPoint = linePoints[linePoints.Count - 1];
            else
                lastPoint = null;

            Repaint();
            e.Use(); // Consume the event
        }
    }
            // ... rest of the input handling
        }

        Handles.BeginGUI();
        // Draw existing lines
        if (linePoints.Count > 0)
        {
            Handles.color = Color.blue;
            for (int i = 0; i < linePoints.Count - 1; i++)
            {
                Handles.DrawLine(linePoints[i], linePoints[i + 1]);
            }

            // Draw preview line
            if (drawRect.Contains(mousePos) && linePoints.Count > 0)
            {
                Vector2 previewEnd = mousePos;
                if (e.shift) // Snap preview to axis
                {
                    Vector2 diff = previewEnd - linePoints[linePoints.Count - 1];
                    if (Mathf.Abs(diff.x) > Mathf.Abs(diff.y))
                        previewEnd.y = linePoints[linePoints.Count - 1].y;
                    else
                        previewEnd.x = linePoints[linePoints.Count - 1].x;
                }
                Handles.color = isNearStart ? Color.green : Color.gray;
                Handles.DrawLine(linePoints[linePoints.Count - 1], previewEnd);
            }
        }

        // Draw points
        foreach (var point in linePoints)
        {
            // Highlight first point when mouse is near
            Handles.color = (point == linePoints[0] && isNearStart) ? Color.green : Color.red;
            Handles.DrawSolidDisc(point, Vector3.forward, point == linePoints[0] ? 5 : 3);
        }
        Handles.EndGUI();

        // Show help text for closing shape
        if (isNearStart)
        {
            Rect helpRect = new Rect(mousePos.x + 15, mousePos.y + 15, 150, 20);
            GUI.Label(helpRect, "Click to close shape", EditorStyles.helpBox);
        }

        #endregion

    }

    private void GenerateMesh()
    {
        if (linePoints.Count < 3) return;

        List<Vector3> vertices = new List<Vector3>();
        List<int> triangles = new List<int>();

        // Create vertices - ensure we don't duplicate the closing vertex
        for (int i = 0; i < linePoints.Count; i++)
        {
            Vector2 point = linePoints[i];
            // Skip if this is a duplicate of the first point
            if (i == linePoints.Count - 1 && Vector2.Distance(point, linePoints[0]) < closeThreshold)
                continue;

            vertices.Add(new Vector3((point.x - drawAreaSize / 2) / 100f,
                                   -(point.y - drawAreaSize / 2) / 100f, 0));
            vertices.Add(new Vector3((point.x - drawAreaSize / 2) / 100f,
                                   -(point.y - drawAreaSize / 2) / 100f, extrudeDepth));
        }

        int vertCount = vertices.Count / 2;

        // Create side faces
        for (int i = 0; i < vertCount; i++)
        {
            int next = (i + 1) % vertCount;
            int current = i * 2;
            int nextVertex = next * 2;

            // First triangle
            triangles.Add(current);
            triangles.Add(current + 1);
            triangles.Add(nextVertex);

            // Second triangle
            triangles.Add(nextVertex);
            triangles.Add(current + 1);
            triangles.Add(nextVertex + 1);
        }

        // Create front face
        List<Vector2> frontFacePoints = new List<Vector2>();
        for (int i = 0; i < vertCount; i++)
        {
            frontFacePoints.Add(new Vector2(vertices[i * 2].x, vertices[i * 2].y));
        }

        // Triangulate front face
        Triangulator tr = new Triangulator(frontFacePoints.ToArray());
        int[] frontIndices = tr.Triangulate();

        // Add front face triangles
        for (int i = 0; i < frontIndices.Length; i += 3)
        {
            triangles.Add(frontIndices[i] * 2);
            triangles.Add(frontIndices[i + 1] * 2);
            triangles.Add(frontIndices[i + 2] * 2);
        }

        // Add back face triangles (reversed winding)
        for (int i = 0; i < frontIndices.Length; i += 3)
        {
            triangles.Add(frontIndices[i + 2] * 2 + 1);
            triangles.Add(frontIndices[i + 1] * 2 + 1);
            triangles.Add(frontIndices[i] * 2 + 1);
        }

        Mesh mesh = new Mesh();
        mesh.vertices = vertices.ToArray();
        mesh.triangles = triangles.ToArray();
        mesh.RecalculateNormals();//21:23

        GameObject go = new GameObject("Extruded_Mesh");//21:32
        MeshFilter mf = go.AddComponent<MeshFilter>();
        mf.sharedMesh = mesh;

        MeshRenderer mr = go.AddComponent<MeshRenderer>();
        Material mat = new Material(Shader.Find("Universal Render Pipeline/Lit"));
        mat.color = meshColor;
        mat.SetFloat("_Cull", (float)UnityEngine.Rendering.CullMode.Off);
        mat.doubleSidedGI = true;
        mr.sharedMaterial = mat;

        MeshCollider mc = go.AddComponent<MeshCollider>();
        mc.convex = true;
        mc.sharedMesh = mesh;

        if (addRigidbody)
        {
            Rigidbody rb = go.AddComponent<Rigidbody>();
            rb.mass = meshMass;
        }

        Selection.activeGameObject = go;
    }
}

// Helper class for triangulation
public class Triangulator
{
    private List<Vector2> m_points = new List<Vector2>();

    public Triangulator(Vector2[] points)
    {
        m_points = new List<Vector2>(points);
    }

    public int[] Triangulate()
    {
        List<int> indices = new List<int>();

        int n = m_points.Count;
        if (n < 3)
            return indices.ToArray();

        int[] V = new int[n];
        if (Area() > 0)
        {
            for (int v = 0; v < n; v++)
                V[v] = v;
        }
        else
        {
            for (int v = 0; v < n; v++)
                V[v] = (n - 1) - v;
        }

        int nv = n;
        int count = 2 * nv;
        for (int v = nv - 1; nv > 2;)
        {
            if ((count--) <= 0)
                return indices.ToArray();

            int u = v;
            if (nv <= u)
                u = 0;
            v = u + 1;
            if (nv <= v)
                v = 0;
            int w = v + 1;
            if (nv <= w)
                w = 0;

            if (Snip(u, v, w, nv, V))
            {
                int a, b, c, s, t;
                a = V[u];
                b = V[v];
                c = V[w];
                indices.Add(a);
                indices.Add(b);
                indices.Add(c);
                for (s = v, t = v + 1; t < nv; s++, t++)
                    V[s] = V[t];
                nv--;
                count = 2 * nv;
            }
        }

        indices.Reverse();
        return indices.ToArray();
    }

    private float Area()
    {
        int n = m_points.Count;
        float A = 0.0f;
        for (int p = n - 1, q = 0; q < n; p = q++)
        {
            Vector2 pval = m_points[p];
            Vector2 qval = m_points[q];
            A += pval.x * qval.y - qval.x * pval.y;
        }
        return (A * 0.5f);
    }

    private bool Snip(int u, int v, int w, int n, int[] V)
    {
        Vector2 A = m_points[V[u]];
        Vector2 B = m_points[V[v]];
        Vector2 C = m_points[V[w]];

        if (Mathf.Epsilon > (((B.x - A.x) * (C.y - A.y)) - ((B.y - A.y) * (C.x - A.x))))
            return false;

        for (int p = 0; p < n; p++)
        {
            if ((p == u) || (p == v) || (p == w))
                continue;
            Vector2 P = m_points[V[p]];
            if (InsideTriangle(A, B, C, P))
                return false;
        }
        return true;
    }

    private bool InsideTriangle(Vector2 A, Vector2 B, Vector2 C, Vector2 P)
    {
        float ax, ay, bx, by, cx, cy, apx, apy, bpx, bpy, cpx, cpy;
        float cCROSSap, bCROSScp, aCROSSbp;

        ax = C.x - B.x; ay = C.y - B.y;
        bx = A.x - C.x; by = A.y - C.y;
        cx = B.x - A.x; cy = B.y - A.y;
        apx = P.x - A.x; apy = P.y - A.y;
        bpx = P.x - B.x; bpy = P.y - B.y;
        cpx = P.x - C.x; cpy = P.y - C.y;

        aCROSSbp = ax * bpy - ay * bpx;
        cCROSSap = cx * apy - cy * apx;
        bCROSScp = bx * cpy - by * cpx;

        return ((aCROSSbp >= 0.0f) && (bCROSScp >= 0.0f) && (cCROSSap >= 0.0f));
    }
}

P.S.

Some people are just mad on AI for no reason even the first try gave me 344 code lines, if had a bigger paid token limit i could even fix it in a less than few extra prompts.

I actually suppose that old pro’s are just jealous that nowadays there are tools that can do something that you would be making a whole working week, but still don’t understand how their behavior looks to others.

P.S.S.

It does it basic job, but is not perfect, you can give code to GPT again or modify code yourself for new features and improvements.

Screens:

I confess Ive actually lost track of what you’re mad at.

I made my free for everyone tool and happy about it, the @Murgilod is the main culprit and an angry guy everywhere i saw him in other people’s topics, though maybe we should thank him, as he kept me more in this discussion, while i was having a headache IRL, that i saw decent replies about just making colorful cubes generator for oversimplified outblocking, prototyping props.

What is the point of* examples if here is right before your eyes a working variant for Unity.

By this logic you must start reading books and make block schemes like its 60’s, because it is professionals.

Yes, AI hallucinate, but don’t damn tell me that I could finish this one in a day and “its ONLY A LITTLE COMPLICATED”, I’ve never even wrote editor code myself in a life!

Edit:
I know its a bad habit to really on big daddy’s auto stuff, but I’m a kid in a sandbox, and people are like taking my candies and giving me books for 50+ year old people and (edit2) doing it even when i said “Fine! I got your point, I even watched your course and did a bit of practice! I’m not the Iron-Man here!”.

Edit 3:
Some latest 2024 AI’s almost not hallucinate to comparison to older ones (not in 3D case, though), if you pay it and get 512k context stuff, you can even not care about reasking it more to fix everything.

You people sound like you give it “Make me 500 perfect lines”, it is for iterating not a perfection from first try.

Edit4:
Usually it gives 100-200 lines without bugs, depending on the complexity of matter it can make a critical bug even in 50 lines output, then you ask to bugfix or find bugs and ask for even more concrete bugfix.

Edit 5:
You iterate, prompt it properly, get result, become a happy man with 1k or more working lines a code for all your stuff in less than a day.
(though it is crap in networking totally, but i haven’t tried in newer, main problem even new are up to 2022 only and only rags of 2023 are in it)

Very late edit:
Oh well it seems in this one i too did @Murgilod mistake of not carefully reading and waiting 5 minutes for the final edit. It was about me potentially not understanding code from AI not “go and learn this one it is just a bit more complicated and solves issues” stuff. Anyway nothing bad happened below with this one so okay. (And i literally had temperature at the moment, hard to keep track and the English isn’t my main language)

the only unhappy guy in the end that blacklisted me and tried to do “go do proper ai crap i hate such topics” is @Murgilod

And for my case this extruder is good, it gives me props that i can put around the level already with a rigidbody, i can even put other scripts that halfly made by AI with simple new AddComponent lines.

Don’t actually get the fuss about AI from others, when i was starting i did everything manually and by looking in internet, but the AI is literally a compilation of the whole internet with fastest search you can imagine, where you don’t need to click around like a madman. You pee in toilet and GPT gives you a huge code while at it.

It is the definition of perfection for a Junior like me, after GPT 4, Claude 3.5 appeared.

Edit:
There always a man that likes to troll on forums and say that he isn’t a troll, sometimes even believing in it.

Unity Learn thinks that I’m “Job ready” after finishing their Junior pathway course that doesn’t even cover Tasks (They already existed at that moment)

So I proudly announce, I’m a pro too, just a Junior one, officially, Unity confirmed! Lol.

Edit 2:

Also Isto Inc. thinks he is “Intermediate” with his 2 weeks at that moment.

Proudly announcing @everyone, I’m also not some Beginner avoider of everything.

I am. -The Justice-. I am the… I mean an Intermediate.

This thread got a lot more active than I expected. Anyway, some of my (unsolicited) thoughts:

  1. It’s worth looking into AI, as the quality improves exponentially over time. There isn’t some badge of honor in spending tons of time learning Blender. Life is gonna get easier; let’s embrace it.
  2. Based on licensing, the AI models are gonna cost something. They shouldn’t be expected to be free, especially given the compute costs.

AI is not the coming of Satan to be sure, but like you say it has a cost, someone somewhere has to pay.

Learning blender and becoming great is a long path - but then, isnt that true of a lot of things? As mentioned, you can go through unity learn, and have a certificate, but you wont come out knowing it all, hell half of us know “all”, but you now have a recognised level of foundation.

Having a functional level knowledge of blender, a familarity so you can knock something out, is a valid skill to spend a bit of time on, and randomly practice. Much like my pittful efforts here, but I made mine in probuilder. I know probuilder has a good number of limitations, so does umodeler, which likely would have made a better job, but because it wasnt suitable for large areas, ive been mostly in probuidler the last year so only fiddled in umodeler, but that helps with uv painting, rigging, animations and the like. The advantage to me for those 2 is a) they can even co-exist, but also, b) they are in an environment I know and im comfortable with. Are they blender/maya? no, but in a way, they arent pretending to be.

Someone (sorry not scroling back) pointed out that blocking out a level doesnt even need low poly, there are even prototyping assets, how many capsules on a plane with a few blocks have we all done?

Im glad our man found an answer, but i wasnt overly clear the answer in the end :smiley:

Unsurprisingly, nobody actually bothers to look at what the results of 3dgen AI actually ends up like despite examples being in the thread. It produces unworkable and inconsistent results, ridiculously triangle dense and with mangled textures. Because of the poor UV layouts, attempting to use texture painting or procedural materials like you’d get out Substance Designer will result in obvious seams and texel density issues.

Learning about 3d modelling as a process and the tools involved is not about having a badge of honor, it’s about having relevant, applicable skills to avoid these bad results in the first place. Anyone who actually knows about how to use these tools would take one look at 3dgen AI results and go “I’d have to retopologize this for it to be usable at all” and then either discard those results or retopologize it. For something like a boot or anything else so simplistic? They’d immediately discard it because it would take a trivial amount of time to make something with a tool that works.

Because right now? 3dgen AI doesn’t work. It is a novelty. It’s like using the earliest versions of DALL-E where you’d get something that would vaguely resemble what you specified in the prompt, but is completely and utterly incomprehensible in other areas. So what if it’ll get better in the future? The problem is that it’s bad now and people will use it as an excuse to not learn. That’s what the problem in this thread is.

Additionally, AI isn’t improving in quality exponentially over time. We’ve already started to see a plateau forming in various sectors, which was already reported by OpenAI. Hallucinations in text generation are still pretty bad, no matter how many tokens you’re willing to throw at it, so now there’s a feedback loop of people being unwilling to actually learn how things work being given results that aren’t any good.

There’s recent research from Nvidia with amazing quad topology. The distance between now and the future is contracting. I’m not saying not to learn 3D modeling at all; there’s just going to be less and less of a need for the skillset at all levels of sophistication because we’re gonna be able to automate more of it over time.

And I’d say AI is still accelerating exponentially, take a look at OpenAI’s o3 benchmarks.

The future doesn’t matter when we’re talking about current tools and skillsets.

None of those benchmarks are exponential and, additionally, they’re marketing materials.

At first I thought “troll” or “unintentional troll”, but you are just a negative type guy (and also ignorant about other people lines, while protecting yours).

Btw, I still don’t understand why you kept replying to me when i literally said: “I agree” and is still replying to topic which is solved with zero “additional details” (which forum says “please” to people by default, though empty talk is not forbidden), that everything is crap, go learn perfectly
(oh-ho put a long what is properly that sounds like the definition what is perfectly in actual life, when you don’t overexaggerate the word)

P.S.
Merry Christmas, btw.

And btw i just half broke my keyboard, lol, now buttons are doubling
(do not clean it with way too wet and soap rag, it just must be slightly wet and better to just remove keycaps (if it allows) and wash them separately and put back it dry, of course)

P.S.S

To be honest I even overdid your reply, regular man would go fart in sofa, instead of watching a video and then unproperly practicing it yourself without reference for 1h 35 minutes.

And you still don’t want any end result even about the proper Sobor chair for 900$ from me.

P.S.S.S

Here’s a Blender addon (if you like it so much that you even hate Maya and stuff):

hotkey_cheatsheet_window.zip (2.1 KB)

NOW will you say that AI is useful?
Okay maybe the notes inside are crap, but this is already better than to run in other places if your addon bar is not already full.

And you can even write inside the cheatsheet_text = “…” anything you want not even placing dots after numbers, it will add it itself.

Edit:

And wow yes, probably it is possible to do the same extruder from Unity and even better than to create 2 vertices extrude them and then extrude the whole thing again.

by the way there is literally 1 example not “'s”, where i gave it THE WORST CASE SKETCH.
Or now you think that outlblock models from other guys were AI too or so-ing?