// File: /workspace/github_cpp_makefile_star2_O2/ticky[P]ps2iconsys/src/ps2_ps2icon.cpp
// Function: PS2Icon::SetGeometry(OBJ_Mesh const&, float)
void PS2Icon::SetGeometry(OBJ_Mesh const& mesh, float scale_factor)
{
	//rewrite header:
	header.file_id = 0x010000;	header.reserved = 0x3F800000;
	header.animation_shapes = 1;
	header.n_vertices = mesh.GetNFaces() * 3;

	//copy animation data:
	AllocateVertexMemory();
	float* tmptexture = new float[mesh.GetNFaces() * 9];

	mesh.GetMeshGeometryUnindexed(fvertices, fnormals, tmptexture, scale_factor);
	for(int i=0; i<mesh.GetNFaces() * 3; i++) {
		vertices[i].f16_x = convert_f32_to_f16(fvertices[i*3]);
		vertices[i].f16_y = convert_f32_to_f16(fvertices[i*3 + 1]);
		vertices[i].f16_z = convert_f32_to_f16(fvertices[i*3 + 2]);
		vertices[i].f16_unknown = 0;

		normals[i].f16_x = convert_f32_to_f16(fnormals[i*3]);
		normals[i].f16_y = convert_f32_to_f16(fnormals[i*3 + 1]);
		normals[i].f16_z = convert_f32_to_f16(fnormals[i*3 + 2]);
		normals[i].f16_unknown = 0;

		vert_texture[i].f16_u = convert_f32_to_f16(tmptexture[i*3]);
		vert_texture[i].f16_v = convert_f32_to_f16(tmptexture[i*3 + 1]);
		vert_texture[i].color = 0xFFFFFFFF;
	}
	delete[] tmptexture;

	//rewrite animation data:
	if(animation)    { delete[] animation;        animation = NULL; }
	if(anim_keys)    {
		for(unsigned int i=0; i<anim_header.n_frames; i++) {
			if(anim_keys[i]) {
				delete[] anim_keys[i];
				anim_keys[i] = NULL;
			}
		}
		delete[] anim_keys;
		anim_keys = NULL;
	}
	//insert default values for no animation:
	anim_header.n_frames = 1;
	animation = new Frame_Data[1];
	animation->n_keys   = 1;
	animation->shape_id = 0;
	anim_keys = new Frame_Key*[1];
	anim_keys[0] = new Frame_Key[1];
	anim_keys[0]->time  = 0.0f;
	anim_keys[0]->value = 1.0f;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x10, %rsp
movss %xmm0, 0xc(%rsp)
movq %rsi, %r14
movq %rdi, %rbx
movabsq $0x100010000, %rax      # imm = 0x100010000
movq %rax, (%rdi)
movl $0x3f800000, 0xc(%rdi)  # imm = 0x3F800000
movq %rsi, %rdi
callq 0x3604
leal (%rax,%rax,2), %eax
movl %eax, 0x10(%rbx)
movq %rbx, %rdi
callq 0x559c
movq %r14, %rdi
callq 0x3604
leal (%rax,%rax,8), %ecx
movslq %ecx, %rcx
shlq $0x2, %rcx
testl %eax, %eax
pushq $-0x1
popq %rdi
cmovnsq %rcx, %rdi
callq 0x2030
movq %rax, %r15
movq 0x30(%rbx), %rsi
movq 0x38(%rbx), %rdx
movq %r14, %rdi
movq %rax, %rcx
movd 0xc(%rsp), %xmm0
callq 0x6510
xorl %r12d, %r12d
xorl %r13d, %r13d
movq %r14, %rdi
callq 0x3604
leal (%rax,%rax,2), %eax
cltq
cmpq %rax, %r13
jge 0x57c6
movq 0x18(%rbx), %rax
movq 0x30(%rbx), %rcx
movsd (%rcx,%r12), %xmm0
movaps 0x3c0a(%rip), %xmm1     # 0x9330
mulps %xmm1, %xmm0
cvttps2dq %xmm0, %xmm0
pshuflw $0xe8, %xmm0, %xmm0     # xmm0 = xmm0[0,2,2,3,4,5,6,7]
movd %xmm0, (%rax,%r13,8)
movss 0x8(%rcx,%r12), %xmm0
movss 0x3bad(%rip), %xmm2     # 0x92f4
mulss %xmm2, %xmm0
cvttss2si %xmm0, %ecx
movw %cx, 0x4(%rax,%r13,8)
andw $0x0, 0x6(%rax,%r13,8)
movq 0x20(%rbx), %rax
movq 0x38(%rbx), %rcx
movsd (%rcx,%r12), %xmm0
mulps %xmm1, %xmm0
cvttps2dq %xmm0, %xmm0
pshuflw $0xe8, %xmm0, %xmm0     # xmm0 = xmm0[0,2,2,3,4,5,6,7]
movd %xmm0, (%rax,%r13,8)
movss 0x8(%rcx,%r12), %xmm0
mulss %xmm2, %xmm0
cvttss2si %xmm0, %ecx
movw %cx, 0x4(%rax,%r13,8)
andw $0x0, 0x6(%rax,%r13,8)
movq 0x28(%rbx), %rax
movsd (%r15,%r12), %xmm0
mulps %xmm1, %xmm0
cvttps2dq %xmm0, %xmm0
pshuflw $0xe8, %xmm0, %xmm0     # xmm0 = xmm0[0,2,2,3,4,5,6,7]
movd %xmm0, (%rax,%r13,8)
orl $-0x1, 0x4(%rax,%r13,8)
incq %r13
addq $0xc, %r12
jmp 0x56fb
movq %r15, %rdi
callq 0x2230
movq 0x58(%rbx), %rdi
testq %rdi, %rdi
je 0x57e1
callq 0x2230
andq $0x0, 0x58(%rbx)
cmpq $0x0, 0x60(%rbx)
je 0x5822
xorl %r14d, %r14d
movl 0x50(%rbx), %eax
movq 0x60(%rbx), %rdi
cmpq %rax, %r14
jae 0x5813
movq (%rdi,%r14,8), %rdi
testq %rdi, %rdi
je 0x580e
callq 0x2230
movq 0x60(%rbx), %rax
andq $0x0, (%rax,%r14,8)
incq %r14
jmp 0x57eb
testq %rdi, %rdi
je 0x581d
callq 0x2230
andq $0x0, 0x60(%rbx)
movl $0x1, 0x50(%rbx)
pushq $0x8
popq %r14
movq %r14, %rdi
callq 0x2030
movq %rax, 0x58(%rbx)
movabsq $0x100000000, %rcx      # imm = 0x100000000
movq %rcx, (%rax)
movq %r14, %rdi
callq 0x2030
movq %rax, %r15
movq %rax, 0x60(%rbx)
movq %r14, %rdi
callq 0x2030
movq %rax, (%r15)
movsd 0x3ab8(%rip), %xmm0     # 0x9320
movsd %xmm0, (%rax)
addq $0x10, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq