librain icon indicating copy to clipboard operation
librain copied to clipboard

please add a new example code

Open subabrain opened this issue 2 years ago • 4 comments

Hi together,

please mr. kiselkov update the example from your librain plugin. Its not working with the newest source code you provide on github!

if possible please make a new release of compiled .xpl version from your code - so everybody can use the new version including "vulkan".

PLEASE HELP HERE!

Greets Robert

subabrain avatar Mar 17 '22 13:03 subabrain

Okay ... i got now the librain 0.12 version to run ...

I will do a librain generator now - so everybody can use librain in his own aircraft :)

Greets Robert

subabrain avatar Mar 28 '22 09:03 subabrain

Okay - this should do the job :)

#include "librain.h"
#include "obj8.h"
#include "XPLMDisplay.h"
#include "XPLMGraphics.h"
#include "XPLMUtilities.h"
#include <string.h>
#include <math.h>

#if IBM
# include <windows.h>
#endif
#if LIN
# include <GL/gl.h>
#elif __GNUC__
# include <OpenGL/gl.h>
#else
# include <GL/gl.h>
#endif
#include <XPLMProcessing.h>

#ifndef XPLM300
# error This is made to be compiled against the XPLM300 SDK
#endif

static const char* windShieldObjPath = "path/to/windshield.obj";
static const vect3_t pos_offset = { 0, 0, 0 };

static const char* shaderDir = "path/to/shaders_dir";

static const vect2_t wiper1_pivot = { 0.4, 0.2 };
static const vect2_t wiper2_pivot = { 0.6, 0.2 };

static const vect2_t tp = { 0.5, -0.3 };
static const vect2_t gp = { 0.5, 1.3 };
static const vect2_t wp = { 1.5, 0.5 };

static librain_glass_t windShield = {
	.slant_factor = 1.0,
	.thrust_point = tp,
	.gravity_point = gp,
	.gravity_factor = 0.5,
	.wind_point = wp,
	.wind_factor = 1.0,
	.wind_normal = 1.0,
	.max_tas = 100.0,
	.therm_inertia = 20.0,
	.cabin_temp = 22.0,
	.wiper_pivot = { wiper1_pivot, wiper2_pivot },
	.wiper_radius_outer = { 0.4, 0.4 },
	.wiper_radius_inner = { 0.05, 0.05 },
};

static librain_glass_t glassElementsArray[1] = { windShield };

static double wiper_angle[2] = { 0, 0 };

static double wiper_ang_vel[2] = { -M_PI * 0.8, M_PI * 0.4 };

/*
 * Wiper edge positions. Wiper [0] goes _| and wiper [1] goes |_
 */
static const double wiper_edge[2][2] = {
	{	-M_PI / 2,	0		},
	{	0,		M_PI / 2	}
};


/* We'll be animating the wipers in this flight loop callback. */
static float wiper_floop(float delta_t, float time2, int counter, void* refcon);


static int draw_rain_effects(
	XPLMDrawingPhase inPhase,
	int              inIsBefore,
	void* inRefcon)
{
	librain_draw_prepare(FALSE);
	/* Load these OBJs using obj8_parse as necessary */
	//librain_draw_z_depth(compassObj, NULL);
	//librain_draw_z_depth(fuselageObj, NULL);
	librain_draw_exec();
	librain_draw_finish();
	return 1;
}

PLUGIN_API int XPluginStart(
	char* outName,
	char* outSig,
	char* outDesc)
{
	strcpy(outName, "HelloWorld3RainPlugin");
	strcpy(outSig, "librain.hello.world");
	strcpy(outDesc, "A Hello World plug-in for librain");

	/*
	 * Load our windshield object. You will also want to load
	 * any additional objects used for z-buffer filling.
	 */
	glassElementsArray[0].obj = obj8_parse(windShieldObjPath, pos_offset);
	if (glassElementsArray[0].obj == NULL) {
		XPLMDebugString("Oh noes, failed to load the windshield OBJ!");
		librain_fini();
		return (0);
	}

	/* Once we have loaded all OBJs, initialize the glass structures. */
	if (!librain_init(shaderDir, glassElementsArray, 1)) {
		XPLMDebugString("Oh noes, failed to initialize librain!");
		return (0);
	}
	/*
	 * Turn on debug drawing. This makes all z-buffer drawing
	 * visible to verify it's working right. When you are satisfied
	 * it is working as intended, remove this line.
	 */
	librain_set_debug_draw(TRUE);

	librain_set_wipers_visible(TRUE);
	/*
	 * Register the animation callback. Execute every flight loop.
	 */
	XPLMRegisterFlightLoopCallback(wiper_floop, -1, NULL);

	XPLMRegisterDrawCallback(draw_rain_effects, xplm_Phase_LastScene,
		0, NULL);

	return (1);
}

PLUGIN_API void XPluginStop(void)
{
	librain_fini();
	XPLMUnregisterDrawCallback(draw_rain_effects, xplm_Phase_LastScene,
		0, NULL);

	XPLMUnregisterFlightLoopCallback(wiper_floop, NULL);

}

static float wiper_floop(float delta_t, float time2, int counter, void* refcon)
{
	for (int i = 0; i < 2; i++) {
		wiper_angle[i] += wiper_ang_vel[i] * delta_t;

		/* Wiper hit edge of movement? Reverse direction. */
		if (wiper_angle[i] < wiper_edge[i][0]) {
			wiper_ang_vel[i] = -wiper_ang_vel[i];
			wiper_angle[i] = wiper_edge[i][0];
		}
		else if (wiper_angle[i] > wiper_edge[i][1]) {
			wiper_ang_vel[i] = -wiper_ang_vel[i];
				wiper_angle[i] = wiper_edge[i][1];
		}
		/*
		 * Even if the wiper is not moving, you MUST call this function
		 * with the angle unchanged and the last element set to FALSE.
		 * Otherwise the animation is not going to look right when the
		 * wipers are stopped.
		 */
		librain_set_wiper_angle(&glassElementsArray[0], i,
			wiper_angle[i], TRUE);
	}
	/* This needs to execute every flight loop. */
	return (-1.0);
}

PLUGIN_API void XPluginDisable(void)
{
}

PLUGIN_API int XPluginEnable(void)
{
	return 1;
}

PLUGIN_API void XPluginReceiveMessage(XPLMPluginID inFrom, int inMsg,
	void* inParam)
{
}

subabrain avatar Apr 23 '22 10:04 subabrain

if you get compiled - just put this result and the rain.dll into the plugins folder of your aircraft in XPlane 11 :)

subabrain avatar Apr 23 '22 11:04 subabrain

Greetings Thank you very much! Please tell me where to insert this code? Will it be interesting to work on the ixeg737 with the raindrop effect?

jenijek avatar Jun 27 '22 04:06 jenijek