/* ============================================================================= * ud_decode() - Instruction decoder. Returns the number of bytes decoded. * ============================================================================= */ unsigned int ud_decode( struct ud* u ) { inp_start(u); if ( clear_insn( u ) ) { ; /* error */ } else if ( get_prefixes( u ) != 0 ) { ; /* error */ } else if ( search_itab( u ) != 0 ) { ; /* error */ } else if ( do_mode( u ) != 0 ) { ; /* error */ } else if ( disasm_operands( u ) != 0 ) { ; /* error */ } else if ( resolve_mnemonic( u ) != 0 ) { ; /* error */ } /* Handle decode error. */ if ( u->error ) { /* clear out the decode data. */ clear_insn( u ); /* mark the sequence of bytes as invalid. */ u->itab_entry = & ie_invalid; u->mnemonic = u->itab_entry->mnemonic; } u->insn_offset = u->pc; /* set offset of instruction */ u->insn_fill = 0; /* set translation buffer index to 0 */ u->pc += u->inp_ctr; /* move program counter by bytes decoded */ gen_hex( u ); /* generate hex code */ /* return number of bytes disassembled. */ return u->inp_ctr; }
/* ============================================================================= * ud_decode() - Instruction decoder. Returns the number of bytes decoded. * ============================================================================= */ unsigned int ud_decode(struct ud *u) { inp_start(u); clear_insn(u); u->le = &ud_lookup_table_list[0]; u->error = decode_prefixes(u) == -1 || decode_opcode(u) == -1 || u->error; /* Handle decode error. */ if (u->error) { /* clear out the decode data. */ clear_insn(u); /* mark the sequence of bytes as invalid. */ u->itab_entry = & s_ie__invalid; u->mnemonic = u->itab_entry->mnemonic; } /* maybe this stray segment override byte * should be spewed out? */ if ( !P_SEG( u->itab_entry->prefix ) && u->operand[0].type != UD_OP_MEM && u->operand[1].type != UD_OP_MEM ) u->pfx_seg = 0; u->insn_offset = u->pc; /* set offset of instruction */ u->insn_fill = 0; /* set translation buffer index to 0 */ u->pc += u->inp_ctr; /* move program counter by bytes decoded */ gen_hex( u ); /* generate hex code */ /* return number of bytes disassembled. */ return u->inp_ctr; }
void AWorldSpawn::gen_chunk() { if (hex_asset) { for (int z = 0; z < SIZEZ; ++z) { for (int y = 0; y < SIZEY; ++y) { for (int x = 0; x < SIZEX; ++x) { Hex* hex = new Hex(); hex->x = x; hex->y = y; hex->z = z; hex_list.push_back(hex); gen_hex(x, y, z); } } } for (int z = -1; z < SIZEZ; ++z) { for (int y = -1; y < SIZEY; ++y) { for (int x = -1; x < SIZEX; ++x) { bool corner0 = (get_hex(x + 1, y, z + 1) != NULL && get_hex(x + 1, y, z + 1)->type != BLOCK_TYPE_AIR); bool corner1 = (get_hex(x + 1, y + 1, z + 1) != NULL && get_hex(x + 1, y + 1, z + 1)->type != BLOCK_TYPE_AIR); bool corner2 = (get_hex(x, y + 1, z + 1) != NULL && get_hex(x, y + 1, z + 1)->type != BLOCK_TYPE_AIR); bool corner3 = (get_hex(x, y, z + 1) != NULL && get_hex(x, y, z + 1)->type != BLOCK_TYPE_AIR); bool corner4 = (get_hex(x + 1, y, z) != NULL && get_hex(x + 1, y, z)->type != BLOCK_TYPE_AIR); bool corner5 = (get_hex(x + 1, y + 1, z) != NULL && get_hex(x + 1, y + 1, z)->type != BLOCK_TYPE_AIR); bool corner6 = (get_hex(x, y + 1, z) != NULL && get_hex(x, y + 1, z)->type != BLOCK_TYPE_AIR); bool corner7 = (get_hex(x, y, z) != NULL && get_hex(x, y, z)->type != BLOCK_TYPE_AIR); //UE_LOG(LogTemp, Warning, TEXT("(%d, %d, %d): %d, %d, %d, %d, %d, %d, %d, %d"), x, y, z, corner0, corner1, corner2, corner3, corner4, corner5, corner6, corner7); FVector vertlist[12]; //bool isolevel = corner0 && corner1 && corner2 && corner3 && corner4 && corner5 && corner6 && corner7; //isolevel = false; float isolevel = 1; int cubeindex = 0; if (corner0) cubeindex |= 1; if (corner1) cubeindex |= 2; if (corner2) cubeindex |= 4; if (corner3) cubeindex |= 8; if (corner4) cubeindex |= 16; if (corner5) cubeindex |= 32; if (corner6) cubeindex |= 64; if (corner7) cubeindex |= 128; //UE_LOG(LogTemp, Warning, TEXT("%d, %d"), cubeindex, isolevel); /* Cube is entirely in/out of the surface */ if (edgeTable[cubeindex] == 0) continue; /* Find the vertices where the surface intersects the cube */ if (edgeTable[cubeindex] & 1) vertlist[0] = vertex_interp(corner_points[0], corner_points[1], corner0, corner1); if (edgeTable[cubeindex] & 2) vertlist[1] = vertex_interp(corner_points[1], corner_points[2], corner1, corner2); if (edgeTable[cubeindex] & 4) vertlist[2] = vertex_interp(corner_points[2], corner_points[3], corner2, corner3); if (edgeTable[cubeindex] & 8) vertlist[3] = vertex_interp(corner_points[3], corner_points[0], corner3, corner0); if (edgeTable[cubeindex] & 16) vertlist[4] = vertex_interp(corner_points[4], corner_points[5], corner4, corner5); if (edgeTable[cubeindex] & 32) vertlist[5] = vertex_interp(corner_points[5], corner_points[6], corner5, corner6); if (edgeTable[cubeindex] & 64) vertlist[6] = vertex_interp(corner_points[6], corner_points[7], corner6, corner7); if (edgeTable[cubeindex] & 128) vertlist[7] = vertex_interp(corner_points[7], corner_points[4], corner7, corner4); if (edgeTable[cubeindex] & 256) vertlist[8] = vertex_interp(corner_points[0], corner_points[4], corner0, corner4); if (edgeTable[cubeindex] & 512) vertlist[9] = vertex_interp(corner_points[1], corner_points[5], corner1, corner5); if (edgeTable[cubeindex] & 1024) vertlist[10] = vertex_interp(corner_points[2], corner_points[6], corner2, corner6); if (edgeTable[cubeindex] & 2048) vertlist[11] = vertex_interp(corner_points[3], corner_points[7], corner3, corner7); /* Create the triangle */ int ntriang = 0; FGeneratedMeshTriangle tri; for (int i = 0; triTable[cubeindex][i] != -1; i += 3) { tri.set_vertex(vertlist[triTable[cubeindex][i]] * 100.0f, 2); tri.set_vertex(vertlist[triTable[cubeindex][i + 1]] * 100.0f, 1); tri.set_vertex(vertlist[triTable[cubeindex][i + 2]] * 100.0f, 0); tri.Vertex0.X += x * 100.0f; tri.Vertex1.X += x * 100.0f; tri.Vertex2.X += x * 100.0f; tri.Vertex0.Y += y * 100.0f; tri.Vertex1.Y += y * 100.0f; tri.Vertex2.Y += y * 100.0f; tri.Vertex0.Z += z * 100.0f; tri.Vertex1.Z += z * 100.0f; tri.Vertex2.Z += z * 100.0f; chunk_triangles.Add(tri); //UE_LOG(LogTemp, Warning, TEXT("--tri--")); //UE_LOG(LogTemp, Warning, TEXT("%f, %f, %f"), tri.Vertex0.X, tri.Vertex0.Y, tri.Vertex0.Z); //UE_LOG(LogTemp, Warning, TEXT("%f, %f, %f"), tri.Vertex1.X, tri.Vertex1.Y, tri.Vertex1.Z); //UE_LOG(LogTemp, Warning, TEXT("%f, %f, %f"), tri.Vertex2.X, tri.Vertex2.Y, tri.Vertex2.Z); ntriang++; } } } } custom_mesh = NewObject<UGeneratedMeshComponent>(this); custom_mesh->RegisterComponent(); custom_mesh->SetGeneratedMeshTriangles(chunk_triangles); custom_mesh->SetMaterial(0, water_mat_asset); UE_LOG(LogTemp, Warning, TEXT("spawned")); }else { UE_LOG(LogTemp, Warning, TEXT("Could not find hexagon asset")); } }