Скелет функции анимации
This commit is contained in:
@@ -23,7 +23,9 @@
|
|||||||
"string_view": "c",
|
"string_view": "c",
|
||||||
"ranges": "c",
|
"ranges": "c",
|
||||||
"span": "c",
|
"span": "c",
|
||||||
"vector": "c"
|
"vector": "c",
|
||||||
|
"regex": "c",
|
||||||
|
"__node_handle": "c"
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ project(wayland)
|
|||||||
|
|
||||||
enable_language(ASM_NASM)
|
enable_language(ASM_NASM)
|
||||||
|
|
||||||
set(CMAKE_ASM_NASM_FLAGS "-f elf64")
|
set(CMAKE_ASM_NASM_FLAGS "-f elf64 -I${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
set(CMAKE_ASM_NASM_FLAGS_DEBUG "-gdwarf")
|
set(CMAKE_ASM_NASM_FLAGS_DEBUG "-gdwarf")
|
||||||
|
|
||||||
find_package(PkgConfig REQUIRED)
|
find_package(PkgConfig REQUIRED)
|
||||||
@@ -39,6 +39,19 @@ add_custom_command(
|
|||||||
# Цель для генерации протокола
|
# Цель для генерации протокола
|
||||||
add_custom_target(generate-xdg-shell DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/xdg-shell-client-protocol.h ${CMAKE_CURRENT_BINARY_DIR}/xdg-shell-client-protocol.c)
|
add_custom_target(generate-xdg-shell DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/xdg-shell-client-protocol.h ${CMAKE_CURRENT_BINARY_DIR}/xdg-shell-client-protocol.c)
|
||||||
|
|
||||||
|
# Генерируем offsets.inc
|
||||||
|
add_executable(generate-offsets ${CMAKE_CURRENT_SOURCE_DIR}/generate-offsets.c)
|
||||||
|
target_include_directories(generate-offsets PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/offsets.inc
|
||||||
|
COMMAND generate-offsets > ${CMAKE_CURRENT_BINARY_DIR}/offsets.inc
|
||||||
|
DEPENDS generate-offsets
|
||||||
|
COMMENT "Generating offsets.inc"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_target(generate-offsets-file DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/offsets.inc)
|
||||||
|
|
||||||
# Создаем исполняемый файл из ассемблерного, C и сгенерированного кода
|
# Создаем исполняемый файл из ассемблерного, C и сгенерированного кода
|
||||||
file(GLOB_RECURSE WAYLAND_SOURCES CONFIGURE_DEPENDS
|
file(GLOB_RECURSE WAYLAND_SOURCES CONFIGURE_DEPENDS
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/*.c"
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/*.c"
|
||||||
@@ -53,7 +66,7 @@ list(APPEND WAYLAND_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/xdg-shell-client-protoco
|
|||||||
add_executable(wayland ${WAYLAND_SOURCES})
|
add_executable(wayland ${WAYLAND_SOURCES})
|
||||||
|
|
||||||
# Ensure generated files are produced before building the target
|
# Ensure generated files are produced before building the target
|
||||||
add_dependencies(wayland generate-xdg-shell)
|
add_dependencies(wayland generate-xdg-shell generate-offsets-file)
|
||||||
|
|
||||||
# Include headers and binary dir where generated headers are written
|
# Include headers and binary dir where generated headers are written
|
||||||
target_include_directories(wayland PRIVATE
|
target_include_directories(wayland PRIVATE
|
||||||
|
|||||||
29
wayland/generate-offsets.c
Normal file
29
wayland/generate-offsets.c
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/* generate-offsets.c
|
||||||
|
* Генерирует offsets.inc с смещениями полей структур
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include "window.h"
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
printf("; offsets.inc — generated automatically\n");
|
||||||
|
|
||||||
|
// window_draw_info offsets
|
||||||
|
printf("WDI_DATA equ %zu\n", offsetof(struct window_draw_info, data));
|
||||||
|
printf("WDI_WIDTH equ %zu\n", offsetof(struct window_draw_info, width));
|
||||||
|
printf("WDI_HEIGHT equ %zu\n", offsetof(struct window_draw_info, height));
|
||||||
|
printf("WDI_FIGURE equ %zu\n", offsetof(struct window_draw_info, figure));
|
||||||
|
printf("WDI_FIGURE_MUTEX equ %zu\n", offsetof(struct window_draw_info, figure_mutex));
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
// figure_animation_info offsets
|
||||||
|
printf("FIG_TYPE equ %zu\n", offsetof(struct figure_animation_info, type));
|
||||||
|
printf("FIG_POSITION equ %zu\n", offsetof(struct figure_animation_info, position));
|
||||||
|
printf("FIG_VELOCITY equ %zu\n", offsetof(struct figure_animation_info, velocity));
|
||||||
|
printf("FIG_ANGLE equ %zu\n", offsetof(struct figure_animation_info, angle));
|
||||||
|
printf("FIG_ANG_VEL equ %zu\n", offsetof(struct figure_animation_info, angular_velocity));
|
||||||
|
printf("FIG_SPEED equ %zu\n", offsetof(struct figure_animation_info, speed));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -4,6 +4,6 @@
|
|||||||
#include "window.h"
|
#include "window.h"
|
||||||
|
|
||||||
/* Провести один шаг анимации на окне */
|
/* Провести один шаг анимации на окне */
|
||||||
void animation_step(struct window_draw_info* draw_info);
|
void figure_animation_step(struct window_draw_info* draw_info);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
; Подключаем автоматически сгенерированные offsets из C структур
|
||||||
|
%include "offsets.inc"
|
||||||
|
|
||||||
|
section .text
|
||||||
|
|
||||||
|
; void animation_step(struct window_draw_info* draw_info);
|
||||||
|
; Параметры:
|
||||||
|
; rdi - указатель на struct window_draw_info
|
||||||
|
global figure_animation_step
|
||||||
|
figure_animation_step:
|
||||||
|
enter 0, 0
|
||||||
|
|
||||||
|
; Сохранение регистров (если будут использоваться)
|
||||||
|
; push rbx
|
||||||
|
; push r12
|
||||||
|
; push r13
|
||||||
|
|
||||||
|
; rdi содержит указатель на window_draw_info
|
||||||
|
; Доступ к полям через константы из offsets.inc:
|
||||||
|
mov rax, WDI_FIGURE ; указатель на данные
|
||||||
|
; mov edx, [rdi + WD_WIDTH] ; ширина окна
|
||||||
|
; mov ecx, [rdi + WD_HEIGHT] ; высота окна
|
||||||
|
; lea rsi, [rdi + WD_FIGURE] ; указатель на figure_animation_info
|
||||||
|
;
|
||||||
|
; Доступ к полям figure_animation_info (относительно rsi):
|
||||||
|
; mov eax, [rsi + FIG_TYPE] ; тип фигуры
|
||||||
|
; movss xmm0, [rsi + FIG_ANGLE] ; угол поворота
|
||||||
|
; movss xmm1, [rsi + FIG_SPEED] ; скорость
|
||||||
|
|
||||||
|
; --- Здесь будет логика анимации ---
|
||||||
|
|
||||||
|
|
||||||
|
; Восстановление регистров
|
||||||
|
; pop r13
|
||||||
|
; pop r12
|
||||||
|
; pop rbx
|
||||||
|
|
||||||
|
leave
|
||||||
|
ret
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#include "registry.h"
|
#include "registry.h"
|
||||||
#include "wayland-runtime.h"
|
#include "wayland-runtime.h"
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
|
#include "figure-animate.h"
|
||||||
|
|
||||||
#define MAX_WINDOW_THREADS 128
|
#define MAX_WINDOW_THREADS 128
|
||||||
|
|
||||||
@@ -48,8 +49,9 @@ static void *window_aux_loop(void *arg)
|
|||||||
{
|
{
|
||||||
/* На время обновления позиции фигуры локаем мутекс */
|
/* На время обновления позиции фигуры локаем мутекс */
|
||||||
pthread_mutex_lock(&draw_info->figure_mutex);
|
pthread_mutex_lock(&draw_info->figure_mutex);
|
||||||
usleep(10 * 1000);
|
figure_animation_step(draw_info);
|
||||||
pthread_mutex_unlock(&draw_info->figure_mutex);
|
pthread_mutex_unlock(&draw_info->figure_mutex);
|
||||||
|
|
||||||
usleep(100 * 1000);
|
usleep(100 * 1000);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user