This commit is contained in:
Nishi 2026-01-30 23:07:23 +09:00
commit 97152d066c
Signed by: nishi
GPG key ID: 27EF69B208EB9343
9 changed files with 56 additions and 12 deletions

View file

@ -73,4 +73,5 @@ void main(void){
}
gl_FragColor = ambient * shadow_coef * c + (1.0 - ambient) * c;
gl_FragColor.a = vColor.a;
}

View file

@ -23,6 +23,7 @@ GSDECL void GSMathRowToColumn3x3(GSMatrix3x3 out, GSMatrix3x3 in);
GSDECL void GSMath3x3To4x4(GSMatrix4x4 out, GSMatrix3x3 in);
GSDECL GSNumber GSMathCot(GSNumber x);
GSDECL GSNumber GSMathClosestPOT(GSNumber x);
GSDECL GSNumber GSMathLength3(GSVector3 vec);
#define GSMathColumnToRow4x4 GSMathRowToColumn4x4
#define GSMathColumnToRow3x3 GSMathRowToColumn3x3

View file

@ -260,6 +260,10 @@ struct _GSSound {
GSSoundResetCallback reset;
GSSoundReadCallback read;
GSSoundCloseCallback close;
GSVector3 position;
GSBool is_3d;
GSNumber volume;
};
struct _GSSoundDriver {
@ -324,7 +328,7 @@ struct _GSClient {
int glyph_bold_height;
GSVector3 look_at;
GSVector3 camera;
GSVector3 position;
GSVector4 light0;
GSSkyBox skybox;
GSBool skybox_enabled;

View file

@ -36,9 +36,9 @@ GSClient GSClientCreate(GSEngine engine) {
client->engine = engine;
client->camera[0] = 0;
client->camera[1] = 1.5;
client->camera[2] = 5;
client->position[0] = 0;
client->position[1] = 1.5;
client->position[2] = 5;
client->look_at[0] = 0;
client->look_at[1] = 1;

View file

@ -25,7 +25,7 @@ void GSGLCameraPerspective(GSGL gl, GSNumber width, GSNumber height) {
}
void GSGLCameraSet(GSGL gl) {
GSGLCameraLookAt(gl, gl->engine->client->camera, gl->engine->client->look_at);
GSGLCameraLookAt(gl, gl->engine->client->position, gl->engine->client->look_at);
}
void GSGLCameraLookAt(GSGL gl, GSVector3 camera, GSVector3 look_at) {

View file

@ -15,7 +15,7 @@ GSNumber GSMathInner3(GSVector3 v0, GSVector3 v1) {
return r;
}
void GSMathNormalize3(GSVector3 vec) {
GSNumber GSMathLength3(GSVector3 vec) {
GSNumber l = 0;
int i;
@ -23,6 +23,12 @@ void GSMathNormalize3(GSVector3 vec) {
l = sqrt(l);
return l;
}
void GSMathNormalize3(GSVector3 vec) {
GSNumber l = GSMathLength3(vec);
if(l > 0) {
l = (GSNumber)1 / l;
} else {

View file

@ -48,8 +48,8 @@ static void parse_obj(GSModel model, char* txt) {
if(dm > v1) dm = v1;
if(um < v1) um = v1;
if(bm > v2) bm = v2;
if(fm < v2) fm = v2;
if(fm > v2) fm = v2;
if(bm < v2) bm = v2;
arrput(model->vertex, v0);
arrput(model->vertex, v1);
@ -71,7 +71,7 @@ static void parse_obj(GSModel model, char* txt) {
float sc = 0;
float lr = fabs(lm - rm);
float ud = fabs(um - dm);
float bf = fabs(bm - fm);
float bf = fabs(fm - bm);
if(sc < lr) sc = lr;
if(sc < ud) sc = ud;
@ -137,7 +137,7 @@ static void parse_obj(GSModel model, char* txt) {
if(arrlen(model->vertex) > varr[i] * 3) {
face.vertex[i][0] = (model->vertex[varr[i] * 3 + 0] - lm - lr / 2) / sc;
face.vertex[i][1] = (model->vertex[varr[i] * 3 + 1] - dm - ud / 2) / sc;
face.vertex[i][2] = -(model->vertex[varr[i] * 3 + 2] - bm - bf / 2) / sc;
face.vertex[i][2] = -(model->vertex[varr[i] * 3 + 2] - fm - bf / 2) / sc;
}
if(arrlen(model->texcoord) > tarr[i] * 2) {

View file

@ -22,6 +22,12 @@ GSSound GSSoundNew(GSSoundEngine sengine) {
sound->from_samplerate = 0;
sound->from_channel = 2;
sound->is_3d = 0;
sound->position[0] = 0;
sound->position[1] = 0;
sound->position[2] = 0;
sound->volume = 1.0;
ma_mutex_init(&sound->mutex);
GSSoundEngineLock(sengine);

View file

@ -3,6 +3,7 @@
#include <GearSrc/SoundDriver.h>
#include <GearSrc/Log.h>
#include <GearSrc/Sound.h>
#include <GearSrc/Math.h>
#include <miniaudio.h>
#include <stb_ds.h>
@ -37,7 +38,29 @@ static void read_callback(void* opaque, GSI16* out, int frame) {
memset(result, 0, sizeof(*result) * f * sengine->sound[i]->from_channel);
s = sengine->sound[i]->read(sengine->sound[i], result, f);
if(s > 0) {
int j;
int j;
GSNumber la = 1, ra = 1;
if(sengine->sound[i]->is_3d) {
GSNumber angle;
GSNumber v;
GSNumber d;
GSVector3 r;
GSNumber lf, rf;
GSMathSubtract3(r, sengine->sound[i]->position, sengine->engine->client->position);
angle = atan2(r[2], r[0]);
v = cos(angle);
lf = 1.0 - v;
rf = 1.0 + v;
d = GSMathLength3(r) / 4;
la = 1.0 / (1.0 + lf + d * d);
ra = 1.0 / (1.0 + rf + d * d);
}
if(sengine->sound[i]->from_samplerate > 0) {
ma_uint64 fin = f;
@ -62,7 +85,10 @@ static void read_callback(void* opaque, GSI16* out, int frame) {
ma_channel_converter_process_pcm_frames(&sengine->sound[i]->converter, result3, result2, frame);
}
for(j = 0; j < s * 2; j++) buffer[j] += (GSNumber)result3[j] / 32767;
for(j = 0; j < s * 2; j += 2) {
buffer[j + 0] += (GSNumber)result3[j + 0] / 32767 * la * sengine->sound[i]->volume;
buffer[j + 1] += (GSNumber)result3[j + 1] / 32767 * ra * sengine->sound[i]->volume;
}
if(result3 != result2) free(result3);
if(result2 != result) free(result2);