// File: /workspace/github_c_makefile_star2_O1/Nealsbo[P]C-Software-Renderer/src/objloader.c
// Function: Model_CreateBaseBox
obj_model_t *Model_CreateBaseBox( const char *model_name){
    int i;
    obj_model_t *model = (obj_model_t *)malloc(sizeof(obj_model_t));
    if(model == NULL){
        printf("Error: Cannot create model object '%s'\n", model_name);
        return NULL;
    }

    memcpy(model->name, model_name, MAX_NAME_LENGTH);                   //Set object name by argument

    model->vertCount   = 8;                                             //Allocation prepared data for model, box in that case
    model->trisCount   = 12;

    float    v_arr[8][3]  = {{-1.0, -1.0,  1.0},                        //Vertices data for box model
                             { 1.0, -1.0,  1.0},
                             {-1.0,  1.0,  1.0},
                             { 1.0,  1.0,  1.0},
                             {-1.0,  1.0, -1.0},
                             { 1.0,  1.0, -1.0},
                             {-1.0, -1.0, -1.0},
                             { 1.0, -1.0, -1.0}};

    float   vn_arr[24][3] = {{ 0.0,  0.0,  1.0},
                             { 0.0,  0.0,  1.0},
                             { 0.0,  0.0,  1.0},
                             { 0.0,  0.0,  1.0},
                             { 0.0,  1.0,  0.0},
                             { 0.0,  1.0,  0.0},
                             { 0.0,  1.0,  0.0},
                             { 0.0,  1.0,  0.0},
                             { 0.0,  0.0, -1.0},
                             { 0.0,  0.0, -1.0},
                             { 0.0,  0.0, -1.0},
                             { 0.0,  0.0, -1.0},
                             { 0.0, -1.0,  0.0},
                             { 0.0, -1.0,  0.0},
                             { 0.0, -1.0,  0.0},
                             { 0.0, -1.0,  0.0},
                             { 1.0,  0.0,  0.0},
                             { 1.0,  0.0,  0.0},
                             { 1.0,  0.0,  0.0},
                             { 1.0,  0.0,  0.0},
                             {-1.0,  0.0,  0.0},
                             {-1.0,  0.0,  0.0},
                             {-1.0,  0.0,  0.0},
                             {-1.0,  0.0,  0.0}};

    float   vt_arr[24][2] = {{ 0.0, 0.0},
                             { 1.0, 0.0},
                             { 1.0, 1.0},
                             { 0.0, 1.0},
                             {-0.0, 0.0},
                             { 1.0, 0.0},
                             { 1.0, 1.0},
                             {-0.0, 1.0},
                             {-0.0, 0.0},
                             { 1.0, 0.0},
                             { 1.0, 1.0},
                             {-0.0, 1.0},
                             { 0.0, 0.0},
                             { 1.0, 0.0},
                             { 1.0, 1.0},
                             { 0.0, 1.0},
                             { 0.0, 0.0},
                             { 1.0, 0.0},
                             { 1.0, 1.0},
                             { 0.0, 1.0},
                             { 0.0, 0.0},
                             { 1.0, 0.0},
                             { 1.0, 1.0},
                             { 0.0, 1.0}};

    int      f_arr[12][9] = {{1,  1,  1,  2,  2,  2,  3,  4,  3},       //Face index data for box model
                             {3,  4,  3,  2,  2,  2,  4,  3,  4},
                             {3,  5,  5,  4,  6,  6,  5,  8,  7},
                             {5,  8,  7,  4,  6,  6,  6,  7,  8},
                             {5,  9,  9,  6, 10, 10,  7, 12, 11},
                             {7, 12, 11,  6, 10, 10,  8, 11, 12},
                             {7, 13, 13,  8, 14, 14,  1, 16, 15},
                             {1, 16, 15,  8, 14, 14,  2, 15, 16},
                             {2, 17, 17,  8, 18, 18,  4, 20, 19},
                             {4, 20, 19,  8, 18, 18,  6, 19, 20},
                             {7, 21, 21,  1, 22, 22,  5, 24, 23},
                             {5, 24, 23,  1, 22, 22,  3, 23, 24}};

    model->position    = vec3_create(0.0, 0.0, 0.0);
    model->rotation    = vec3_create(0.0, 0.0, 0.0);
    model->scale       = vec3_create(1.0, 1.0, 1.0);
    model->baseColor   = Color_Init(255, 255, 255, 255);
    model->diffmap     = NULL;
    model->normalmap   = NULL;

    model->vertices    = (vec3 *)malloc(sizeof(vec3) * 8);
    for(i = 0; i < 8; i++){
        model->vertices[i] = (vec3){v_arr[i][0], v_arr[i][1], v_arr[i][2]};
    }

    model->normals     = (vec3 *)malloc(sizeof(vec3) * 24);
    for(i = 0; i < 24; i++){
        model->normals[i] = vec3_create(vn_arr[i][0], vn_arr[i][1], vn_arr[i][2]);
    }

    model->textcoords  = (vec2 *)malloc(sizeof(vec2) * 24);
    for(i = 0; i < 24; i++){
        model->textcoords[i] = vec2_create(vt_arr[i][0], vt_arr[i][1]);
    }

    model->faces       = (obj_face_t *)malloc(sizeof(obj_face_t) * 12);
    for(i = 0; i < 12; i++){
        model->faces[i]  = Face_Create(3, vec3i_arrayToVec3ip(9, f_arr[i]  ));
    }

    model->diffmap = (texture_t *)malloc(sizeof(texture_t));
    model->diffmap->bitmap = Bitmap_LoadPPM6("./assets/texture.ppm");
    
    model->normalmap = (texture_t *)malloc(sizeof(texture_t));
    model->normalmap->bitmap = Bitmap_LoadPPM6("./assets/texture_n.ppm");

    return model;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x1b0, %rsp            # imm = 0x1B0
movq %rdi, %r14
movl $0x170, %edi            # imm = 0x170
callq 0x11a0
testq %rax, %rax
je 0x5332
movq %rax, %rbx
movl $0x100, %edx            # imm = 0x100
movq %rax, %rdi
movq %r14, %rsi
callq 0x1100
movl $0x8, 0x120(%rbx)
movl $0xc, 0x12c(%rbx)
leaq 0x373d(%rip), %rsi      # 0x8880
movq %rsp, %r14
movl $0x1b0, %edx            # imm = 0x1B0
movq %r14, %rdi
callq 0x1100
xorps %xmm0, %xmm0
xorps %xmm1, %xmm1
xorps %xmm2, %xmm2
callq 0x2a5a
movlps %xmm0, 0x130(%rbx)
movss %xmm1, 0x138(%rbx)
xorps %xmm0, %xmm0
xorps %xmm1, %xmm1
xorps %xmm2, %xmm2
callq 0x2a5a
movlps %xmm0, 0x13c(%rbx)
movss %xmm1, 0x144(%rbx)
movss 0x2e7f(%rip), %xmm0     # 0x8014
movaps %xmm0, %xmm1
movaps %xmm0, %xmm2
callq 0x2a5a
movlps %xmm0, 0x148(%rbx)
movss %xmm1, 0x150(%rbx)
movl $0xff, %edi
movl $0xff, %esi
movl $0xff, %edx
movl $0xff, %ecx
callq 0x1e50
movl %eax, 0x154(%rbx)
movl $0x60, %edi
callq 0x11a0
xorps %xmm0, %xmm0
movups %xmm0, 0x158(%rbx)
movq %rax, 0x100(%rbx)
movl $0x8, %ecx
leaq 0x344b(%rip), %rdx      # 0x8640
movq -0x8(%rcx,%rdx), %rsi
movss (%rcx,%rdx), %xmm0
movq %rsi, -0x8(%rax,%rcx)
movss %xmm0, (%rax,%rcx)
addq $0xc, %rcx
cmpq $0x68, %rcx
jne 0x51f5
movl $0x120, %edi            # imm = 0x120
callq 0x11a0
movq %rax, %r15
movq %rax, 0x110(%rbx)
movl $0x8, %r12d
leaq 0x346c(%rip), %r13      # 0x86a0
movss -0x8(%r12,%r13), %xmm0
movss -0x4(%r12,%r13), %xmm1
movss (%r12,%r13), %xmm2
callq 0x2a5a
movlps %xmm0, -0x8(%r15,%r12)
movss %xmm1, (%r15,%r12)
addq $0xc, %r12
cmpq $0x128, %r12            # imm = 0x128
jne 0x5234
movl $0xc0, %edi
callq 0x11a0
movq %rax, %r15
movq %rax, 0x118(%rbx)
xorl %r12d, %r12d
leaq 0x353c(%rip), %r13      # 0x87c0
movss (%r13,%r12,8), %xmm0
movss 0x4(%r13,%r12,8), %xmm1
callq 0x27fd
movlps %xmm0, (%r15,%r12,8)
incq %r12
cmpq $0x18, %r12
jne 0x5284
movl $0xc0, %edi
callq 0x11a0
movq %rax, %r15
movq %rax, 0x108(%rbx)
movl $0x8, %r12d
movl $0x9, %edi
movq %r14, %rsi
callq 0x2939
movl $0x3, -0x8(%r15,%r12)
movq %rax, (%r15,%r12)
addq $0x24, %r14
addq $0x10, %r12
cmpq $0xc8, %r12
jne 0x52bf
movl $0x8, %edi
callq 0x11a0
movq %rax, %r14
movq %rax, 0x158(%rbx)
leaq 0x37a5(%rip), %rdi      # 0x8aaa
callq 0x223a
movq %rax, (%r14)
movl $0x8, %edi
callq 0x11a0
movq %rax, %r14
movq %rax, 0x160(%rbx)
leaq 0x3797(%rip), %rdi      # 0x8abf
callq 0x223a
movq %rax, (%r14)
jmp 0x5345
leaq 0x3727(%rip), %rdi      # 0x8a60
xorl %ebx, %ebx
movq %r14, %rsi
xorl %eax, %eax
callq 0x1040
movq %rbx, %rax
addq $0x1b0, %rsp            # imm = 0x1B0
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq