Example #1
0
/* =============================================================================
 * 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;
}
Example #2
0
/* =============================================================================
 * 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"));
    }
}