forked from StrafesNET/strafe-ai
Compare commits
5 Commits
png
...
print-inpu
| Author | SHA1 | Date | |
|---|---|---|---|
|
8d93fc528e
|
|||
|
f406f126ee
|
|||
|
ec73f62f89
|
|||
|
25bee24e4c
|
|||
|
93c01910cb
|
9
Cargo.lock
generated
9
Cargo.lock
generated
@@ -5451,7 +5451,6 @@ name = "strafe-ai"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"burn",
|
||||
"png",
|
||||
"pollster",
|
||||
"strafesnet_common",
|
||||
"strafesnet_graphics",
|
||||
@@ -5479,9 +5478,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "strafesnet_graphics"
|
||||
version = "0.0.11-depth"
|
||||
version = "0.0.11-depth2"
|
||||
source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/"
|
||||
checksum = "16266ca7e57ce802b7abd24c6cd8f9b8d95752f7eaead27e42b431b9768d6135"
|
||||
checksum = "829804ab9c167365e576de8ebd8a245ad979cb24558b086e693e840697d7956c"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
"ddsfile",
|
||||
@@ -5516,9 +5515,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "strafesnet_roblox_bot_player"
|
||||
version = "0.6.2-depth"
|
||||
version = "0.6.2-depth2"
|
||||
source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/"
|
||||
checksum = "12d1aa21c174f23f7f7ede583292a8c82e4b3c483fb0d950e58f84d52807f6ed"
|
||||
checksum = "f39e7dfc0cb23e482089dc7eac235ad4b274ccfdb8df7617889a90e64a1e247a"
|
||||
dependencies = [
|
||||
"glam",
|
||||
"strafesnet_common",
|
||||
|
||||
@@ -8,10 +8,9 @@ burn = { version = "0.20.1", features = ["cuda", "autodiff"] }
|
||||
wgpu = "29.0.0"
|
||||
|
||||
strafesnet_common = { version = "0.9.0", registry = "strafesnet" }
|
||||
strafesnet_graphics = { version = "=0.0.11-depth", registry = "strafesnet" }
|
||||
strafesnet_graphics = { version = "=0.0.11-depth2", registry = "strafesnet" }
|
||||
strafesnet_physics = { version = "=0.0.2-surf", registry = "strafesnet" }
|
||||
strafesnet_roblox_bot_file = { version = "0.9.4", registry = "strafesnet" }
|
||||
strafesnet_roblox_bot_player = { version = "=0.6.2-depth", registry = "strafesnet" }
|
||||
strafesnet_roblox_bot_player = { version = "=0.6.2-depth2", registry = "strafesnet" }
|
||||
strafesnet_snf = { version = "0.4.0", registry = "strafesnet" }
|
||||
pollster = "0.4.0"
|
||||
png = "0.18.1"
|
||||
|
||||
60
src/main.rs
60
src/main.rs
@@ -1,7 +1,7 @@
|
||||
use burn::backend::Autodiff;
|
||||
use burn::nn::loss::{MseLoss, Reduction};
|
||||
use burn::nn::{Linear, LinearConfig, Relu};
|
||||
use burn::optim::{GradientsParams, Optimizer, SgdConfig};
|
||||
use burn::optim::{GradientsParams, Optimizer, AdamConfig};
|
||||
use burn::prelude::*;
|
||||
|
||||
type InferenceBackend = burn::backend::Cuda<f32>;
|
||||
@@ -11,31 +11,11 @@ const LIMITS: wgpu::Limits = wgpu::Limits::defaults();
|
||||
use strafesnet_graphics::setup;
|
||||
use strafesnet_roblox_bot_file::v0;
|
||||
|
||||
pub fn output_image_native(image_data: &[u8], texture_dims: (usize, usize), path: String) {
|
||||
use std::io::Write;
|
||||
|
||||
let mut png_data = Vec::<u8>::with_capacity(image_data.len());
|
||||
let mut encoder =
|
||||
png::Encoder::new(&mut png_data, texture_dims.0 as u32, texture_dims.1 as u32);
|
||||
encoder.set_color(png::ColorType::Grayscale);
|
||||
let mut png_writer = encoder.write_header().unwrap();
|
||||
png_writer.write_image_data(image_data).unwrap();
|
||||
png_writer.finish().unwrap();
|
||||
|
||||
let mut file = std::fs::File::create(&path).unwrap();
|
||||
file.write_all(&png_data).unwrap();
|
||||
}
|
||||
|
||||
const SIZE_X: usize = 64;
|
||||
const SIZE_Y: usize = 36;
|
||||
const INPUT: usize = SIZE_X * SIZE_Y;
|
||||
const HIDDEN: [usize; 7] = [
|
||||
INPUT >> 1,
|
||||
INPUT >> 2,
|
||||
const HIDDEN: [usize; 2] = [
|
||||
INPUT >> 3,
|
||||
INPUT >> 4,
|
||||
INPUT >> 5,
|
||||
INPUT >> 6,
|
||||
INPUT >> 7,
|
||||
];
|
||||
// MoveForward
|
||||
@@ -104,6 +84,9 @@ fn training() {
|
||||
.unwrap();
|
||||
let timelines =
|
||||
strafesnet_roblox_bot_file::v0::read_all_to_block(std::io::Cursor::new(bot_file)).unwrap();
|
||||
let bot = strafesnet_roblox_bot_player::bot::CompleteBot::new(timelines).unwrap();
|
||||
let world_offset = bot.world_offset();
|
||||
let timelines = bot.timelines();
|
||||
|
||||
// setup graphics
|
||||
let desc = wgpu::InstanceDescriptor::new_without_display_handle_from_env();
|
||||
@@ -144,9 +127,7 @@ fn training() {
|
||||
mip_level_count: 1,
|
||||
sample_count: 1,
|
||||
dimension: wgpu::TextureDimension::D2,
|
||||
usage: wgpu::TextureUsages::RENDER_ATTACHMENT
|
||||
| wgpu::TextureUsages::TEXTURE_BINDING
|
||||
| wgpu::TextureUsages::COPY_SRC,
|
||||
usage: wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::TEXTURE_BINDING,
|
||||
view_formats: &[],
|
||||
});
|
||||
let graphics_texture_view = graphics_texture.create_view(&wgpu::TextureViewDescriptor {
|
||||
@@ -181,7 +162,7 @@ fn training() {
|
||||
let mut last_mx = first.event.mouse_pos.x;
|
||||
let mut last_my = first.event.mouse_pos.y;
|
||||
|
||||
for (i, input_event) in it.enumerate() {
|
||||
for input_event in it {
|
||||
let mouse_dx = input_event.event.mouse_pos.x - last_mx;
|
||||
let mouse_dy = input_event.event.mouse_pos.y - last_my;
|
||||
last_mx = input_event.event.mouse_pos.x;
|
||||
@@ -252,6 +233,9 @@ fn training() {
|
||||
fn a(a: v0::Vector3) -> [f32; 2] {
|
||||
[a.y, a.x]
|
||||
}
|
||||
fn sub<T: core::ops::Sub>(lhs: T, rhs: T) -> T::Output {
|
||||
lhs - rhs
|
||||
}
|
||||
|
||||
let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
|
||||
label: Some("wgpu encoder"),
|
||||
@@ -261,14 +245,14 @@ fn training() {
|
||||
graphics.encode_commands(
|
||||
&mut encoder,
|
||||
&graphics_texture_view,
|
||||
p(output_event.event.position).into(),
|
||||
sub(p(output_event.event.position).into(), world_offset),
|
||||
a(output_event.event.angles).into(),
|
||||
);
|
||||
|
||||
// copy the depth texture into ram
|
||||
encoder.copy_texture_to_buffer(
|
||||
wgpu::TexelCopyTextureInfo {
|
||||
texture: &graphics_texture,
|
||||
texture: graphics.depth_texture(),
|
||||
mip_level: 0,
|
||||
origin: wgpu::Origin3d::ZERO,
|
||||
aspect: wgpu::TextureAspect::All,
|
||||
@@ -305,28 +289,18 @@ fn training() {
|
||||
}
|
||||
output_staging_buffer.unmap();
|
||||
|
||||
println!("{texture_data:?}");
|
||||
|
||||
let inputs_start = inputs.len();
|
||||
// discombolulate stride
|
||||
for y in 0..size.y {
|
||||
inputs.extend(
|
||||
texture_data[(stride_size * y) as usize
|
||||
..(stride_size * y + size.x * size_of::<f32>() as u32) as usize]
|
||||
.chunks_exact(4)
|
||||
.map(|b| b[0] as f32 + b[1] as f32 + b[2] as f32),
|
||||
.map(|b| f32::from_le_bytes(b.try_into().unwrap())),
|
||||
)
|
||||
}
|
||||
|
||||
// write a png
|
||||
output_image_native(
|
||||
&inputs[i * INPUT..(i + 1) * INPUT]
|
||||
.iter()
|
||||
.copied()
|
||||
.map(|f| (f * 255.0) as u8)
|
||||
.collect::<Vec<u8>>(),
|
||||
(SIZE_X, SIZE_Y),
|
||||
format!("depth_images/{i}.png").into(),
|
||||
);
|
||||
let inputs_end = inputs.len();
|
||||
println!("inputs = {:?}", &inputs[inputs_start..inputs_end]);
|
||||
|
||||
texture_data.clear();
|
||||
}
|
||||
@@ -336,7 +310,7 @@ fn training() {
|
||||
let mut model: Net<TrainingBackend> = Net::init(&device);
|
||||
println!("Training model ({} parameters)", model.num_params());
|
||||
|
||||
let mut optim = SgdConfig::new().init();
|
||||
let mut optim = AdamConfig::new().init();
|
||||
|
||||
let inputs = Tensor::from_data(
|
||||
TensorData::new(
|
||||
|
||||
Reference in New Issue
Block a user