toys/sww/test/starfield.c

127 lines
2.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <math.h>
#include <stdio.h>
#include <stdlib.h> /**< rand qsort */
#include "sww/app.h"
#include "sww/color.h"
#include "sww/fps_helper.h"
#include "sww/rate_helper.h"
#include "sww/renderer.h"
#include "sww/texture.h"
#include "sww/util.h"
#include "sww/vmath.h"
#include "sww/window.h"
#define MAX_SCENE 2
#define TITLE "SWW Starfield"
typedef struct
{
int w;
int h;
int method;
swwRenderer* renderer;
} UserData;
void OnKey(swwWindow* o, swwKeycode key, int pressed)
{
if (pressed) {
if (key == swwKeycode_ESCAPE) {
swwApp_PostQuitEvent();
} else {
UserData* ud = swwWindow_GetUserData(o);
ud->method = (ud->method + 1) % MAX_SCENE;
}
}
}
void OnButton(swwWindow* o, swwButton btn, int pressed)
{
if (btn == swwButton_R && pressed) {
// Save to png file
UserData* ud = swwWindow_GetUserData(o);
uint32_t buf_size = swwUtil_PngBufferSize(ud->w, ud->h, 1);
uint8_t* buf = (uint8_t*)malloc(buf_size);
uint8_t* wbuf = swwRenderer_LockBuffer(ud->renderer);
FILE* fp = NULL;
swwUtil_SaveBufferToPngBuffer(buf, buf_size, wbuf, ud->w, ud->h, 1);
fp = fopen("output.png", "wb+");
fwrite(buf, 1, buf_size, fp);
fclose(fp);
free(buf);
}
}
void OnScroll(swwWindow* o, float offset)
{}
#define ROTATION_SPEED 0.015f
#define VIEW_DISTANCE 800.0f
#define ANTIALIASING 2 // 抗锯齿采样级别1为关闭
typedef struct
{
int ori_x; // 原始X坐标
float depth; // 深度值Z坐标
int screen_x; // 投影后屏幕X坐标
float scale; // 垂直缩放因子
} ColumnInfo;
typedef struct
{
float x, y, z;
} Star;
int main()
{
const uint32_t w = 512, h = 512;
uint32_t img_w, img_h;
int cw, ch;
swwWindowCallback callback = {OnKey, OnButton, OnScroll};
swwFpsHelper fps;
swwRateHelper rh;
swwApp_Initialize();
swwWindow* window = swwWindow_Create(TITLE, w, h);
UserData ud = {w, h, 0, NULL};
ud.renderer = swwRenderer_CreateAttachWindow(window, kSoftwareRenderer);
swwWindow_SetUserData(window, &ud);
swwWindow_SetCallback(window, &callback);
const int center_x = w / 2;
const int center_y = h / 2;
int i = 0;
swwRenderer_EnablePerfMonitor(ud.renderer, 1);
swwFpsHelper_Construct(&fps, 1.f);
swwRateHelper_Construct(&rh, 30.f);
while (!swwApp_ShouldExit()) {
swwRenderer_ClearBlack(ud.renderer);
switch (ud.method) {
case 0: {
} break;
case 1:
default: {
} break;
}
if (swwFpsHelper_Update(&fps, ud.renderer)) {
swwFpsHelper_SetTitleWithFps(&fps, window, TITLE);
}
swwRenderer_Present(ud.renderer);
swwApp_PollEvent();
swwRateHelper_Sleep(&rh);
}
swwRenderer_Destroy(ud.renderer);
swwWindow_Destroy(window);
swwApp_Cleanup();
return 0;
}