127 lines
2.9 KiB
C
127 lines
2.9 KiB
C
#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;
|
||
}
|